
📑通过STM32CubeMX配置定时器
1和定时器3分别作为两个led的定时闹钟。这里作为演示,当然使用一个定时器,通过轮询方式,实现多个led不定长时间闪烁也是可以的。

htim1.Instance = TIM1;
htim1.Init.Prescaler = 64-1;//预分频
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 1000-1;//1ms = 64/(64-1)/1000
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
🔖如果想直接定时1S,那么配置参数代码如下:
htim1.Instance = TIM1;
htim1.Init.Prescaler = 6399;//预分频
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 9999;
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;


🍁在main.c中,相应位置添加如下代码:
#include //用于调用printf函数打印,需要在target选项中勾选‘Use MicroLib’
#define led_shine_time 1000 //定时时长
#define led_shine_time2 1000
uint16_t cnt1,cnt2;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM1) //处理TIM1间隔定时中断
{
cnt1++;
if(cnt1 == led_shine_time)
{
cnt1 = 0;
printf("cnt1 \n");//1s打印一次
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);
}
}
if(htim->Instance == TIM3) //处理TIM3间隔定时中断
{
cnt2++;//1s打印一次
if(cnt2 == led_shine_time2)
{
cnt2 = 0;
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);
printf("cnt2 \n");
}
}
}
usart.c文件中添加如下内容:#include "stdio.h"
/*可调用printf*/
int fputc(int ch,FILE *f)
{
/*&huart1指的是串口1,如果用别的串口就修改数字*/
HAL_UART_Transmit(&huart1 , (uint8_t *)&ch , 1 , 0xffff);
return ch;
}

链接:https://pan.baidu.com/s/1UTPwtcE5xfC4EbIya-DRDA
提取码:e5ez