搜索
bottom↓
回复: 14

STM32串口DMA空闲中断求救

[复制链接]

出0入0汤圆

发表于 2019-2-12 09:36:56 | 显示全部楼层 |阅读模式
本帖最后由 yangzi8000 于 2019-2-12 11:42 编辑

F1使用串口3  DMA空闲中断,设置缓冲区100个字节,发现每次接收到》100个字节才产生一次空闲中断,如何修改设置成接收不定长字节就能空闲中断,贴代码:
void uart_init(u32 bound)
{
   
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    DMA_InitTypeDef DMA_InitStructure;

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //??USART1,GPIOA??
   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //??DMA??
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//??USART2??

   USART_DeInit(USART3);  //????1

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //??????
    GPIO_Init(GPIOB, &GPIO_InitStructure); //???PA9
   

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//????
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    //Usart1 NVIC ??
    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//?????3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //????3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ????
    NVIC_Init(&NVIC_InitStructure); //??????????VIC???
  
   //USART ?????
  USART_InitStructure.USART_BaudRate = bound;//?????9600;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;//???8?????
  USART_InitStructure.USART_StopBits = USART_StopBits_1;//?????
  USART_InitStructure.USART_Parity = USART_Parity_No;//??????
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//????????
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //????

    USART_Init(USART3, &USART_InitStructure); //?????
    USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);//??????
    USART_DMACmd(USART3,USART_DMAReq_Rx,ENABLE);   //????1 DMA??
    USART_Cmd(USART3, ENABLE);                    //????

    //???DMA??
  DMA_DeInit(DMA1_Channel3);   //?DMA???5?????????  ??1????DMA??5
  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART3->DR;  //DMA??ADC???
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)RxBuffer3;  //DMA?????
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  //??????,??????????
  DMA_InitStructure.DMA_BufferSize = 100;  //DMA???DMA?????
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //?????????
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //?????????
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  //?????8?
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //?????8?
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  //?????????
  DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA?? x??????
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA??x????????????
  DMA_Init(DMA1_Channel3, &DMA_InitStructure);  //??DMA_InitStruct?????????DMA???

    DMA_Cmd(DMA1_Channel3, ENABLE);  //????DMA??
}       

u8 flag1=0;
void USART3_IRQHandler(void)         
{       
     if(USART_GetFlagStatus(USART3,USART_IT_IDLE)!= RESET)       
           {
             u8 num;
            num = USART3->SR;      
            num = USART3->DR; //?USART_IT_IDLE??      
            DMA_Cmd(DMA1_Channel3,DISABLE);    //??DMA      
            num = 100 -  DMA_GetCurrDataCounter(DMA1_Channel3);      //??????????        
            RxBuffer3[num] = '\0';      
            DMA1_Channel3->CNDTR=100;       //??????????         
            DMA_Cmd(DMA1_Channel3,ENABLE);  //??DMA     
            flag1=1;           //????????1
          }
          
                                         
       
                                 

}       

阿莫论坛20周年了!感谢大家的支持与爱护!!

阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)

出0入0汤圆

发表于 2019-2-12 10:27:53 | 显示全部楼层
我用过的DMA用法就是这样了,缓存满就产生中断。设置100就是100了。楼主想达到任意中断,为何不用串口自身的字节接收完毕中断呢?

出0入442汤圆

发表于 2019-2-12 10:37:10 来自手机 | 显示全部楼层
HalenYU 发表于 2019-2-12 10:27
我用过的DMA用法就是这样了,缓存满就产生中断。设置100就是100了。楼主想达到任意中断,为何不用串口自身 ...

曰,进一次中断几us没有了,你当cpu资源无限啊。

出0入0汤圆

发表于 2019-2-12 10:47:16 | 显示全部楼层
wye11083 发表于 2019-2-12 10:37
曰,进一次中断几us没有了,你当cpu资源无限啊。

你用波特率算过字节传输时间吗?单就这一个串口中断来说这几us相对于字节传输的时间算个屁,你其它应用中断也很密集频繁,对资源要求极高则另当别论。

出0入0汤圆

发表于 2019-2-12 10:56:34 | 显示全部楼层
有个空闲标志位。IDLE.

出0入0汤圆

 楼主| 发表于 2019-2-12 11:11:26 | 显示全部楼层
沉默胜过白金 发表于 2019-2-12 10:56
有个空闲标志位。IDLE.

复制代码的时候不小心删除了 ,这个是有的          if(USART_GetFlagStatus(USART3,USART_IT_IDLE)!= RESET)

出0入0汤圆

发表于 2019-2-12 11:14:52 | 显示全部楼层
yangzi8000 发表于 2019-2-12 11:11
复制代码的时候不小心删除了 ,这个是有的          if(USART_GetFlagStatus(USART3,USART_IT_IDLE)!= RESET) ...

没见你配置空闲中断啊?
cr1寄存器第四位还是第五位忘了,查下手册吧。

出0入0汤圆

发表于 2019-2-12 11:16:01 | 显示全部楼层
看发送端字节间隔,标准的就用总线空闲标志位idle;要是间隔规则但间隔时间长的用定时器超时检测;没规律的就只能单个字节接受或者用大缓冲接收后再慢慢分析

出0入0汤圆

发表于 2019-2-13 07:46:30 来自手机 | 显示全部楼层
空闲中断再启动一个定时器,等到溢出中断了才认为接收完成。

出0入90汤圆

发表于 2019-2-13 10:28:00 | 显示全部楼层
这个有什么好讨论的。无非是开了个DMA接收数据,然后又开了空闲中断。好比DMA缓存区100字节。正常的通信指令可能就1-20个字节。收到1-20个字节就空闲,然后去DMA拿数据就好了。
楼主是代码没写好,于是发生了,非要发100个字节才能中断。那你这个是DMA接收完成中断,而不是空闲中断。
看一下库的例子吧。这种都是基础代码了。没什么好讨论的

出0入0汤圆

发表于 2020-1-2 16:15:27 | 显示全部楼层
你的缓存设置的小了,不定长的话要以可能接收到最大程度为准。这个DMA中这个size对应你缓存长度大小,dma靠它判断是否产生缓存已满中断。

出0入0汤圆

发表于 2020-1-2 17:35:01 | 显示全部楼层
接收脚如果没外部上拉的话,最好配置成内部上拉输入,空闲中断配置好就进入空闲中断了

出0入4汤圆

发表于 2020-1-2 21:11:02 | 显示全部楼层
串口空闲中断,不是DMA空闲中断。你搞错了吧。

出190入0汤圆

发表于 2020-1-2 22:33:45 | 显示全部楼层
串口接收要使用空闲中断+dma完成中断才爽。
楼主代码有2个基本问题:
1,num = USART3->DR;这个本来是用来清除IDLE中断,但存在被优化掉的风险;
2, 在再次开启dma中断时,rxBuffer已接受的数据会被下一次串口数据覆盖掉(恰巧dma打开串口上就有数据);
另外,不知楼主如何判断是>100字节才有空闲中断产生的。

出0入0汤圆

发表于 2020-1-2 23:21:02 | 显示全部楼层
只用过DMA+Timeout中断,IDLE时间太短了,分包容易错误
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-17 07:55

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表