请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
懒得起名1 提问时间:2023-6-6 17:36 / 已解决

CUBETIM.png

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");

效果图如下:1.png

波形.JPG

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

收藏 评论6 发布时间:2023-6-6 17:36

举报

6个回答
butterflyspring 最优答案 回答时间:2023-6-7 09:53:08
如果是4OMhz 的翻转信号,估算一下间隔超短,中断执行不了几行代码了。所以多半中断阻塞住了。
楼主还是考虑用其他硬件方式实现这样的时钟信号吧。
xmshao 回答时间:2023-6-6 17:56:24
你看看开启了哪些中断?


如果只是使用了TIM2,看你在它的回调函数里又调用


了HAL_TIM_Base_Start_IT(&htim2);


难道你该回调函数之外做了TIM2的关闭操作?不过,这个操作应该


不是问题关键,只是写在这里又开启一次TIM2及中断有点费解。


另外,USB_printf()函数是怎么实现的?涉及到中断了吗?


建议干脆将这两个Printf调用换成2个全局变量来观察变化


并试着锁定原因。
wenyangzeng 回答时间:2023-6-6 19:57:39

Counter Period=4-1

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

懒得起名1 回答时间:2023-6-6 20:39:55

xmshao 发表于 2023-6-6 17:56
你看看开启了哪些中断?</p>
<p>

#include <stdarg.h>
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);
    }
}

回调函数就是在翻转引脚电平

懒得起名1 回答时间:2023-6-6 20:41:53

wenyangzeng 发表于 2023-6-6 19:57
Counter Period=4-1</p>
<p>则定时器的计数值为3,这么短的定时时间,当然一直进入定时器中断。

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

懒得起名1 回答时间:2023-6-7 12:01:15

butterflyspring 发表于 2023-6-7 09:53
如果是4OMhz 的翻转信号,估算一下间隔超短,中断执行不了几行代码了。所以多半中断阻塞住了。
楼主还是考 ...

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

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版