打印
[STM32F1]

usart dma的問題

[复制链接]
1556|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jstele|  楼主 | 2014-1-6 10:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
請問一下:
1. usart的接收定長資料,如8個byte收完後dma到sram中,此方式可以做嗎?
2.usart需要設定中斷接收嗎?  那收八個byte的資料就需要中斷八次,這不是嚴重的影響mcu處理速度嗎?
3.可以在dma收完後再發動dma中斷,請問這思考模式該要怎麼實行程式?
謝謝
沙发
airwill| | 2014-1-6 18:43 | 只看该作者
usart的接收定長資料, 比较适合 DMA 来完成.
usart需要設定中斷接收嗎?  那收八個byte的資料就需要中斷八次,這不是嚴重的影響mcu處理速度嗎?  不尽然, 如果接收中断很精练的话, 处理不在话下.
DMA 接收玩后触发中断, 处理数据, 然后再允许 DMA 接收

使用特权

评论回复
板凳
jstele|  楼主 | 2014-1-7 08:17 | 只看该作者
airwill 发表于 2014-1-6 18:43
usart的接收定長資料, 比较适合 DMA 来完成.
usart需要設定中斷接收嗎?  那收八個byte的資料就需要中斷八次 ...

樓主的意思是rx收到資料就送到dma去  然後他收到定長再中斷嗎?

使用特权

评论回复
地板
airwill| | 2014-1-7 09:04 | 只看该作者
rx收到資料就触发 DMA,  DMA 收到定长数据后, 触发中断

使用特权

评论回复
5
楚天| | 2014-1-7 10:30 | 只看该作者
RXNE和DMA中断没有关系。可以不设置RXNE中断,每次Rx后由DMA来传输到指定的内存地址,然后由DMA的HT、HC中断来唤醒CPU处理。不用开启任何uart中断。但是要设置Uart的DMA请求,并设置DMA的相应中断。同样的,操作任何外设前要记得先给外设设置时钟。另外,如果用库则要记得,get it flag和get status是不一样的。
这种方式虽然很适合定长通信,但是要注意,上电、扰动等会导致每帧长度出现错误,这样会无法纠正。所以软件要做好超时及同步处理。

使用特权

评论回复
6
jstele|  楼主 | 2014-1-8 10:09 | 只看该作者
jstele 发表于 2014-1-7 08:17
樓主的意思是rx收到資料就送到dma去  然後他收到定長再中斷嗎?

是這樣的

使用特权

评论回复
7
jstele|  楼主 | 2014-1-8 10:11 | 只看该作者
楚天 发表于 2014-1-7 10:30
RXNE和DMA中断没有关系。可以不设置RXNE中断,每次Rx后由DMA来传输到指定的内存地址,然后由DMA的HT、HC中 ...

嗯  謝謝逆給我這樣好的思路   不知道樓主是否有代碼讓我學習一下   謝謝

使用特权

评论回复
8
楚天| | 2014-1-12 11:58 | 只看该作者
        USART_InitTypeDef                USART_InitStructure;
        DMA_InitTypeDef DMA_InitStructure;

        DMA_DeInit(DMA1_Channel2);
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)UART3_DR_Address;
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)cUsartTxdBuff;
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
        DMA_InitStructure.DMA_BufferSize = COM_BUFF_SIZE;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
        DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
        DMA_Init(DMA1_Channel2, &DMA_InitStructure);

        USART_InitStructure.USART_BaudRate                                =        COM_BAUD_RATE;
        USART_InitStructure.USART_WordLength                        =        USART_WordLength_8b;
        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_Tx | USART_Mode_Rx;
        USART_Init(USART3, &USART_InitStructure);

        USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
        USART_DMACmd(USART3, USART_DMAReq_Tx ,ENABLE);
        USART_Cmd(USART3, ENABLE);
        USART_ClearFlag(USART3, USART_FLAG_FE);
注意,要先配置时钟,后配置设备。

使用特权

评论回复
9
楚天| | 2014-1-12 11:59 | 只看该作者
上面是中断接收,DMA发送。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

56

帖子

1

粉丝