久芯网

STM32H743zit6开启定时中断后,反复执行中断回调函数,无法执行其他程序

avatar 懒得起名1 提问时间: 2023-06-29 23:06:40 / 未解决

STM32H743zit6开启定时中断后,反复执行中断回调函数,无法执行其他程序 [相关图片]

CUBEMX设置如上。

回调函数如下:

{
if(htim->Instance == TIM2)
{LL_GPIO_TogglePin(CLK_GPIO_Port,CLK_Pin);}

调用代码如下:

USB_printf("1");

HAL_TIM_Base_Start_IT(&htim2);

USB_printf("2");

效果图如下:STM32H743zit6开启定时中断后,反复执行中断回调函数,无法执行其他程序 [相关图片]

STM32H743zit6开启定时中断后,反复执行中断回调函数,无法执行其他程序 [相关图片]

串口助手收到1后不再接收并且卡死无反应,引脚正常翻转,回调函数正常执行。


如需获得 STM32H743zit6 等器件的更多信息,请点击链接或 点击此处 联系在线客服!

6个回答
  • avatar xmshao
    回答时间: 2023-06-29 23:39:27

    你看看开启了哪些中断? 如果只是使用了TIM2,看你在它的回调函数里又调用 了HAL_TIM_Base_Start_IT(&htim2); 难道你该回调函数之外做了TIM2的关闭操作?不过,这个操作应该 不是问题关键,只是写在这里又开启一次TIM2及中断有点费解。 另外,USB_printf()函数是怎么实现的?涉及到中断了吗? 建议干脆将这两个Printf调用换成2个全局变量来观察变化 并试着锁定原因。

  • avatar wenyangzeng
    回答时间: 2023-06-30 00:03:15

    Counter Period=4-1 则定时器的计数值为3,这么短的定时时间,当然一直进入定时器中断。

  • avatar 懒得起名1
    回答时间: 2023-06-30 00:21:11
    xmshao 发表于 2023-6-6 17:56
    你看看开启了哪些中断?

    #include void USB_printf(const char *format,...) { va_list args; uint32_t length; va_start(args,format); length = vsnprintf((char *)UserTxBufferFS,APP_TX_DATA_SIZE,(char *)format,args); va_end(args); while(CDC_Transmit_FS(UserTxBufferFS,length) != USBD_OK); // CDC_Transmit_FS(UserTxBufferFS,length); } usb是虚拟串口prinft重定义函数。由TIM2定时器产生的中断可以成功的翻转引脚电平,TIM2的中断是没有问题的。是TIM2的中断制止了其他中断和程序正常运行了。 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM2) { LL_GPIO_TogglePin(CLK_GPIO_Port,CLK_Pin); } } 回调函数就是在翻转引脚电平

  • avatar 懒得起名1
    回答时间: 2023-06-30 00:51:13
    wenyangzeng 发表于 2023-6-6 19:57
    Counter Period=4-1

    则定时器的计数值为3,这么短的定时时间,当然一直进入定时器中断。

    [md]我需要一个40MHz的时钟信号,时钟树里的总线是240MHz。只能这么短了吧

  • avatar butterflyspring
    回答时间: 2023-06-30 01:15:56

    如果是4OMhz 的翻转信号,估算一下间隔超短,中断执行不了几行代码了。所以多半中断阻塞住了。 楼主还是考虑用其他硬件方式实现这样的时钟信号吧。

  • avatar 懒得起名1
    回答时间: 2023-06-30 01:47:37
    butterflyspring 发表于 2023-6-7 09:53
    如果是4OMhz 的翻转信号,估算一下间隔超短,中断执行不了几行代码了。所以多半中断阻塞住了。 楼主还是考 ...

    说错了4MHz,但好像1MHz都达不到卡在800KHz了。

会员中心 微信客服
客服
回到顶部