21ic问答首页 - 请教HC32L196KCTA 串口0只能发送 无法接收
请教HC32L196KCTA 串口0只能发送 无法接收
IchBinMarcel2021-08-18
最近在使用HC32L196这款芯片进行开发,但是发现UART0 只能发送 不能接收,代码我贴在下面,个位大佬帮我看看问题出在哪里
下载视频
//uart0 gpio配置
stc_gpio_cfg_t stcGpioCfg;
DDL_ZERO_STRUCT(stcGpioCfg);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); ///<使能GPIO外设时钟门控开关
//配置PB8、PB9为串口0
stcGpioCfg.enDir = GpioDirOut;
stcGpioCfg.enPu = GpioPuEnable;
stcGpioCfg.enOD = GpioOdEnable;
Gpio_Init(GpioPortB,GpioPin8,&stcGpioCfg);
Gpio_SetAfMode(GpioPortB,GpioPin8,GpioAf7); ///<配置PB8 为UART0 TX
stcGpioCfg.enDir = GpioDirIn;
stcGpioCfg.enPu = GpioPuEnable;
stcGpioCfg.enOD = GpioOdEnable;
Gpio_Init(GpioPortB,GpioPin9,&stcGpioCfg);
Gpio_SetAfMode(GpioPortB,GpioPin9,GpioAf7); ///<配置PB9 为UART0 RX
//uart0配置
stc_uart_cfg_t stcCfg;
stc_uart_baud_t stcBaud;
DDL_ZERO_STRUCT(stcCfg);
DDL_ZERO_STRUCT(stcBaud);
Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0,TRUE); ///<使能UART0外设时钟门控开关
///<UART Init
stcCfg.enRunMode = UartMskMode3; ///<模式3
stcCfg.enStopBit = UartMsk1bit; ///<1bit停止位
stcCfg.enMmdorCk = UartMskDataOrAddr; ///<多机模式时
stcCfg.stcBaud.u32Baud = 57600; ///<波特率57600
stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div; ///<通道采样分频配置
stcCfg.stcBaud.u32Pclk = Sysctrl_GetPClkFreq(); ///<获得外设时钟(PCLK)频率值
Uart_Init(M0P_UART0, &stcCfg); ///<串口初始化
///<UART中断使能
Uart_ClrStatus(M0P_UART0,UartRC); ///<清接收请求
Uart_ClrStatus(M0P_UART0,UartTC); ///<清接收请求
Uart_EnableIrq(M0P_UART0,UartRxIrq); ///<使能串口接收中断
// Uart_EnableIrq(M0P_UART0,UartTxIrq); ///<使能串口发送中断
EnableNvic(UART0_2_IRQn, IrqLevel3, TRUE); ///<系统中断使能
void Uart0_IRQHandler(void)
{
if(Uart_GetStatus(M0P_UART0, UartRC)) //UART0数据接收
{
Uart_ClrStatus(M0P_UART0, UartRC); //清中断状态位
u8RxData[u8RxCnt]=Uart_ReceiveData(M0P_UART0);
u8RxCnt++;
}
if(Uart_GetStatus(M0P_UART0, UartTC)) //UART0数据发送
{
Uart_ClrStatus(M0P_UART0, UartTC); //清中断状态位
}
}
以上代码我用了串口调试软件,可以正常接收到板子发出来的信息,但是用串口软件向板子发信息,无法进入串口0的接收中断!
而且,对于串口发送函数我也比较疑惑
HC32L196提供了两个串口发送函数
1、en_result_t Uart_SendDataPoll(M0P_UART_TypeDef* UARTx, uint8_t u8Data)
2、en_result_t Uart_SendDataIt(M0P_UART_TypeDef* UARTx, uint8_t u8Data)
在开启串口发送中断的情况下,用第一个函数是发不出去消息的,只能关了发送中断才能正常发
如果想用第二个发送函数,就要开启中断,然后在中断里进行数据的发送,非常的不方便。
各位有没有相似的经验可以知道我一下,我之前都用STM32,第一次用国产的,被搞得有点懵了。。。
下载视频
//uart0 gpio配置
stc_gpio_cfg_t stcGpioCfg;
DDL_ZERO_STRUCT(stcGpioCfg);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); ///<使能GPIO外设时钟门控开关
//配置PB8、PB9为串口0
stcGpioCfg.enDir = GpioDirOut;
stcGpioCfg.enPu = GpioPuEnable;
stcGpioCfg.enOD = GpioOdEnable;
Gpio_Init(GpioPortB,GpioPin8,&stcGpioCfg);
Gpio_SetAfMode(GpioPortB,GpioPin8,GpioAf7); ///<配置PB8 为UART0 TX
stcGpioCfg.enDir = GpioDirIn;
stcGpioCfg.enPu = GpioPuEnable;
stcGpioCfg.enOD = GpioOdEnable;
Gpio_Init(GpioPortB,GpioPin9,&stcGpioCfg);
Gpio_SetAfMode(GpioPortB,GpioPin9,GpioAf7); ///<配置PB9 为UART0 RX
//uart0配置
stc_uart_cfg_t stcCfg;
stc_uart_baud_t stcBaud;
DDL_ZERO_STRUCT(stcCfg);
DDL_ZERO_STRUCT(stcBaud);
Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0,TRUE); ///<使能UART0外设时钟门控开关
///<UART Init
stcCfg.enRunMode = UartMskMode3; ///<模式3
stcCfg.enStopBit = UartMsk1bit; ///<1bit停止位
stcCfg.enMmdorCk = UartMskDataOrAddr; ///<多机模式时
stcCfg.stcBaud.u32Baud = 57600; ///<波特率57600
stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div; ///<通道采样分频配置
stcCfg.stcBaud.u32Pclk = Sysctrl_GetPClkFreq(); ///<获得外设时钟(PCLK)频率值
Uart_Init(M0P_UART0, &stcCfg); ///<串口初始化
///<UART中断使能
Uart_ClrStatus(M0P_UART0,UartRC); ///<清接收请求
Uart_ClrStatus(M0P_UART0,UartTC); ///<清接收请求
Uart_EnableIrq(M0P_UART0,UartRxIrq); ///<使能串口接收中断
// Uart_EnableIrq(M0P_UART0,UartTxIrq); ///<使能串口发送中断
EnableNvic(UART0_2_IRQn, IrqLevel3, TRUE); ///<系统中断使能
void Uart0_IRQHandler(void)
{
if(Uart_GetStatus(M0P_UART0, UartRC)) //UART0数据接收
{
Uart_ClrStatus(M0P_UART0, UartRC); //清中断状态位
u8RxData[u8RxCnt]=Uart_ReceiveData(M0P_UART0);
u8RxCnt++;
}
if(Uart_GetStatus(M0P_UART0, UartTC)) //UART0数据发送
{
Uart_ClrStatus(M0P_UART0, UartTC); //清中断状态位
}
}
以上代码我用了串口调试软件,可以正常接收到板子发出来的信息,但是用串口软件向板子发信息,无法进入串口0的接收中断!
而且,对于串口发送函数我也比较疑惑
HC32L196提供了两个串口发送函数
1、en_result_t Uart_SendDataPoll(M0P_UART_TypeDef* UARTx, uint8_t u8Data)
2、en_result_t Uart_SendDataIt(M0P_UART_TypeDef* UARTx, uint8_t u8Data)
在开启串口发送中断的情况下,用第一个函数是发不出去消息的,只能关了发送中断才能正常发
如果想用第二个发送函数,就要开启中断,然后在中断里进行数据的发送,非常的不方便。
各位有没有相似的经验可以知道我一下,我之前都用STM32,第一次用国产的,被搞得有点懵了。。。
赞0
下载视频
while (Uart_GetStatus(M0P_UART0, UartTxe)==FALSE); //等待上次传输完成
Uart_SendDataIt(M0P_UART0, (uint8_t)USART0_TX_BUF[j]);
将UartTxe用了UartTC,导致卡死在while循环,换成UartTxe就好了
评论
2021-08-18
您需要登录后才可以回复 登录 | 注册