[DemoCode下载] M451系列UART0通过DMA接收数据的DemoCode

[复制链接]
3355|11
 楼主| YWBIN 发表于 2015-6-8 10:06 | 显示全部楼层 |阅读模式
附件为M451系列UART0通过DMA接收数据的DemoCode,功能如下:UART0波特率为57600bps,接收256个字节数据产生一个中断并打印接收到的数据。有需要的朋友可以参考下。
注:工程路径为“M451SeriesBSP_CMSIS_v3.00.005\SampleCode\StdDriver\PDMA”。

M451Series_UART0_DMA_Receive.rar

638.74 KB, 下载次数: 188

gaoyang9992006 发表于 2015-6-8 12:19 | 显示全部楼层
按字节定量产生中断,看看这个怎么实现的。
芙蓉洞 发表于 2015-6-10 08:38 | 显示全部楼层
这个中断是用什么方法产生的呢?
gaoyang9992006 发表于 2015-6-11 16:40 | 显示全部楼层
void PDMA_Init()
{
    /* Enable PDMA clock source */
    CLK_EnableModuleClock(PDMA_MODULE);
    /* Reset PDMA module */
    SYS_ResetModule(PDMA_RST);
    PDMA_Open(0x4);
    PDMA_SetTransferCnt(2, PDMA_WIDTH_8, 256);
    PDMA_SetTransferAddr(2, (uint32_t)&UART0->DAT, PDMA_SAR_FIX, (uint32_t)DestArray, PDMA_DAR_INC);
    PDMA_SetTransferMode(2, PDMA_UART0_RX, FALSE, 0);
    PDMA_SetBurstType(2, PDMA_REQ_SINGLE, PDMA_BURST_1);
    PDMA_EnableInt(2, PDMA_INT_TRANS_DONE);
    NVIC_EnableIRQ(PDMA_IRQn);
    UART0->INTEN = UART0->INTEN | (1<<15);//UARTO DMA receive enable
}

void PDMA_Set()
{
    PDMA_SetTransferCnt(2, PDMA_WIDTH_8, 256);
    PDMA_SetTransferAddr(2, (uint32_t)&UART0->DAT, PDMA_SAR_FIX, (uint32_t)DestArray, PDMA_DAR_INC);
    PDMA_SetTransferMode(2, PDMA_UART0_RX, FALSE, 0);
    PDMA_SetBurstType(2, PDMA_REQ_SINGLE, PDMA_BURST_1);
    PDMA_EnableInt(2, PDMA_INT_TRANS_DONE);
    NVIC_EnableIRQ(PDMA_IRQn);
    UART0->INTEN = UART0->INTEN | (1<<15);//UARTO DMA receive enable
}
这个函数是这个例子的关键。

mintspring 发表于 2015-6-14 12:01 | 显示全部楼层
中断这个还是比较复杂的,需要配置好多地方,搞的我总是晕乎乎的。
598330983 发表于 2015-6-14 17:55 | 显示全部楼层
我只会时钟中断,IO中断,其他的不会。
 楼主| YWBIN 发表于 2015-6-15 09:38 | 显示全部楼层
gaoyang9992006 发表于 2015-6-8 12:19
按字节定量产生中断,看看这个怎么实现的。

你只要将程序中函数"void PDMA_Init()" 及"void PDMA_Set()"中的"PDMA_SetTransferCnt(2, PDMA_WIDTH_8, 256);"中的256改为你希望中断的字节数,便可实现你上述所说的要求。
 楼主| YWBIN 发表于 2015-6-15 09:40 | 显示全部楼层
芙蓉洞 发表于 2015-6-10 08:38
这个中断是用什么方法产生的呢?

程序中的:
PDMA_EnableInt(2, PDMA_INT_TRANS_DONE);
NVIC_EnableIRQ(PDMA_IRQn);
设定了中断方式(传输完成后中断,即传输256个字节后产生中断)及打开了中断。
 楼主| YWBIN 发表于 2015-6-15 09:42 | 显示全部楼层
598330983 发表于 2015-6-14 17:55
我只会时钟中断,IO中断,其他的不会。

多看看新唐的TRM手册及Democode就会了,新唐的TRM手册还有Democode写得还是挺详细的。
598330983 发表于 2015-6-17 09:11 | 显示全部楼层
嗯,是的,那个例程样例写的真好,现在越来越熟练了。
zhuotuzi 发表于 2017-4-13 21:02 | 显示全部楼层
一不小心搜到这了,学习一下。
xaixia 发表于 2017-4-14 15:38 | 显示全部楼层
同时打开两路通道,分别接收两组来自不同UART的数据,把2个通道的初始化和set函数写在一起,程序各种不工作,分开写两组函数又是各种发疯。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

46

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部