目录
一、实验任务
二、通过Timer定时器,设置一个5秒的定时器,每隔5秒从串口发送“hello windows!”;同时设置一个2秒的定时器,让LED灯周期性地闪烁
1、 STM32CubeMX工程创建
2、环境配置
RCC
SYS
端口输出
Timers
NVIC(中断)
USART1
Clock Configuration
Project Manager
3、Keli编译
4电路连接、软件烧录
连接
代码烧录
5、演示
三、使用TIM3和TIM4,分别输出一个PWM波形实现2个 LED呼吸灯的效果
1、 STM32CubeMX工程创建
2、环境配置
RCC
SYS
TIM3
TIM4
Clock Configuration
Project Manager
3、Keli编译
4、电路连接、软件烧录
5、实物展示
四、总结
五、参考资料
1. 之前作业中的延时功能都是通过循环、delay/Hal_delay函数等实现,本次作业通过定时器Timer方式实现时间的精准控制,相当于给CPU上了一个闹钟,CPU平时处理其它任务,当定时时间到了以后,处理定时相关的任务。请设置一个5秒的定时器,每隔5秒从串口发送“hello windows!”;同时设置一个2秒的定时器,让LED等周期性地闪烁。参考: STM32CUBEMX_定时器控制LED闪烁 | MCU起航
2. 使用TIM3和TIM4,分别输出一个PWM波形,PWM的占空比随时间变化,去驱动你外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LED呼吸灯的效果。
打开 STM32CubeMX
点击ACCEE TO MCU SELECTOR
选择STM32F103C8芯片
点击start project
如图
System Cor界面中的RCC
设置HSE为Crystal
Debug设置为serial wire
PA5作为LED灯的输出
使用tim1 tim3完成定时功能
将tim1设为内置时钟
分频系数为71,向上计数模式,计数周期为5000
开启定时器的中断
Mode选择异步通信Asynchronous
如图设置即可
如图设置名称
找到刚刚生成的工程文件
使用keli打开工程
在main.c目录下
添加定时启动代码
HAL_TIM_Base_Start_IT(&htim1);
HAL_TIM_Base_Start_IT(&htim3);
串口输出代码
uint8_t hello[20]="Hello Windows!\r\n";
中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static uint32_t time_cnt =0;
static uint32_t time_cnt3 =0;
if(htim->Instance == TIM1)
{
if(++time_cnt >= 400)
{
time_cnt =0;
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
}
}
if(htim->Instance == TIM3)
{
if(++time_cnt3 >= 1000)
{
time_cnt3 =0;
HAL_UART_Transmit(&huart1,hello,20,100000);
}
}
}
编译生成hex文件
首先,打开烧录软件mcuisp,将USB-TTL串口接入电脑,点击搜索串口即可看到接入的USB串口,然后将传输速率设置115200bit/s;
接下来,找到刚刚在keil中生成的HEX文件,点击“读器件信息”,右侧状态栏里显示一切正常后,就可以点击“开始编程”进行烧录了;
打开 STM32CubeMX
点击ACCEE TO MCU SELECTOR
选择STM32F103C8芯片
点击start project
如图
System Cor界面中的RCC
设置HSE为Crystal
Debug设置为serial wire
勾选Internal Clock)
PWM Generation CH1
Prtscaler : 71
Counter Mode:Up
Counter Period : 500
CKD :No Division
如图
与TIM3相似
如图设置即可
如图设置名称
生成工程文件(GENERATE CODE)即可
找到刚刚生成的工程文件
使用keli打开工程
在main.c文件添加变量
uint16_t pwm=0;
开启TIM3和TIM4的PWM的通道1
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1);
循环中写入调用代码
while (pwm< 500)
{
pwm++;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwm);
__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, pwm);
HAL_Delay(1);
}
while (pwm)
{
pwm--;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwm);
__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, pwm);
HAL_Delay(1);
}
HAL_Delay(200);
编译生成hex文件
同上
通过本次实训,使我认识到了PWM在嵌入式学习中所起到至关重要的作用
由于对于STM32引脚的不熟悉,导致实验过程中出现了多次失误
总体来说是一次很不错的实验过程,在实践的过程中学习了PWM的相关知识,加深了对STM32的理解
STM32-时钟系统详解_KevinFlyn的博客-CSDN博客_讲一下stm32的时钟系统
8、【STM32】定时器(TIM)——中断、PWM、输入捕获实验(一文精通定时器)_追逐者-桥的博客-CSDN博客
STM32TIM定时器输出比较——PWM实现呼吸灯_小白今天也很酷的博客-CSDN博客