打印
[技术问答]

HC32L130使用LPUART+DMA,只能发送1个字节的问题

[复制链接]
2819|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
maxfall|  楼主 | 2021-7-30 18:07 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 maxfall 于 2021-8-2 12:28 编辑

请教各位一个问题:
使用LPUART0+DMA,发送4个字节,结果查看寄存器,SRCADR只前进了一位,就卡住了,貌似LPUART没给DMATRIG信号
这里先作揖谢过了

代码如下:
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
   
}

lpuart.png (220 KB )

lpuart.png

dma.png (26.09 KB )

dma.png

使用特权

评论回复
沙发
maxfall|  楼主 | 2021-7-31 08:36 | 只看该作者
用中断方式可以正常通信

使用特权

评论回复
板凳
maxfall|  楼主 | 2021-8-2 17:58 | 只看该作者
实在对不住,原来是目标地址搞错了,应该是 stcDmaCfg.u32DstAddress = 0x40000200;     

使用特权

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

本版积分规则

5

主题

16

帖子

1

粉丝