野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 5920|回复: 7

求助:定时器启动就卡死的问题 f103

[复制链接]
发表于 2022-11-9 22:10:41 | 显示全部楼层 |阅读模式
我发现只要启动了定时器就会卡死主函数。为了确定是定时器的问题,我新建了工程,在while中设定led不断亮灭,通过usart发送一个数值给电脑,用以确定程序能否执行到while。然后我发现只要注释掉HAL_TIM_Base_Start_IT(&htim2),就能执行到while,去掉注释,就会卡死。
为了避免是回调函数写错导致的卡死,新建的工程中我没有重写回调函数,实际上写的所有的代码就仅限于HAL_TIM_Base_Start_IT(&htim2)和while中的几句了。
求回答,到底为什么启动定时器就会卡死,如何解决,如何正确使用定时器呢

复制一段main中代码:
/* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_I2C1_Init();
  MX_TIM2_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim2);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
          uint8_t dat=0x78;
          HAL_UART_Transmit_IT(&huart1,&dat,1);
          HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
          HAL_Delay(500);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

野火论坛202211092205429053..png
野火论坛202211092204417262..png
野火论坛202211092202034678..png
回复

使用道具 举报

发表于 2022-11-10 12:55:21 | 显示全部楼层
缺省的弱定义的中断服务函数就是一个死循环,开了中断就必须编写自己的服务中断函数。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-11 00:49:19 | 显示全部楼层
羊烊 发表于 2022-11-10 12:55
缺省的弱定义的中断服务函数就是一个死循环,开了中断就必须编写自己的服务中断函数。 ...

我重写了弱函数HAL_TIM_PeriodElapsedCallback,做了个实验,在函数中改变led电平,并让usart发送数据,同时在while中让主函数每隔半秒发送一个数据,以此检验定时器是否卡住了主函数。
结果是定时器的回调函数并不能通过usart发送数据,翻转电平似乎也只执行了一次(因为LED处在最亮状态,通常不停翻转时是半亮的),并且while中的代码也没有执行。
我猜想回调函数执行了一次,然后就卡住了。但是这解释不了usart没有发送任何数据,也许usart发送不能放在回调函数里?我只好先不管usart在定时器回调函数里的事情,先试试是不是真的回调函数只执行了一次就卡住。
于是我又实验了一次。让回调函数降低翻转的频率。结果发现回调函数并没有只执行一次,而是确实在不断执行翻转led的任务,同时发送数据的任务也毫不意外的没有反应。并且while中的代码也没有执行。也就是说,开启定时器之后,它确确实实的卡住了主函数。
这令我费解,定时器的回调函数既然是通过定时器溢出时产生中断而执行的,那么它应该不卡住主函数才对。
现在问题变成两个了,一个是正确使用定时器中断回调函数并且不卡住主函数的方法是什么呢,是需要添加某条语句吗?
第二个意外问题就是回调函数为什么不能通过usart发送数据呢?无论是HAL_UART_Transmit()还是HAL_UART_Transmit_IT()都不行。
求解答
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-11 00:50:53 | 显示全部楼层
实验使用的代码如图
野火论坛202211110049513031..png
野火论坛202211110050089135..png
回复 支持 反对

使用道具 举报

发表于 2022-11-11 14:53:19 | 显示全部楼层
我简单看了一下,我HAL库玩的不多可以说是不了解,我也在学习当中。你把HAL_UART_Transmit函数的timeout从参数给多一点试试是不是真的发送不出去,led在翻转说明定时器还有中断是没有问题的。
回复 支持 反对

使用道具 举报

发表于 2022-11-11 14:56:52 | 显示全部楼层
还有的话定时器中断进入频率不要太大,cortex-M3内核支持咬尾中断还会有一些情况触发hard fault(硬件故障)的情况,详细可以去看看M3的权威指南,(我也不太明白也在学习)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-11 18:56:46 | 显示全部楼层
weinizhongqing 发表于 2022-11-11 14:56
还有的话定时器中断进入频率不要太大,cortex-M3内核支持咬尾中断还会有一些情况触发hard fault(硬件故障 ...

咬尾中断这个词儿是第一次听说,我得百度一下。长见识了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-11 19:28:57 | 显示全部楼层
weinizhongqing 发表于 2022-11-11 14:56
还有的话定时器中断进入频率不要太大,cortex-M3内核支持咬尾中断还会有一些情况触发hard fault(硬件故障 ...


好消息啊,你说的一点毛病都没有,确实是中断来的太频繁了,慢点来就全发送成功了

野火论坛202211111927349752..png 野火论坛202211111927238172..png
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 14:53 , Processed in 0.054597 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表