zoukankan      html  css  js  c++  java
  • HAL库_定时器更新中断+流水灯

    对比标准库的流程使用HAL库编写定时器更新中断

    标准库中使用定时器更新中断的方式:

    1.开时钟,设置TIM的时钟

    2.初始化定时器石基的结构体

    3.调用Init初始化函数

    4.处理定时器中断

    HAL中使用定时器更新中断的方式:

    1.开时钟

    2.初始化定时器石基的结构体

    3.处理定时器中断

    3.1在CubeMx中设置NVIC的抢占优先级和子优先级

    3.2 编写TIM3_IRQHandler    //重点

    先来看标准库中怎么处理这个中断,首先从启动文件中找到定时器中断的函数名字,然后再函数里判断是定时器的哪种中断(更新?输入捕获?输出比较?),然后清标志位,然后才写我们在中断干什么的代码。HAL中处理的方式有些变化。

    stm32fxx_it.c文件中找到了和标准库中一样名字的中断函数。

     1 void TIM3_IRQHandler(void)
     2 {
     3   /* USER CODE BEGIN TIM3_IRQn 0 */
     4 
     5   /* USER CODE END TIM3_IRQn 0 */
     6   HAL_TIM_IRQHandler(&htim3);
     7   /* USER CODE BEGIN TIM3_IRQn 1 */
     8 
     9   /* USER CODE END TIM3_IRQn 1 */
    10 }

    这里面什么都没做只是调用了一个函数  HAL_TIM_IRQHandler(&htim3);

    这个函数中完成了判断中断类型,清中断标志位的操作。我们只要写真正的处理代码即可。这也就是回调函数。

    HAL_TIM_IRQHandler(&htim3);函数中调判断了各种定时器的中断类型,也调用了对应的中断处理函数(回调函数),包括:

     1 /* Callback in non blocking modes (Interrupt and DMA) *************************/
     2 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
     3 void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim);
     4 void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim);
     5 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim);
     6 void HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim);
     7 void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim);
     8 void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim);
     9 void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim);
    10 void HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef *htim);
    11 void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim);

    总结一下思路就是:

    启动文件中有定时器中断的函数名字:TIM3_IRQHandler  这个名字是不能改的

    stm32fxx_it.c中调用: void TIM3_IRQHandler(void),它又调用了HAL_TIM_IRQHandler(&htim3)(这个函数在stm32f1xx_hal_tim.c中由库实现)

    在stm32f1xx_hal_tim.c中 HAL_TIM_IRQHandler(&htim3)这个函数调用了各种定时器的具体中断类型的函数(回调函数);声明在stm32f1xx_hal_tim.h中。

    具体的回调函数在外设的.c文件中以__weak关键字定义但没实现,我们需要去处理这些回调函数。该回调函数和标准库中的中断函数一样,可在任意文件中实现

    在HAL中,无论是串口的中断,DMA的中断,定时器的中断,都是以这种方法组织的。

    下面是定时器更新中的回调函数实现:

    1 /* USER CODE BEGIN 1 */
    2 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    3 {
    4     if(htim==&htim3)
    5     {
    6         HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
    7         HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);
    8     }
    9 }

     别忘了开启定时器中断:&htim3就是一个句柄

    HAL_TIM_Base_Start_IT(&htim3);
  • 相关阅读:
    数据库权限分配操作
    1130-host ... is not allowed to connect to this MySql server
    ubuntu 14.04安装mysql-python
    Ubuntu中的MySQL修改root密码的多种方法
    ubuntu下安装mysql及卸载mysql方法
    XShell本地上传文件到Ubuntu上及从Ubuntu下载文件到本地
    深度学习-1
    html-新闻滚动条
    Django部署uwsgi 与 nginx配置
    二叉树层次遍历
  • 原文地址:https://www.cnblogs.com/1024E/p/13347725.html
Copyright © 2011-2022 走看看