定时器中断函数内不能调用可以返回参数的函数

2019-10-16 04:30发布

最近在用STM32F103R8T6做一个无刷电机的驱动程序,其中用TIM1高级定时器做了一个定时中断,方便做控制。程序的配置上,定时器1工作正常,如果只是调用普通函数是没有问题的,但是在调用有参数返回的函数的时候,中断函数并没有退出。
程序大概如下:

void TIM1_UP_IRQHandler(void)
{
      if(TIM_GetITStatus(TIM1 , TIM_IT_Update) == SET)
      {
              TIM_ClearITPendingBit(TIM1 , TIM_IT_Update);
              LED_On_Only(LED1);                                            //程序工作正常
              //angle = Get_Angle();                                          //加上这句的时候程序就死中断里面没有出来
      }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
正点原子
1楼-- · 2019-10-16 06:55
说明你这个函数执行时间太长了。。
钩月黄昏
2楼-- · 2019-10-16 12:54
代码哪边写的有问题吧,你看TIM_GetITStatus(TIM1 , TIM_IT_Update)不也是一个有返回参数的函数吗?
黄阿厉
3楼-- · 2019-10-16 16:46
钩月黄昏 发表于 2016-12-1 22:00
代码哪边写的有问题吧,你看TIM_GetITStatus(TIM1 , TIM_IT_Update)不也是一个有返回参数的函数吗?

可是要调用的函数是在正常工作的,需要调用的这个函数的功能是通过stm32的SPI访问磁编码器获得角度值。
目前这个函数是放在主函数中进行,返回的参数定义为全局变量,中断函数是通过这样的方式访问这些参数的。但是这样的方式采集的值并不是实际值(采集到编码器值的时候电机早就转过去很多了),做位置环控制就比较麻烦
lavion
4楼-- · 2019-10-16 18:42
记住 带宽,这个 重要概念.  
如果中断频率1KHZ,   而你的 Get_Angle();  运行一遍  却要2mS, 你说 是不是会出问题?
另外 ,很有可能 你的Get_Angle();   函数 还有另外的问题.   
Get_Angle();  需要这么高的带宽????   
黄阿厉
5楼-- · 2019-10-16 22:43
 精彩回答 2  元偷偷看……
xyl210xyl
6楼-- · 2019-10-17 01:28
用这样阻塞的方式是不行的,spi出错电机堵转怎么办

一周热门 更多>