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

查看: 11199|回复: 4

求助:STM32 DMA与定时器中断问题

[复制链接]

1

主题

10

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2010-5-14 13:12:47 | 显示全部楼层 |阅读模式
遇到一个问题好多天了,我用STM32开发了一块电路板,其中USART3的通讯采用DMA发送和接收(接收字节已知),工作流程:在DMA1_CH2发送完成后进入中断,中断中将RS485芯片设置为接收状态并开启定时器3(定时时间500ms),如果在500ms内接受到数据,则在DMA1_CH3中断中关闭定时器3,如果没接收到数据则进入定时器3中断报警。
问题:不管定时器3的时间设置为多少(甚至1s),在连续运行时都会进入定时器3中断报警,而事实上数据发送完后很快就有数据返回(小于200ms)!而且如果同时在DMA1_CH3中断(接收中断)和定时器3的中断内设置断点,则一切正常(不会进入定时器3报警)!如果只在定时器3内设置断点,则仍会进入定时器3中断,最大的疑问是设置断点后正常,请高手指点!
下面是一些程序代码:
void TIM3_IRQHandler(void)       //定时器3中断
{
  if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
      TIM_DeInit(TIM3);
 //     TIM_Cmd(TIM3, DISABLE);                 //超时后停止定时
    if(g_uchLED3_State)
    {
      LED3_ON;
      g_uchLED3_State =! g_uchLED3_State;
    }
    else
    {
      LED3_OFF;
      g_uchLED3_State =! g_uchLED3_State;
    }
  }
}

 
void DMA1_Channel2_IRQHandler(void)    //DMA1_CH2中断,USART3数据发送完成
{
  if(DMA_GetITStatus(DMA1_IT_TC2) == SET)
  {
    DMA_ClearITPendingBit(DMA1_IT_TC2);         
    Delay_Ms(10);
    UART3_RECEIVE;
    TIM_DeInit(TIM3);

    TIM_Config(TIM3,500);                      //发送完成后使能接收,并定时500ms,超出500mS未接收到数表示接受超时
  } 
}

void DMA1_Channel3_IRQHandler(void)      //DMA1_CH3中断,USART3数据接收完成
{

  if(DMA_GetITStatus(DMA1_IT_TC3) == SET)
  {
    TIM_DeInit(TIM3);
    DMA_ClearITPendingBit(DMA1_IT_TC3);       //接收完成后将接收标志置为OK,然后调用接收数据处理函数
//    TIM_Cmd(TIM3, DISABLE);                 //接收完成后停止定时
     
  } 
}
 
 
 
回复

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2010-5-14 14:48:03 | 显示全部楼层

RE:求助:STM32 DMA与定时器中断问题

你好。我认为你有以下几点错误:
1、中断向量的配置,NVIC_InitStructure.NVIC_IRQChannel这个需要进行配置,要对改中断进行配置,配置中断向量很重要;
2、清除中断标志,如果不清除中断标志,那么肯定会进来的。
回复 支持 反对

使用道具 举报

1

主题

10

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2010-5-19 16:53:49 | 显示全部楼层

RE:求助:STM32 DMA与定时器中断问题

谢谢,中断向量也配置过了,TIM_ClearITPendingBit(TIM3, TIM_IT_Update);就是清除中断标志吧
还是老样子,呵呵
回复 支持 反对

使用道具 举报

1

主题

39

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2010-5-19 17:29:15 | 显示全部楼层

RE:求助:STM32 DMA与定时器中断问题

这要看你在DMA1_CH3中断中的断点设在哪里了,如果断点是在停止TIM3之前,则程序停在断点时,虽然CPU暂停运行,但TIM3还在运行,当你在断点处停留期间,TIM3中断的条件已经满足了,你再继续执行就刚好把TIM3的中断标志清除,并正确关闭了TIM3。
请试试把断点放在DMA1_CH3中断中关闭TIM3的语句之后,如果还会有问题,说明没有正确地关闭TIM3;到底为什么有正确地关闭TIM3,目前还不清楚。
回复 支持 反对

使用道具 举报

0

主题

1

回帖

0

蝴蝶豆

初级会员

最后登录
2019-8-9
发表于 2012-5-28 17:22:44 | 显示全部楼层

RE:求助:STM32 DMA与定时器中断问题

清除
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版