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%,不可用于串口通讯。
另外,不知道你是如何判断是否进入串口中断的
由于没有具体的错误信息或调试信息,很难判断问题所在,但以下是可能的解决方案:
确保正确的波特率和数据位设置。 在串口配置中,波特率和数据位设置必须与串口通信的另一端匹配。 如果它们不匹配,将无法正确接收数据。 可以在波特率和数据位设置上打一个断点,检查是否正确。
检查串口中断的优先级设置。 如果两个或多个中断共享相同的优先级,您可能会发现中断不会触发,因为其他中断正在执行。 您可以使用HAL_NVIC_SetPriority函数来设置中断的优先级。
确保启用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:处理数据
}