STM32CUBEMX F103 HAL库开发之 定时器中断多任务

stm32定时器简介

stm32的定时器资源还是相当丰富的,连最基础的stm32f103c8t6都有四个定时器,更高级的zet6,或者f4系列的有十几个定时器,相比arduino来说强大了太多,利用好了可以实现确定时间间隔的做某件事情,多个定时器中断可以用来做多件事情,不使用延时也能够将程序实现,而且更快,更灵敏。

STM32F103C8T6 - Black Pill 定时器资源

STM32F103C8T6 - 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
project
第一栏里选择复制必要的库文件 第二栏里勾选将文件分为.c和.h
codegen
最后点击生成文件

注意 !

工程路径绝对不能有中文名,否则会报错,无法复制stm32的库文件到你的工程

keil中添加处理函数

打开生成的文件,在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
        }
    }
}
  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用STM32F103HAL中的定时器中断时,可以通过以下步骤来设置中断回调函数: 1. 首先,需要在CubeMX中配置定时器中断使能。 2. 在生成代码后,打开生成的工程,在`stm32f1xx_hal_conf.h`文件中找到相应的定时器中断宏定义,比如`TIMx_IRQn`和`TIMx_IRQHandler`,其中`x`表示定时器的编号。 3. 找到生成的工程中的`stm32f1xx_it.c`文件,这是用来处理中断的文件。 4. 在`stm32f1xx_it.c`文件中,找到对应定时器中断处理函数,这个函数的命名通常是`TIMx_IRQHandler`,其中`x`表示定时器的编号。 5. 在中断处理函数中,可以编写你自己的逻辑代码。 具体来说,你可以按照以下步骤进行设置: 1. 在主函数中初始化定时器,并启动定时器。 ```c /* 初始化定时器 */ HAL_TIM_Base_Start_IT(&htimx); // htimx为定时器句柄 ``` 2. 在`stm32f1xx_it.c`文件中找到对应定时器中断处理函数。 ```c void TIMx_IRQHandler(void) { HAL_TIM_IRQHandler(&htimx); // htimx为定时器句柄 } ``` 3. 在中断处理函数中添加你的逻辑代码。 ```c void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim == &htimx) { // 在这里添加你的逻辑代码 } } ``` 在上面的代码片段中,`HAL_TIM_PeriodElapsedCallback`是HAL提供的定时器中断回调函数,当定时器溢出时会自动调用该函数。你可以在这个函数中添加你的逻辑代码来处理定时器中断事件。 注意,上述代码中的`TIMx`需要替换成你使用的定时器的编号,比如`TIM2`、`TIM3`等。另外,还需要根据你的需求进行相应的修改。 希望以上信息对你有帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值