打印
[DemoCode下载]

M451系列UART0通过DMA接收数据的DemoCode

[复制链接]
3043|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

沙发
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
}
这个函数是这个例子的关键。

使用特权

评论回复
5
mintspring| | 2015-6-14 12:01 | 只看该作者
中断这个还是比较复杂的,需要配置好多地方,搞的我总是晕乎乎的。

使用特权

评论回复
6
598330983| | 2015-6-14 17:55 | 只看该作者
我只会时钟中断,IO中断,其他的不会。

使用特权

评论回复
7
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改为你希望中断的字节数,便可实现你上述所说的要求。

使用特权

评论回复
8
YWBIN|  楼主 | 2015-6-15 09:40 | 只看该作者
芙蓉洞 发表于 2015-6-10 08:38
这个中断是用什么方法产生的呢?

程序中的:
PDMA_EnableInt(2, PDMA_INT_TRANS_DONE);
NVIC_EnableIRQ(PDMA_IRQn);
设定了中断方式(传输完成后中断,即传输256个字节后产生中断)及打开了中断。

使用特权

评论回复
9
YWBIN|  楼主 | 2015-6-15 09:42 | 只看该作者
598330983 发表于 2015-6-14 17:55
我只会时钟中断,IO中断,其他的不会。

多看看新唐的TRM手册及Democode就会了,新唐的TRM手册还有Democode写得还是挺详细的。

使用特权

评论回复
10
598330983| | 2015-6-17 09:11 | 只看该作者
嗯,是的,那个例程样例写的真好,现在越来越熟练了。

使用特权

评论回复
11
zhuotuzi| | 2017-4-13 21:02 | 只看该作者
一不小心搜到这了,学习一下。

使用特权

评论回复
12
xaixia| | 2017-4-14 15:38 | 只看该作者
同时打开两路通道,分别接收两组来自不同UART的数据,把2个通道的初始化和set函数写在一起,程序各种不工作,分开写两组函数又是各种发疯。。。

使用特权

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

本版积分规则

21

主题

46

帖子

1

粉丝