一、来由

近来,要用到RS485转CAN2.0B协议,其中要求8ms发一级CAN包,100ms又发另一组CAN包,500ms还想让led闪烁,表示程序正常运行。因为刚用STM32F042,不熟悉,只能找些例子来看,还好,感谢网友,也算把它调试出来了。其中用“HAL_Dalay(1)”延时1ms,计数,调试用用还行,但觉得不精准,应该用定时器控制。

网上找资料,找到:《STM32 Cubemx 配置定时器定时1mS》STM32 Cubemx 配置定时器定时1mS - osc_qimlgg8v的个人空间 - OSCHINA - 中文开源技术交流社区等文,照葫芦画瓢,画到最后,画不来(程序不理解、也无法实现功能),反复琢磨,最后成功了,也就想写出来,分享给大家,以少走弯路。

照着STM32 Cubemx 配置定时器定时1mS - osc_qimlgg8v的个人空间 - OSCHINA - 中文开源技术交流社区介绍,走到最后一段,不知道怎么做了:

   最后使用定时器中断跟关闭定时器中断以及回调函数即可, 使用中断的时候注意要先开启中断

HAL_TIM_Base_Start_IT(&htim1); //使用定时器的时候调用这个函数启动HAL_TIM_Base_Stop_IT(&htim1);  //停止定时器的时候调用这个函数关闭void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM1){//编写回调逻辑,即定时器1定时1MS后的逻辑}
}

定时器开中断好理解,定时器关中断也好理解,就是这个回调函数怎么用,不知道,文章到此结束了,相似内容的文章也有一些,但都是到此就结束了。不知道从何下手,无奈,只好自己想办法。

二、我的方法

CubeMX定义好各种引脚、参数后会创建出工程文件来,我的RS485是中断接收的, 我也是在stm32f0xx_it.c(见下图手写“1”处)中添了几条语句实现串口中断接收的(见下图手写“2”处),stm32f0xx_it.c中也有定时器中断(我用的是定时器1)(见下图手写“3”处),每次1ms中断就让几个相关的数加1。

当然,要在stm32f0xx_it.c中把这几用到的变量名定义一下,见下图涂蓝部分。

在main.c中引用刚才定义的变量,见下图涂蓝部分

现在,这几个变量每1ms就会增加1,在while(1){   }中用几个条件语句就实现了8ms发一级CAN包,100ms又发另一组CAN包,500ms还让led闪烁。注意,必须设置语句启动定时器,否则定时器是不会的。代码如下(简化过):

nt main(void)
{/* USER CODE BEGIN 1 */extern unsigned char RS485RxBuffer[32];   //接收数据extern  unsigned char aRxBuffer;            //接收中断缓冲extern  unsigned char Uart2_Rx_Cnt;        //接收缓冲计数extern CAN_HandleTypeDef hcan;        //和初始化中的保持一致extern WWDG_HandleTypeDef hwwdg;extern int Led_flash,RepeatSendPri,RepeatSendSec;HAL_Init();SystemClock_Config();// CAN_HandleTypeDef hcan;HAL_StatusTypeDef    HAL_RetVal;CAN_TxHeaderTypeDef Can_Tx;CAN_RxHeaderTypeDef Can_Rx;/* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_ADC_Init();MX_CRC_Init();MX_TIM1_Init();MX_CAN_Init();MX_USART2_UART_Init();MX_WWDG_Init();/* USER CODE BEGIN 2 */__HAL_TIM_CLEAR_IT(&htim1 ,TIM_IT_UPDATE ); //清除TIM1中断挂起HAL_TIM_Base_Start_IT(&htim1 );              //启动定时器TIM1中断/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */   //以下初始数据准备Uart2_Rx_Cnt = 0;RepeatSendPri=0;RepeatSendSec =0;Led_flash = 0;      while (1){HAL_WWDG_Refresh(&hwwdg);     //复位看门狗     //定时器1ms中断计时(计数)        //以下每8ms发一组数据,CAN ID=0x0A发送if(RepeatSendPri >= 8){RepeatSendPri  = 0 ;  //置0,重新开始//发之前先查询一下 邮箱是否满了,满了就等一下再发while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan) == 0 );//向 Tx 邮箱中增加一个消息,并且激活对应的传输请求HAL_RetVal = HAL_CAN_AddTxMessage(&hcan,&Can_Tx,CanTxdataPri,&pTxMailbox);  //CAN ID=0x0A发送}//以下每100ms发一组数据,CAN ID=0x0B发送if(RepeatSendSec >= 100){RepeatSendSec =0;   //置0,重新开始//发之前先查询一下 邮箱是否满了,满了就等一下再发while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan) == 0 );//向 Tx 邮箱中增加一个消息,并且激活对应的传输请求HAL_RetVal = HAL_CAN_AddTxMessage(&hcan,&Can_Tx,CanTxdataSec,&pTxMailbox);   //CAN ID=0x0B发送}//以下用于指示程序在运行,LED亮或灭中            if(Led_flash >=500){Led_flash = 0;    //置0,重新开始LedFlash();   //使LED亮或灭,指示程序在运行     }}}

三、小结

感谢网友STM32 Cubemx 配置定时器定时1mS - osc_qimlgg8v的个人空间 - OSCHINA - 中文开源技术交流社区的分享,依照他的cubeMX配置是可行的,只是最后一段我不会用,改成了自己的,我也分享给用得着的朋友。

STM32 CubeMX 1ms定时中断的实现相关推荐

  1. STM32 CubeMx(二)定时器中断和PWM呼吸灯

    STM32 CubeMx(一)时钟树配置与GPIO输入输出 文章目录 1.定时器 1.1 定时器概念 1.2 定时器分类 1.3 定时器功能 1.4 配置过程和编写代码 1.5 代码分享 2.PWM产 ...

  2. c语言定时器定时1ms程序,STM32 Cubemx 配置定时器定时1mS

    最近才发现原来我把定时器里的配置参数代表的意义给搞混了,这里记录一下,防止以后自己忘记. 以建立一个定时1mS定时器为例: 1.先打开定时器 2.配置好时钟 3.配置定时器设置 重点来了,以前在这里我 ...

  3. stm32工程和算法分享(12)--精准闪烁灯[定时中断]

    stm32工程和算法分享(12)–精准闪烁灯[定时中断] 两种方式 闪烁与定时器同步 利用标志位,定时器设置的时间间隔较小 不要在定时器中断函数写太多语句,我们通常借助标志位来实现 我们设置400ms ...

  4. STM32学习笔记(四)丨TIM定时器及其应用(定时中断、内外时钟源选择)

    本篇文章包含的内容 一.TIM 定时器 1.1 TIM 定时器简介 1.2 TIM 定时器类型及其工作原理简介 1.2.1 基本定时器工作原理及其结构 1.2.2 通用定时器工作原理及其结构 1.2. ...

  5. STM32 TIM定时中断

    总体介绍 TIM(Timer)定时器是STM32中功能最强大,结构最复杂的一个外设,以下对其做一下简介(以stm32为例): TIM可以对输入的时钟进行计数,并在数值达到设定值时触发中断. 在STM3 ...

  6. STM32入门笔记04_TIM定时器+案例:TIM定时器定时中断、定时器外部时钟

    TIM定时器 TIM简介 TIM(Timer) 定时器 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断 16位计数器.预分频器.自动重装寄存器的时基单元,在72MHz(系统主频)计数时 ...

  7. 备赛电赛学习STM32篇(五):TIM定时中断

    目录 一.TIM简介 1.1.简介 1.2.基本定时器 2.2.通用定时器 1.3.高级计数器 ​编辑 二.定时中断和内外时钟源选择 2.2 时基单元运行时序举例 2.2.1缓冲(影子)寄存器 2.2 ...

  8. stm32定时器定时中断

    主频72MHz:最大计时59.65s 基本定时器: 基准时钟 预分频器 计数器 计数器与自动重装载寄存器进行比较 相等时计时时间到 进行中断相应 主模式触发DAC 硬件自动化 通用定时器: 计数模式不 ...

  9. 实现定时中断_EPIT 定时器,仅需做到如下几步,即可轻松配置使用

    EPIT 的全称是: Enhanced Periodic Interrupt Timer,直译过来就是增强的周期中断定时器,它主要是完成周期性中断定时的.学过 STM32 的话应该知道, STM32 ...

最新文章

  1. 安永创新中心落子北京,聚焦5G技术赋能企业数字化转型
  2. 智能视觉组参赛总结及体会- 西安邮电大学 - AI小布丁
  3. 清华校庆正当时,智能小车决赛日
  4. python3 str bytes bytearray 互相转换
  5. lua 的正则表达式之坑
  6. pycharm中如何正确配置pyqt5
  7. Json解析工具Jackson(使用注解)
  8. ros melodic控制真实机械臂之moveit_setup_assistant配置
  9. 哈工大学习笔记 | 图文并茂详解隐马尔可夫模型
  10. Python 进阶视频课 - 14. FR007 利率掉期定价和曲线拔靴
  11. Linux查看本机端口开启,Linux 实用指令之查看端口开启情况
  12. Gradle 2.0 用户指南翻译——第十九章. Gradle 守护进程
  13. MongoDB中shell基本使用
  14. 敏捷项目中的进度控制
  15. JMeter常用函数整理
  16. 摄影测量(二):航空摄影
  17. 2023陆军工程大学计算机考研信息汇总
  18. gitlab合并分支后需要提交吗_Gitlab合并了两个分支
  19. 1.7.10我的世界java下载_我的世界1.7.10
  20. 读《清道夫》秦明第四本

热门文章

  1. 淘宝/天猫获取卖出的商品订单列表 API
  2. UI设计中图标设计的有几大原则
  3. Windows Azure HDInsight 支持预览版 Hadoop 2.2 群集
  4. DBGrid 各属性的设置
  5. %3chtml%3e%3c html,403禁止%3Chtml%3E%3Chead%3E%3Cmeta笨
  6. 2021年上半年软考真题数据库系统工程师真题
  7. 量子计算机 儿童画,星汉璀璨只见你
  8. 后装载垃圾车的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  9. JavaScript:异步简介与Promise实践拓展
  10. Good Luck in CET-4 Everybody!(博弈)