基于STM32F103C8输入输入实验目的
该项目是在训练时做的一个基于STM32+CUBEMX工具读取温度计输出的PWM波的实验,使用到了定时器读取输入任务和UART输出到串口,最终实现实现数据到的输出。
使用的工具与设备
1.STM32F103C8芯片
2.ST-LINK下载器-用于烧写下载
3.USB串口烧录器-用于串口输出信号到PC
4.(测试)信号反应
5.温度计(输出) PWM方波)
实现流程与原理
0}#mermaid-svg-rvRp2VUBw4Gf5BAc .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-rvRp2VUBw4Gf5BAc .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-rvRp2VUBw4Gfmark5 :#333}#mermaid-svg-rvRp2VUBw4Gf5BAc .marker.cross{stroke:#333} :root { --mermaid-font-family: “trebuchet ms”, verdana, arial;} #mermaid-svg-rvRp2VUBw4Gf5BAc { color rgba(0, 0, 0, 0.75); 字体:} 定时器 2}#mermaid-svg-rvRp2VUBw4Gf5BAc .marker{fill:#333}#mermaid-svg-rvRp2VUBw4Gf5BAc .marker.cross{stroke:#333} :root { --mermaid-font-family: “trebuchet ms”, verdana arial;} #mermaid-svg-rvRp2VUBw4Gf5BAc { 颜色:rgba(0, 0, 0, 0.75); 字体:} 定时器 2}#mermaid-svg-rvRp2VUBw4Gf5BAc .marker{fill:#333}#mermaid-svg-rvRp2VUBw4Gf5BAc .marker.cross{stroke:#333} :root { --mermaid-font-family: “trebuchet ms”, verdana arial;} #mermaid-svg-rvRp2VUBw4Gf5BAc { 颜色:rgba(0, 0, 0, 0.75); 字体:} 定时器
硬件
捕获
UART
输出占空比
使用UART输出到串口监视器:1.CUBE打开UART引脚2.修改的printf函数的输出PWM输入捕获:1.CUBE打开添计时器2.根据捕获原理编写代码3.溢出、功能中断处理 4.通过printf函数输出功能输出值 功能
链接:原理原理
CUBE部分
点击ACCESS TO MCU SELECTOR选择芯片
打开CUBE,搜索并选择芯片STM32F103C8
选择System Core-》SYS-》Debug-》Serial Wire 打开串口线
选择System Core-》RCC-》High Speed Check-》Crystal/Ceramic Resonator 外部晶振
选择定时器-TIM2(行)-》时钟源-》内部时钟(内部时钟)
选择Channel1-》输入捕捉直接模式(输入模式)
打开中断TIM2全局中断
PS:注意右上方A0位置绿色同时TIM2_CHI为一键一打开
选择Connectivity-》USART1-》Mode-》Asynchronous(异步通信)
中断看需求选择
在Clock ConfigurationClock Configuration选择HCLK为72MHz
ps:这里HCLK如果为64MHz或者不到最大可能是因为没有把之前的Crystal/Ceramic Resonator 外部晶振打开
在项目经理中填写项目名称 保存位置 选择IDE以及版本
在代码生成器或选中
最后一个生成代码 GENERATE CODE
Keil代码部分
串口输出
=
在mian.c中找到并添加
方法一、
/* USER CODE BEGIN Includes */
#include 《stdio.h》
#ifdef __GNUC__
/* With GCC, small printf (option LD Linker-》Libraries-》Small printf set to ‘Yes’) calls __io_putchar() * /
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
/* __GNUC__ */ PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFF 返回 ch;
}
/* USER CODE END Includes */
方法二、
/* USER CODE BEGIN Includes */
#include 《string.h》
#include 《stdio.h》
uint8_t u_buf[64];
//定义的数组,保存数据
#define printf(。..)
HAL_UART_Transmit(UART_HandleTypeDef *)&huart1, (uint8_t *)u_buf,sprintf((char*)u_buf,__VA_ARGS__), 0xFFFF);
/* 用户代码结束包括 */
有些代码的目的是生成printf函数的输入
输入输入
=
/* USER CODE BEGIN 0 */ int8_t TIM2CH1_CAPTURE_UP_STA=0; //输入高饱和状态 作识别使用 低六位作为消费判断 如:0x111111(3F) int_t TIM2CH1_CAPTURE_DOWNSTA=0; //输入高饱和状态作识别使用低六位作为消费判断 int16_t TIM2CH1_CAPTURE_UP_VAL;//输入高数据数据值T21_CAPTURE_VAL//输入低值值DOWN /* USERCH END * 0/
部分有高低血糖参数
作为价值和状态位四个参数4_CAPTURE_DOWN_STA例子
如上表所示TIM2CH1_CAPTURE_DOWN_STA的值为0xFF
这里的6、7
位为高位表达表达当前状态例如第7位为1 则TIM2CH1_CAPTURE_DOWN_STA = 0x80
第6位为1则TIM2CH1_CAPTURE_DOWN_STA = 0x400-5
位为低六位而0-5位为低六位
知识繁殖这个最大的次数为0x3F会在代码里秘籍
在主程序头添加代码
/* USERCODE BEGIN 2 */
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
//启动启动__HAL_TIM_ENABLE_(&htim2, TIM_IT_UPDATE);
//使能停止更新int16_t up=0;
//高数据下宽=0;
//周期doublety_Cycle//高宽比与生命周期的占空比
/*USERCODE END 2/
while循环内添加以下功能
/* 用户代码开始时 */ while (1)
{
HAL_Delay(1);
if(TIM2CH1_CAPTURE_UP_STA&X80)/
/成功到了一次高数据
{
up=TIM2CH1_CAPTURE_UP_STA&0X3F;
上*=65535;
//注意力时间总和向上+=TIM2CH1_CAPTURE_UP_VAL;
//得到总的高盐时间 up/=0.9845;
//高盐时间值TIM2CH1_CAPTURE_UP_STA=0;
//清空输入高负载状态
}
if(TIM2CH1CAPTURE_DOWN_STA0&X80)//成功输入了一次低数据
{
down=TIM2CH1_CAPTURE_DOWNSTA&0X3F;
向下*=65535;
//时间总和和down+=TIM2CH1_CAPTURE_DOWN_VAL;
//得到总的低盐时间下降/= 0.99225;
//周期偏差值TIM2CH1_CAPTURE_DOWNSTA=0;
//清空输入低血压状态
}
printf(“up = %dtn”,);
printf(“down = %dtn”,down);
Duty_Cycle = (double)up /(double)down;
//由于原因不需格式转换 if(Duty_Cycle != 0)
{
printf(“占空比:%.4lf °Crn”,((double)上/(双)下))
;
}
HAL_Delay(500);
}
/* 用户代码结束 */
溢出中断函数↓
捕获中断函数↓
输出与验证
使用信号信号发生占空比为0.5的方波
连接PA0(TIM2),另一端接信号的红线
信号电位黑线
接地USB接口连接STM32的P9(TX)P10(RX)端
信号自然数值设定为4KHz 高3.3V占空比为55%
成功输出占空例如下图所示
PS:我们已知设定的频率为4KHz,频率为72MHz 4KHz,占0.5
那么高空时间比值为:72x06/4x103x0.5 =9x103 Hz
与实际输出值相同
基于STM32F103C8输入输入实验目的
该项目是在训练时做的一个基于STM32+CUBEMX工具读取温度计输出的PWM波的实验,使用到了定时器读取输入任务和UART输出到串口,最终实现实现数据到的输出。
使用的工具与设备
1.STM32F103C8芯片
2.ST-LINK下载器-用于烧写下载
3.USB串口烧录器-用于串口输出信号到PC
4.(测试)信号反应
5.温度计(输出) PWM方波)
实现流程与原理
0}#mermaid-svg-rvRp2VUBw4Gf5BAc .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-rvRp2VUBw4Gf5BAc .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-rvRp2VUBw4Gfmark5 :#333}#mermaid-svg-rvRp2VUBw4Gf5BAc .marker.cross{stroke:#333} :root { --mermaid-font-family: “trebuchet ms”, verdana, arial;} #mermaid-svg-rvRp2VUBw4Gf5BAc { color rgba(0, 0, 0, 0.75); 字体:} 定时器 2}#mermaid-svg-rvRp2VUBw4Gf5BAc .marker{fill:#333}#mermaid-svg-rvRp2VUBw4Gf5BAc .marker.cross{stroke:#333} :root { --mermaid-font-family: “trebuchet ms”, verdana arial;} #mermaid-svg-rvRp2VUBw4Gf5BAc { 颜色:rgba(0, 0, 0, 0.75); 字体:} 定时器 2}#mermaid-svg-rvRp2VUBw4Gf5BAc .marker{fill:#333}#mermaid-svg-rvRp2VUBw4Gf5BAc .marker.cross{stroke:#333} :root { --mermaid-font-family: “trebuchet ms”, verdana arial;} #mermaid-svg-rvRp2VUBw4Gf5BAc { 颜色:rgba(0, 0, 0, 0.75); 字体:} 定时器
硬件
捕获
UART
输出占空比
使用UART输出到串口监视器:1.CUBE打开UART引脚2.修改的printf函数的输出PWM输入捕获:1.CUBE打开添计时器2.根据捕获原理编写代码3.溢出、功能中断处理 4.通过printf函数输出功能输出值 功能
链接:原理原理
CUBE部分
点击ACCESS TO MCU SELECTOR选择芯片
打开CUBE,搜索并选择芯片STM32F103C8
选择System Core-》SYS-》Debug-》Serial Wire 打开串口线
选择System Core-》RCC-》High Speed Check-》Crystal/Ceramic Resonator 外部晶振
选择定时器-TIM2(行)-》时钟源-》内部时钟(内部时钟)
选择Channel1-》输入捕捉直接模式(输入模式)
打开中断TIM2全局中断
PS:注意右上方A0位置绿色同时TIM2_CHI为一键一打开
选择Connectivity-》USART1-》Mode-》Asynchronous(异步通信)
中断看需求选择
在Clock ConfigurationClock Configuration选择HCLK为72MHz
ps:这里HCLK如果为64MHz或者不到最大可能是因为没有把之前的Crystal/Ceramic Resonator 外部晶振打开
在项目经理中填写项目名称 保存位置 选择IDE以及版本
在代码生成器或选中
最后一个生成代码 GENERATE CODE
Keil代码部分
串口输出
=
在mian.c中找到并添加
方法一、
/* USER CODE BEGIN Includes */
#include 《stdio.h》
#ifdef __GNUC__
/* With GCC, small printf (option LD Linker-》Libraries-》Small printf set to ‘Yes’) calls __io_putchar() * /
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
/* __GNUC__ */ PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFF 返回 ch;
}
/* USER CODE END Includes */
方法二、
/* USER CODE BEGIN Includes */
#include 《string.h》
#include 《stdio.h》
uint8_t u_buf[64];
//定义的数组,保存数据
#define printf(。..)
HAL_UART_Transmit(UART_HandleTypeDef *)&huart1, (uint8_t *)u_buf,sprintf((char*)u_buf,__VA_ARGS__), 0xFFFF);
/* 用户代码结束包括 */
有些代码的目的是生成printf函数的输入
输入输入
=
/* USER CODE BEGIN 0 */ int8_t TIM2CH1_CAPTURE_UP_STA=0; //输入高饱和状态 作识别使用 低六位作为消费判断 如:0x111111(3F) int_t TIM2CH1_CAPTURE_DOWNSTA=0; //输入高饱和状态作识别使用低六位作为消费判断 int16_t TIM2CH1_CAPTURE_UP_VAL;//输入高数据数据值T21_CAPTURE_VAL//输入低值值DOWN /* USERCH END * 0/
部分有高低血糖参数
作为价值和状态位四个参数4_CAPTURE_DOWN_STA例子
如上表所示TIM2CH1_CAPTURE_DOWN_STA的值为0xFF
这里的6、7
位为高位表达表达当前状态例如第7位为1 则TIM2CH1_CAPTURE_DOWN_STA = 0x80
第6位为1则TIM2CH1_CAPTURE_DOWN_STA = 0x400-5
位为低六位而0-5位为低六位
知识繁殖这个最大的次数为0x3F会在代码里秘籍
在主程序头添加代码
/* USERCODE BEGIN 2 */
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
//启动启动__HAL_TIM_ENABLE_(&htim2, TIM_IT_UPDATE);
//使能停止更新int16_t up=0;
//高数据下宽=0;
//周期doublety_Cycle//高宽比与生命周期的占空比
/*USERCODE END 2/
while循环内添加以下功能
/* 用户代码开始时 */ while (1)
{
HAL_Delay(1);
if(TIM2CH1_CAPTURE_UP_STA&X80)/
/成功到了一次高数据
{
up=TIM2CH1_CAPTURE_UP_STA&0X3F;
上*=65535;
//注意力时间总和向上+=TIM2CH1_CAPTURE_UP_VAL;
//得到总的高盐时间 up/=0.9845;
//高盐时间值TIM2CH1_CAPTURE_UP_STA=0;
//清空输入高负载状态
}
if(TIM2CH1CAPTURE_DOWN_STA0&X80)//成功输入了一次低数据
{
down=TIM2CH1_CAPTURE_DOWNSTA&0X3F;
向下*=65535;
//时间总和和down+=TIM2CH1_CAPTURE_DOWN_VAL;
//得到总的低盐时间下降/= 0.99225;
//周期偏差值TIM2CH1_CAPTURE_DOWNSTA=0;
//清空输入低血压状态
}
printf(“up = %dtn”,);
printf(“down = %dtn”,down);
Duty_Cycle = (double)up /(double)down;
//由于原因不需格式转换 if(Duty_Cycle != 0)
{
printf(“占空比:%.4lf °Crn”,((double)上/(双)下))
;
}
HAL_Delay(500);
}
/* 用户代码结束 */
溢出中断函数↓
捕获中断函数↓
输出与验证
使用信号信号发生占空比为0.5的方波
连接PA0(TIM2),另一端接信号的红线
信号电位黑线
接地USB接口连接STM32的P9(TX)P10(RX)端
信号自然数值设定为4KHz 高3.3V占空比为55%
成功输出占空例如下图所示
PS:我们已知设定的频率为4KHz,频率为72MHz 4KHz,占0.5
那么高空时间比值为:72x06/4x103x0.5 =9x103 Hz
与实际输出值相同
举报