问答

汇集网友智慧,解决技术难题

21ic问答首页 - HC32L130DMA+LPUART发送,用block模式,只能传送一个block

HC ck lpuart DMA ST tc

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个字节。      
回答 +关注 15
2605人浏览 1人回答问题 分享 举报
1 个回答

您需要登录后才可以回复 登录 | 注册