问答

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

21ic问答首页 - HC32L110c6ua的串口0无法正常收发

stc 串口 tc ST hc32l110 ar

HC32L110c6ua的串口0无法正常收发

moonsea2026-02-25
这是我的串口0配置,主要通过debug的时候串口寄存器全为0

void Uart0_Init(void)
{
    uint16_t timer=0;
    uint32_t pclk=0;

    stc_uart_config_t  stcConfig;//定义串口结构体
    stc_uart_irq_cb_t stcUartIrqCb;//串口中断回调函数结构体
    stc_uart_multimode_t stcMulti;//串口多主机模式结构体
    stc_uart_baud_config_t stcBaud;//波特率配置结构体
    stc_bt_config_t stcBtConfig;//基础定时器配置结构体


    DDL_ZERO_STRUCT(stcUartIrqCb);//清空数据函数
    DDL_ZERO_STRUCT(stcMulti);
    DDL_ZERO_STRUCT(stcBaud);
    DDL_ZERO_STRUCT(stcBtConfig);



     Gpio_InitIOExt(0,1,GpioDirIn,FALSE,FALSE,FALSE,TRUE); //配置01引脚为输入模式RX
     Gpio_InitIOExt(0,2,GpioDirOut,FALSE,FALSE,FALSE,TRUE);//配置02引脚为输出模式TX

    //通道端口配置
    Gpio_SetFunc_UART0_RXD_P01();//RX输入       
    Gpio_SetFunc_UART0_TXD_P02();//TX输出

    //外设时钟使能
    Clk_SetPeripheralGate(ClkPeripheralBt,TRUE);//模式0/2可以不使能
    Clk_SetPeripheralGate(ClkPeripheralUart0,TRUE);//使能串口时钟


    stcUartIrqCb.pfnRxIrqCb = RxIntCallback;//设置接收中断函数
    stcUartIrqCb.pfnTxIrqCb = NULL;//设置发送中断为空
    stcUartIrqCb.pfnRxErrIrqCb = ErrIntCallback;//设置接收错误中断函数
    stcConfig.pstcIrqCb = &stcUartIrqCb;//将中断函数结构体指针赋值给串口配置
    stcConfig.bTouchNvic = TRUE;//NVIC中断控制器使能标志


    stcConfig.enRunMode = UartMode1;//测试项,更改此处来转换4种模式测试


    //stcMulti.enMulti_mode = UartNormal;//测试项,更改此处来转换多主机模式,mode2/3才有多主机模式

    stcConfig.pstcMultiMode = &stcMulti;//将中断回调函数结构体指针赋值给串口配置结构体

    stcBaud.bDbaud = 0u;//不使能
    stcBaud.u32Baud = 9600u;//设置波特率为9600bps
    stcBaud.u8Mode = UartMode1; //计算波特率需要模式参数
    pclk = Clk_GetPClkFreq();//获取外设始终频率
    timer=Uart_SetBaudRate(UARTCH0,pclk,&stcBaud);//计算波特率对应得定时器

    stcBtConfig.enMD = BtMode2;//基础定时器模式为Mode2
    stcBtConfig.enCT = BtTimer;//基础定时器工作在定时器模式
    Bt_Init(TIM0, &stcBtConfig);//调用basetimer0设置函数产生波特率
    Bt_ARRSet(TIM0,timer);//设计基础定时器0得自动重载值
    Bt_Cnt16Set(TIM0,timer);//设置基础定时器0得计数值
    Bt_Run(TIM0);//启动基础定时器0

    Uart_Init(UARTCH0, &stcConfig);//初始化串口0
    Uart_EnableIrq(UARTCH0,UartRxIrq);//使能串口0中断
    Uart_ClrStatus(UARTCH0,UartRxFull);//清除缓冲区满标志
    Uart_EnableFunc(UARTCH0,UartRx);//使能串口0接收功能
    Uart_EnableFunc(UARTCH0, UartTx);//使能串口0发送功能
}
回答 +关注 1
95人浏览 3人回答问题 分享 举报
3 个回答

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