在线时间28 小时
UID3450027
注册时间2018-11-12
NXP金币0
TA的每日心情 | 无聊 2024-6-3 15:51 |
---|
签到天数: 19 天 连续签到: 1 天 [LV.4]偶尔看看III
中级会员
 
- 积分
- 246
- 最后登录
- 2024-9-4
|
在用dma的方式写串口接收实验,无反应,串口工作正常,代码如下,
#include "dma.h"
uint32_t DMACCDestAddr_Value[8]={0,0,0,0,0,0,0,0}; //定义目标存储器
/******************************************************************************************************************
* DMA初始化函数:
* 1.时钟初始化 -PCONP位29位GPDMA的时钟控制位
* 2.清除相关标志位 通道位的[2:3]位为 UART1的TX和UART1的RX
* 3.配置相关通道寄存器
* 4.使能DMA控制器及使能相关通道
******************************************************************************************************************/
void UART1_DMA_Config(void)
{
LPC_SC->PCONP |= 1UL<<29; //开启GPDMA的时钟
LPC_GPDMA->DMACIntTCClear |= 0x01; //清除通道0中断终端计数标志
LPC_GPDMA->DMACIntErrClr |= 0x01; //清除通道0中断错误标志
LPC_GPDMACH0->DMACCLLI = 0; //下一个链表项无效,本次DMA
LPC_GPDMACH0->DMACCConfig |= (P2M<<11UL) //DMA的工作模式是用外设到存储器的模式
| (11UL<<1UL) //选择DMA传输的源外设为UART1_RX
| (0x00<<6UL); //选择DMA传输的目标是存储器
LPC_GPDMACH0->DMACCControl |= (0x08<<0UL) //突发传输大小为8
| (0x02<<12UL) //源突发大小为8
| (0x02<<15UL) //目标突发大小为8
| (0x00<<18UL) //源传输数据宽度为8
| (0x00<<21UL) //目标传输数据宽度为8
| (0x00<<26UL) //指定源地址不自动增加
| (0x01<<27UL) //指定目标地址自动增加
| (((uint32_t)0x01)<<31UL); //允许触发终端计数中断
LPC_GPDMACH0->DMACCSrcAddr = (uint32_t)&(LPC_UART1->RBR); //源地址
LPC_GPDMACH0->DMACCDestAddr = (uint32_t)& DMACCDestAddr_Value; //目标地址
LPC_GPDMA ->DMACConfig = 0x01; //DMA控制器使能,默认小端模式
LPC_GPDMACH0 ->DMACCConfig |= 0x01; //DMACH0通道使能
NVIC_SetPriority(DMA_IRQn,1);
NVIC_EnableIRQ(DMA_IRQn); //使能DMA中断
}
/*************DMA 中断处理*************************************************************************/
void DMA_IRQHandler(void)
{
LPC_GPIO2->FIOCLR |= (1UL<<3);
if(((LPC_GPDMA->DMACRawIntTCStat)&0x01)==1){ //通道0有效的终端计数中断请求
LPC_GPDMA->DMACIntTCClear |= 0x01; //清除通道0终端计数中断标志
LPC_GPDMACH0->DMACCDestAddr = (uint32_t)& DMACCDestAddr_Value; //初始化目标源地址
LPC_GPIO2->FIOSET |= (1UL<<2);
}
}
int main()
{
Delay_Init();
Running_Check();
LED_Config();
Uart1_Config(115200);
UART1_DMA_Config();
LPC_GPIO2->FIOCLR |= (1UL<<2);
while(1)
{
}
}
|
|