21ic问答首页 - HC32L130DMA+LPUART发送,用block模式,只能传送一个block
HC32L130DMA+LPUART发送,用block模式,只能传送一个block
maxfall2021-08-02
请教各位一个问题:
使用LPUART0+DMA,发送4个字节,结果查看寄存器,SRCADR只前进了一位,就卡住了,貌似LPUART没给DMA触发信号
代码如下:
uint8_t u8TxData[8] = {'A','T','\r','\n'}; //addr: 0x20000000
int32_t main(void)
{
uint32_t i;
//uart端口配置
App_UartPortInit();
//UART模块配置
App_UartCfg();
//DMA参数配置
App_DmaCfg();
while(1)
{
if(5 == Dma_GetStat(DmaCh1))
{
//清除通道0状态值
Dma_DisableChannel(DmaCh1);
break;
}
}
while(1){
}
}
//UART模块配置
void App_UartCfg(void)
{
stc_lpuart_cfg_t stcCfg;
DDL_ZERO_STRUCT(stcCfg);
///<外设模块时钟使能
Sysctrl_SetPeripheralGate(SysctrlPeripheralLpUart0,TRUE);
///<LPUART 初始化
stcCfg.enStopBit = LPUart1bit; ///<1停止位
stcCfg.enMmdorCk = LPUartDataOrAddr; ///<偶校验
stcCfg.stcBaud.enSclkSel = LPUartMskPclk; ///<传输时钟源
stcCfg.stcBaud.u32Sclk = Sysctrl_GetPClkFreq(); ///<PCLK获取
stcCfg.stcBaud.enSclkDiv = LPUartMsk4Or8Div; ///<采样分频
stcCfg.stcBaud.u32Baud = 9600; ///<波特率
stcCfg.enRunMode = LPUartMskMode1; ///<工作模式
LPUart_Init(M0P_LPUART0, &stcCfg);
///<LPUART 中断使能
LPUart_ClrStatus(M0P_LPUART0,LPUartRC); ///<清接收中断请求
LPUart_ClrStatus(M0P_LPUART0,LPUartTC); ///<清发送中断请求
LPUart_EnableFunc(M0P_LPUART0,LPUartDmaTxFunc); //使能DMA发送, DMA相关通道使能后,如果Tx Buff为空,会立马启动传输
// LPUart_EnableFunc(M0P_LPUART0,LPUartDmaRxFunc); //使能DMA接收
}
//DMA参数配置
void App_DmaCfg(void)
{
stc_dma_cfg_t stcDmaCfg;
DDL_ZERO_STRUCT(stcDmaCfg); //初始化变量
Sysctrl_SetPeripheralGate(SysctrlPeripheralDma,TRUE); //使能DMAC外设时钟门控开关
DDL_ZERO_STRUCT(stcDmaCfg); //初始化变量
//tx dma配置
stcDmaCfg.u32SrcAddress = (uint32_t)&u8TxData[0]; //接收数据缓存
stcDmaCfg.u32DstAddress = 0x40000100; //发送数据寄存器地址
stcDmaCfg.enSrcAddrReloadCtl = DmaMskSrcAddrReloadEnable; //使能DMA源地址重载
stcDmaCfg.enSrcBcTcReloadCtl = DmaMskBcTcReloadEnable; //使能BC[3:0]和CONFA:TC[15:0]的重载功能
stcDmaCfg.enDestAddrReloadCtl = DmaMskDstAddrReloadEnable; //使能DMA目的地址重载
stcDmaCfg.enTransferMode = DmaMskOneTransfer; //一次传输,DMAC传输完成时清除CONFA:ENS位
stcDmaCfg.enDstAddrMode = DmaMskDstAddrFix; //目的地址固定
stcDmaCfg.enSrcAddrMode = DmaMskSrcAddrInc; //源地址自增
stcDmaCfg.u16BlockSize = 1; //块传输个数
stcDmaCfg.u16TransferCnt = 4; //块传输次数,一次传输一个字节,传输两次
stcDmaCfg.enMode = DmaMskBlock; //块(Block)传输
stcDmaCfg.enTransferWidth = DmaMsk8Bit; // 8 bit 字节传输
stcDmaCfg.enRequestNum = DmaLpUart0TxTrig; //DMA硬件触发源位Uart1Tx
stcDmaCfg.enPriority = DmaMskPriorityFix; //DMA 各通道优先级固定 (CH0>CH1)
Dma_Enable(); //DMA模块使能
Dma_InitChannel(DmaCh1, &stcDmaCfg); //DMA通道1初始化
Dma_EnableChannel(DmaCh1); //使能通道1
}
//uart端口配置
void App_UartPortInit(void)
{
stc_gpio_cfg_t stcGpioCfg;
DDL_ZERO_STRUCT(stcGpioCfg);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);
///<TX
stcGpioCfg.enDir = GpioDirOut;
Gpio_Init(GpioPortB,GpioPin0,&stcGpioCfg);
Gpio_SetAfMode(GpioPortB,GpioPin0,GpioAf3); //配置PA00为LPUART1_TX
//<RX
stcGpioCfg.enDir = GpioDirIn;
Gpio_Init(GpioPortB,GpioPin11,&stcGpioCfg);
Gpio_SetAfMode(GpioPortB,GpioPin11,GpioAf3); //配置PA01为LPUART1_RX
}
如果 改成 stcDmaCfg.u16BlockSize = 4;
stcDmaCfg.u16TransferCnt = 1; 就能传输4个字节。
使用LPUART0+DMA,发送4个字节,结果查看寄存器,SRCADR只前进了一位,就卡住了,貌似LPUART没给DMA触发信号
代码如下:
uint8_t u8TxData[8] = {'A','T','\r','\n'}; //addr: 0x20000000
int32_t main(void)
{
uint32_t i;
//uart端口配置
App_UartPortInit();
//UART模块配置
App_UartCfg();
//DMA参数配置
App_DmaCfg();
while(1)
{
if(5 == Dma_GetStat(DmaCh1))
{
//清除通道0状态值
Dma_DisableChannel(DmaCh1);
break;
}
}
while(1){
}
}
//UART模块配置
void App_UartCfg(void)
{
stc_lpuart_cfg_t stcCfg;
DDL_ZERO_STRUCT(stcCfg);
///<外设模块时钟使能
Sysctrl_SetPeripheralGate(SysctrlPeripheralLpUart0,TRUE);
///<LPUART 初始化
stcCfg.enStopBit = LPUart1bit; ///<1停止位
stcCfg.enMmdorCk = LPUartDataOrAddr; ///<偶校验
stcCfg.stcBaud.enSclkSel = LPUartMskPclk; ///<传输时钟源
stcCfg.stcBaud.u32Sclk = Sysctrl_GetPClkFreq(); ///<PCLK获取
stcCfg.stcBaud.enSclkDiv = LPUartMsk4Or8Div; ///<采样分频
stcCfg.stcBaud.u32Baud = 9600; ///<波特率
stcCfg.enRunMode = LPUartMskMode1; ///<工作模式
LPUart_Init(M0P_LPUART0, &stcCfg);
///<LPUART 中断使能
LPUart_ClrStatus(M0P_LPUART0,LPUartRC); ///<清接收中断请求
LPUart_ClrStatus(M0P_LPUART0,LPUartTC); ///<清发送中断请求
LPUart_EnableFunc(M0P_LPUART0,LPUartDmaTxFunc); //使能DMA发送, DMA相关通道使能后,如果Tx Buff为空,会立马启动传输
// LPUart_EnableFunc(M0P_LPUART0,LPUartDmaRxFunc); //使能DMA接收
}
//DMA参数配置
void App_DmaCfg(void)
{
stc_dma_cfg_t stcDmaCfg;
DDL_ZERO_STRUCT(stcDmaCfg); //初始化变量
Sysctrl_SetPeripheralGate(SysctrlPeripheralDma,TRUE); //使能DMAC外设时钟门控开关
DDL_ZERO_STRUCT(stcDmaCfg); //初始化变量
//tx dma配置
stcDmaCfg.u32SrcAddress = (uint32_t)&u8TxData[0]; //接收数据缓存
stcDmaCfg.u32DstAddress = 0x40000100; //发送数据寄存器地址
stcDmaCfg.enSrcAddrReloadCtl = DmaMskSrcAddrReloadEnable; //使能DMA源地址重载
stcDmaCfg.enSrcBcTcReloadCtl = DmaMskBcTcReloadEnable; //使能BC[3:0]和CONFA:TC[15:0]的重载功能
stcDmaCfg.enDestAddrReloadCtl = DmaMskDstAddrReloadEnable; //使能DMA目的地址重载
stcDmaCfg.enTransferMode = DmaMskOneTransfer; //一次传输,DMAC传输完成时清除CONFA:ENS位
stcDmaCfg.enDstAddrMode = DmaMskDstAddrFix; //目的地址固定
stcDmaCfg.enSrcAddrMode = DmaMskSrcAddrInc; //源地址自增
stcDmaCfg.u16BlockSize = 1; //块传输个数
stcDmaCfg.u16TransferCnt = 4; //块传输次数,一次传输一个字节,传输两次
stcDmaCfg.enMode = DmaMskBlock; //块(Block)传输
stcDmaCfg.enTransferWidth = DmaMsk8Bit; // 8 bit 字节传输
stcDmaCfg.enRequestNum = DmaLpUart0TxTrig; //DMA硬件触发源位Uart1Tx
stcDmaCfg.enPriority = DmaMskPriorityFix; //DMA 各通道优先级固定 (CH0>CH1)
Dma_Enable(); //DMA模块使能
Dma_InitChannel(DmaCh1, &stcDmaCfg); //DMA通道1初始化
Dma_EnableChannel(DmaCh1); //使能通道1
}
//uart端口配置
void App_UartPortInit(void)
{
stc_gpio_cfg_t stcGpioCfg;
DDL_ZERO_STRUCT(stcGpioCfg);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);
///<TX
stcGpioCfg.enDir = GpioDirOut;
Gpio_Init(GpioPortB,GpioPin0,&stcGpioCfg);
Gpio_SetAfMode(GpioPortB,GpioPin0,GpioAf3); //配置PA00为LPUART1_TX
//<RX
stcGpioCfg.enDir = GpioDirIn;
Gpio_Init(GpioPortB,GpioPin11,&stcGpioCfg);
Gpio_SetAfMode(GpioPortB,GpioPin11,GpioAf3); //配置PA01为LPUART1_RX
}
如果 改成 stcDmaCfg.u16BlockSize = 4;
stcDmaCfg.u16TransferCnt = 1; 就能传输4个字节。
赞0
评论
2021-08-02
您需要登录后才可以回复 登录 | 注册