CubeMx 定时器硬件中断
stm32f10x定时器
stm32的定时器资源还是相当丰富的,连最基础的stm32f103c8t6都有四个定时器,更高级的zet6,或者f4系列的有十几个定时器,相比arduino来说强大了太多,利用好了可以实现确定时间间隔的做某件事情,多个定时器中断可以用来做多件事情,不使用延时也能够将程序实现,而且更快,更灵敏。
Black Pill
定时器资源概览
stm32f103c8t6一共有四个定时器,每个定时器都可以用来作为定时器中断模式,也可以以将定时器配置成PWM输出模式,一个定时器可以同时输出四路不同的PWM波
cubemx配置
选择芯片过程不再赘述
RCC: HSE高速总线始终改为外部晶振 SYS: DEBUG选择 SW模式 TIMER: Clock Source 选择 internal Clock 内部时钟源
Parameter Settings: 配置分频72分频,因为主频为72MHZ,这样分了之后定时器的工作频率就是1MHZ,计数模式向上计数,计数次数为 1000 ,这里的意思就是 定时器1MHZ的频率工作,工作1000个周期触发一次中断,这样 定时器中断的频率应该为 1000HZ,也就是1/1000 s = 1ms触发一次
时钟树配置
工程配置 IDE选择 MDK V5
第一栏里选择复制必要的库文件 第二栏里勾选将文件分为.c和.h
最后点击生成文件
注意 !
工程路径绝对不能有中文名,否则会报错,无法复制stm32的库文件到你的工程
添加函数
打开生成的文件,在main.c中初始化的时候开启中断
HAL_TIM_Base_Start_IT(&htim1); //开启定时器
在下面,或者自己创建一个.c文件 include tim.h ,调用下面的回调函数,这个是hal库公用定时器中断回调函数,定时器1会在这里面以1ms一次的频率循环
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM1)
{
//编写用户函数,1ms执行一次
}
}
如果要停用定时器则使用这个函数
HAL_TIM_Base_Stop_IT(&htim1); //停止定时器
定时器中断里面的函数绝对不要有延时,时间控制可以使用累加器来做比如说下面这样,循环体里的函数时间为1s一次
int counter = 0 ;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==(&htim1))
{
counter++;
if(counter == 1000)
{
counter = 0;
//这里的循环频率为1S
}
}
}