打印
[技术问答]

华大HC32L130J8TA,UART1+DMA功能正常,换成UART0就用不了了,什么原因?

[复制链接]
12580|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
breakP|  楼主 | 2023-11-2 10:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 breakP 于 2023-11-2 10:27 编辑

直接用的例程,这是UART1+DMA可以正常使用,但是换成UART0就不行了,接线,参数都检查过了int32_t main(void)
{  
    //uart端口配置
    App_UartPortInit();

    //UART模块配置
    App_UartCfg();

    //DMA参数配置
    App_DmaCfg();

    while(1)
    {
        if(5 == Dma_GetStat(DmaCh0))                  //完成一次通道传输(UART1_RX -> RAM缓存  2字节)
        {
            Dma_DisableChannel(DmaCh0);               //禁用通道0
            delay10us(100);
            Dma_EnableChannel(DmaCh1);                //使能通道1
            Dma_ClrStat(DmaCh0);                      //清除通道0状态值   
        }
        if(5 == Dma_GetStat(DmaCh1))                  //完成一次通道传输(RAM缓存 -> UART1_TX  2字节)
        {
            Dma_DisableChannel(DmaCh1);               //禁用通道1
            Dma_EnableChannel(DmaCh0);                //使能通道0
            Dma_ClrStat(DmaCh1);                      //清除通道0状态值   
        }
               
    }
}

//UART模块配置
void App_UartCfg(void)
{
    stc_uart_cfg_t  stcCfg;
    stc_uart_baud_t stcBaud;

    DDL_ZERO_STRUCT(stcCfg);                               //初始化变量
    DDL_ZERO_STRUCT(stcBaud);                              //初始化变量

    Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1,TRUE);//使能UART1外设时钟门控开关

    stcCfg.enRunMode = UartMskMode1;                       //模式3
    stcCfg.enStopBit = UartMsk1bit;                        //1位停止位
    stcCfg.stcBaud.u32Baud = 9600;                         //波特率9600
    stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div;             //通道采样分频配置
    stcCfg.stcBaud.u32Pclk = Sysctrl_GetPClkFreq();        //获得外设时钟(PCLK)频率值
    Uart_Init(M0P_UART1, &stcCfg);                         //串口初始化

    Uart_ClrStatus(M0P_UART1,UartRC);                      //清接收请求
    Uart_ClrStatus(M0P_UART1,UartTC);                      //清发送请求

    Uart_EnableFunc(M0P_UART1,UartDmaTxFunc);              //使能DMA发送, DMA相关通道使能后,如果Tx Buff为空,会立马启动传输
    Uart_EnableFunc(M0P_UART1,UartDmaRxFunc);              //使能DMA接收
        

}

//DMA参数配置
void App_DmaCfg(void)
{
    stc_dma_cfg_t stcDmaCfg;

    DDL_ZERO_STRUCT(stcDmaCfg);                                //初始化变量

    Sysctrl_SetPeripheralGate(SysctrlPeripheralDma,TRUE);      //使能DMAC外设时钟门控开关

    //rx dma配置
    stcDmaCfg.u32SrcAddress = 0x40000100;                      //接收数据寄存器地址
    stcDmaCfg.u32DstAddress = (uint32_t)&u8RxData[0];          //接收缓冲
    stcDmaCfg.enSrcAddrReloadCtl = DmaMskSrcAddrReloadEnable;  //使能DMA源地址重载
    stcDmaCfg.enSrcBcTcReloadCtl = DmaMskBcTcReloadEnable;     //使能BC[3:0]和CONFA:TC[15:0]的重载功能
    stcDmaCfg.enDestAddrReloadCtl = DmaMskDstAddrReloadEnable; //使能DMA目的地址重载
    stcDmaCfg.enTransferMode = DmaMskContinuousTransfer;       //连续传输,DMAC传输完成时不清除CONFA:ENS位
    stcDmaCfg.enDstAddrMode = DmaMskDstAddrInc;                //目的地址自增
    stcDmaCfg.enSrcAddrMode = DmaMskSrcAddrFix;                //源地址固定
    stcDmaCfg.u16BlockSize = 1;                                //块传输个数
    stcDmaCfg.u16TransferCnt = 4;                              //块传输次数
    stcDmaCfg.enMode = DmaMskBlock;                            //块(Block)传输
    stcDmaCfg.enTransferWidth = DmaMsk8Bit;                    // 8 bit  字节传输
    stcDmaCfg.enRequestNum = DmaUart1RxTrig;                   //DMA硬件触发源位Uart1Rx
    stcDmaCfg.enPriority = DmaMskPriorityFix;                  //DMA 各通道优先级固定 (CH0>CH1)

    Dma_Enable();                                              //DMA模块使能
    Dma_InitChannel(DmaCh0, &stcDmaCfg);                       //DMA通道0初始化

    DDL_ZERO_STRUCT(stcDmaCfg);                                //初始化变量

    //tx dma配置
    stcDmaCfg.u32SrcAddress = (uint32_t)&u8RxData[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 = DmaUart1TxTrig;                   //DMA硬件触发源位Uart1Tx
    stcDmaCfg.enPriority = DmaMskPriorityFix;                  //DMA 各通道优先级固定 (CH0>CH1)

    Dma_InitChannel(DmaCh1, &stcDmaCfg);                       //DMA通道1初始化
    Dma_EnableChannel(DmaCh0);                                 //使能通道1
        
        
}

//uart端口配置
void App_UartPortInit(void)
{
    stc_gpio_cfg_t stcGpioCfg;

    DDL_ZERO_STRUCT(stcGpioCfg);                               //初始化变量

    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);     //使能GPIO外设时钟门控开关

    stcGpioCfg.enDir = GpioDirOut;
    Gpio_Init(GpioPortA,GpioPin2,&stcGpioCfg);
    Gpio_SetAfMode(GpioPortA,GpioPin2,GpioAf1);                //PA02 配置为UART1 TX
    stcGpioCfg.enDir = GpioDirIn;
    Gpio_Init(GpioPortA,GpioPin3,&stcGpioCfg);
    Gpio_SetAfMode(GpioPortA,GpioPin3,GpioAf1);                //PA03 配置为UART1 RX
}


使用特权

评论回复
来自 2楼
breakP|  楼主 | 2023-11-2 11:51 | 只看该作者
已解决,是DMA收发数据寄存器基地址问题,UART1是0x40000100 UART0是0x40000000

使用特权

评论回复
板凳
breakP|  楼主 | 2023-11-2 10:07 | 只看该作者

UART1+DMA功能正常,换成UART0就用不了了,什么原因?

UART1 TX PA2 RX PA3UART0 TX PB6 RX PB7

复用功能 PA2 PA3是模式1 PB6 PB7是模式2

使用特权

评论回复
地板
tpgf| | 2023-11-7 15:14 | 只看该作者
有没有可能是相关引脚配置的不到位啊

使用特权

评论回复
5
木木guainv| | 2023-11-7 15:51 | 只看该作者
估计还是因为引脚的配置或者是串口的配置有问题

使用特权

评论回复
6
磨砂| | 2023-11-7 16:54 | 只看该作者
uart0的相关引脚有没有下载引脚啊

使用特权

评论回复
7
八层楼| | 2023-11-7 19:19 | 只看该作者
二者的时钟,引脚,以及串口配置都要有

使用特权

评论回复
8
晓伍| | 2023-11-7 19:49 | 只看该作者
是不是还得配置相应串口的时钟啊

使用特权

评论回复
9
xiaoqizi| | 2023-11-7 20:20 | 只看该作者
还需要考虑配置引脚的复用功能模式

使用特权

评论回复
10
caigang13| | 2023-11-8 08:31 | 只看该作者
看下手册UART0和UART1在DMA使用上是不是存在区别

使用特权

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

本版积分规则

2

主题

5

帖子

0

粉丝