STM32/STM8技术论坛
直播中

李星童

8年用户 1154经验值
私信 关注
[问答]

STM32串口接收DMA中断不能进

结果就是void USART1_IRQHandler(void)正常 可以进来
{
//             unsigned char num=0;
//    if(USART_GetiTStatus(USART1,USART_IT_IDLE) == SET)
//    {
//       num = USART1->SR;
//       num = USART1->DR; //清USART_IT_IDLE标志
//       DMA_Cmd(DMA1_Channel5,DISABLE);    //关闭DMA
//      num = 128 -  DMA_GetCurrDataCounter(DMA1_Channel5);      //得到真正接收数据个数  
//      receive_data[num] = '';
//      DMA1_Channel5->CNDTR=128;       //重新设置接收数据个数        DMA_Cmd(DMA1_Channel5,ENABLE);  //开启DMA
//     //  receive_flag = 1;           //接收数据标志位置1
//                        DMA_Cmd(DMA1_Channel5,ENABLE);  //开启DMA
//                        printf("%s ",receive_data );               
//    }
}

void DMAChannel5_IRQHandler(void)
{
    if(DMA_GetITStatus(DMA1_IT_TC5) != RESET)
    {
      TestLive();
      DMA_ClearITPendingBit(DMA1_IT_TC5);
    }
        //进不来

}

说明:我百度找了找别人的问题,一种是中断函数名字的问题,我这里不存在这个问题,如图

回帖(5)

李星童

2019-1-3 10:07:57
本帖最后由 与龙共舞 于 2018-7-2 15:51 编辑

串口助手循环不停的发送
现在注意到一个现象 中断在CNDRT为0是可以进去的
所以我的配置是有问题的 发个几十次 DMA表示完成了
代码问题大了  我DMA设置的是128个bit 串口过来数据其实是不定长的而我在128的时候才表示传输完成,。。。是不是无法这样写了。。
参考:https://blog.csdn.net/u010001130/article/details/77816020  所以void DMAChannel5_IRQHandler(void)这个函数一般没啥用?
4. DMA接收数据初始化
在串口使用DMA接收时,由于不知道数据传输的长度,故不能使能DMA接收中断。


举报

黄明光

2019-1-3 10:24:06
我用的是串口空闲中断+DMA,DMA干的活就是搬运串口数据(如果有则一直搬),直到串口出现空闲中断,再由中断函数中的用户代码,接着折腾串口数据。我认为这个思路是对的;你的思路,我还真没考虑过。
举报

李星童

2019-1-3 10:35:03
引用: zsjjx 发表于 2019-1-3 13:06
我用的是串口空闲中断+DMA,DMA干的活就是搬运串口数据(如果有则一直搬),直到串口出现空闲中断,再由中断函数中的用户代码,接着折腾串口数据。我认为这个思路是对的;你的思路,我还真没考虑过。

嗯   我的思路好像有问题 串口空闲中断+DMA可以的 不能再加DMA中断  你的这个评论 我又迷糊了:空闲中断是怎么发生的?我上午以为是PC上位机 发送结束不在发送 那么串口空闲产生的中断 随后触发DMA去搬  你的说法是DMA搬运完数据 串口产生空闲中断
举报

李星童

2019-1-3 10:50:35
引用: zsjjx 发表于 2019-1-3 13:06
我用的是串口空闲中断+DMA,DMA干的活就是搬运串口数据(如果有则一直搬),直到串口出现空闲中断,再由中断函数中的用户代码,接着折腾串口数据。我认为这个思路是对的;你的思路,我还真没考虑过。

是的 是搬完了 再进空闲中断的
void USART1_IRQHandler(void)
{
             unsigned char num=0;
        memset(receive_data,0,128);..此后看到清空了
举报

黄明光

2019-1-3 11:03:44
引用: 山川1998 发表于 2019-1-3 13:17
嗯   我的思路好像有问题 串口空闲中断+DMA可以的 不能再加DMA中断  你的这个评论 我又迷糊了:空闲中断是怎么发生的?我上午以为是PC上位机 发送结束不在发送 那么串口空闲产生的中断 随后触发DMA去搬  你的说法是DMA搬运完数据 串口产生空闲中断 ...

本帖最后由 梁子 于 2018-7-2 16:30 编辑

当波特率确定后,一个字节的接收时间就已经确定了(假设当前波特率下一字节的发送时间为1ms),假设串口一直在接收数据,突然有1ms空闲下来,没有数据可接收了,这时CPU就可以提出串口空闲中断了;原理就是这样。DMA是自动搬运工,当有匹配数据时,它自然会去搬。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分