hc32l130串口使用

hc32l130使用内部晶振,开启串口发送和接受功能,串口工具发送数据给mcu,程序debug并没有进入到中断,下面是启用内部时钟并开启串口功能完整代码。

#include "ddl.h"
#include "uart.h"
#include "gpio.h"
#include "flash.h"
#include "sysctrl.h"


#define T1_PORT     (3)
#define T1_PIN      (3)
volatile static uint8_t u8RxData;
volatile static uint8_t u8TxCnt = 0;
volatile static uint8_t u8RxCnt = 0;

void App_UartCfg(void);
void App_PortInit(void);
void App_ClkCfg(void);

int32 t main (void)
{
App_ClkCfg () ;

App_PortInit () ;

App_UartCfg();
while (1)
{
 if(u8RxCnt>=1)
    {
    u8RxCnt = 0;

    Uart_SendDataIt(MOP_UART1, ~u8RxData);
    }
}

}


void App_ClkCfg(void)
{
    stc_sysctrl_clk_cfg_t sysctrl_clk_cfg;

    Sysctrl_SetPeripheralGate(SysctrlPeripheralFlash, TRUE);

    Flash_WaitCycle(FlashWaitCycle0);

    sysctrl_SetRCHTrim(SysctrlRchFreq8MHz);

    sysctrl_clk_cfg.enClkSrc = SysctrlClkRCH;
    sysctrl_clk_cfg.enHClkDiv = SysctrlHclkDiv1;
    sysctrl_clk_cfg.enPClkDiv = SysctrlPclkDiv1;

    Sysctrl_ClkInit(&sysctrl_clk_cfg);
}

void Uart1_IRQHandler(void)
{
    if(Uart_GetStatue(M0P_UART1, UartRC))
        {
            Uart_ClrStatus(M0P_UART1, UartRC);
            u8RxData = Uart_ReceiveData(M0P_UART1);
            u8RxCnt++;
        }
    if(Uart_GetStatus(M0P_UART1, UartTC))
        {
            Uart_ClrStatus(M0P_UART1, UartTC);
            u8TxCnt++;
        }

}


void App_PortInit(void)
{
    stc_gpio_cfg_t stcGpioCfg;
    DDL_ZERO_STRUCT(stcGpioCfg);
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);

    stcGpioCfg.enDir = GpioDirOut;
    Gpio_Init(GpioPortA, GpioPin2, &stcGpioCfg);
    Gpio_SetAFMode(GpioPortA, GpioPin2, GpioAf1);
    
    stcGpioCfg.enDir = GpioDirIn;
    Gpio_Init(GpioPortA, GpioPin3, &stcGpioCfg);
    Gpio_SetAFMode(GpioPortA, GpioPin3, GpioAf1);
}

void App_UartCfg(void)
{
    stc_uart_cfg_t stcCfg;

    DDL_ZERO_STRUCT(stcCfg);
    Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1, TRUE);

    stcCfg.enRunMode = UartMskMode3;
    stcCfg.enStopBit = UartMsk1bit;
    stcCfg.enMmdorCk = UartMskEven;
    stcCfg.stcBaud.u32Baud = 9600;
    stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div;
    stcCfg.stcBaud.u32Pclk = Sysctrl_GetPClkFreq();
    Uart_Init(M0P_UART1, &stcCfg);

    Uart_ClrStatus(M0P_UART1, UartRC);
    Uart_ClrStatus(M0P_UART1, UartTC);
    Uart_EnableIrq(M0P_UART1, UartRxIrq);
    Uart_EnableIrq(M0P_UART1, UartTxIrq);
    EnableNvic(UART1_IRQn, IrqLevel3, TRUE);
    
}


UART对时钟精度有要求,不知道内部时钟精度如何,如果误差超过2%,不可用于串口通讯。
另外,不知道你是如何判断是否进入串口中断的

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    由于没有具体的错误信息或调试信息,很难判断问题所在,但以下是可能的解决方案:

    1. 确保正确的波特率和数据位设置。 在串口配置中,波特率和数据位设置必须与串口通信的另一端匹配。 如果它们不匹配,将无法正确接收数据。 可以在波特率和数据位设置上打一个断点,检查是否正确。

    2. 检查串口中断的优先级设置。 如果两个或多个中断共享相同的优先级,您可能会发现中断不会触发,因为其他中断正在执行。 您可以使用HAL_NVIC_SetPriority函数来设置中断的优先级。

    3. 确保启用RXNEIE位来启用接收中断。 如果RXNEIE为0,将不会触发中断。 您可以在代码中设置启用RXNEIE的代码段。

    以下是启用内部时钟和启用串口的示例代码:

    /* 使能Perhieral时钟 */
    CLK_Enable(APB0_UART4,CLK_EN_START);
    
    /* 设置UART I/O GPIO复用 */
     GPIO_SetFunc(UART4_RX_PORT, UART4_RX_PIN, UART4_RX_FUNC);
     GPIO_SetFunc(UART4_TX_PORT, UART4_TX_PIN, UART4_TX_FUNC);
    
    /* UART初始化结构体定义并初始化配置0x22 - 8位数据,无奇偶,1个停止位 */
    stc_uart_init_t stcUart4Init;
    
    stcUart4Init.u32Baudrate = 115200;
    stcUart4Init.u32SmplTime = UART_SOT_8BIT;
    
    UART_IrqCallback(UART4,UART_RX_IRQ,Uart4_RxCallback);
    UART_IrqCallback(UART4,UART_TX_IRQ,Uart4_TxCallback);
    UART_IrqCallback(UART4,UART_PE_IRQ,Uart4_PeCallback);
    
    /* UART串口初始化 */
    UART_Init(UART4, &stcUart4Init);
    

    Uart4_RxCallback, Uart4_TxCallback和Uart4_PeCallback是回调函数,用于处理中断。 下面是一个Uart4_RxCallback的例子:

    /**
     *******************************************************************************
     ** \brief UART4串口中断服务函数-接收中断
     **
     ** \param [in] u8Param 中断参数
     **
     ** \retval 无
     **
     ******************************************************************************/
    void Uart4_RxCallback(uint8_t u8Param)
    {
        /* 接收数据 */
        uint8_t u8Data;
    
        u8Data = UART_ReadData(UART4);
        //TODO:处理数据
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^