我是照着官方例程写的,官方的例程,可以进串口中断回调函数,我自己不行,串口配置代码如下- #include "bsp_uart.h"
- uint8_t rxdata;
- static void Uart1_GPIO_Init(void)
- {
- stc_gpio_cfg_t stcGpioCfg;
-
- DDL_ZERO_STRUCT(stcGpioCfg);
-
- Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);
-
- ///<TX->PA0
- stcGpioCfg.enDir = GpioDirOut;
- Gpio_Init(GpioPortA,GpioPin0,&stcGpioCfg);
- Gpio_SetAfMode(GpioPortA,GpioPin0,GpioAf2); //配置PA00为LPUART1_TX
-
- //<RX->PA1
- stcGpioCfg.enDir = GpioDirIn;
- Gpio_Init(GpioPortA,GpioPin1,&stcGpioCfg);
- Gpio_SetAfMode(GpioPortA,GpioPin1,GpioAf2); //配置PA01为LPUART1_RX
- }
- void Uart1_Init(void)
- {
- stc_lpuart_cfg_t stcCfg;
- DDL_ZERO_STRUCT(stcCfg);
- Uart1_GPIO_Init();
- ///<外设模块时钟使能
- Sysctrl_SetPeripheralGate(SysctrlPeripheralLpUart1,TRUE);
-
- ///<LPUART 初始化
- stcCfg.enStopBit = LPUart1bit; ///<1停止位
- stcCfg.enMmdorCk = LPUartDataOrAddr; ///<偶校验
- stcCfg.stcBaud.enSclkSel = LPUartMskPclk; ///<传输时钟源
- stcCfg.stcBaud.u32Sclk = Sysctrl_GetPClkFreq(); ///<PCLK获取
- stcCfg.stcBaud.enSclkDiv = LPUartMsk4Or8Div; ///<采样分频
- stcCfg.stcBaud.u32Baud = 115200; ///<波特率
- stcCfg.enRunMode = LPUartMskMode3; ///<工作模式
- LPUart_Init(M0P_LPUART1, &stcCfg);
-
- ///<LPUART 中断使能
- LPUart_ClrStatus(M0P_LPUART1,LPUartRC); ///<清接收中断请求
- LPUart_ClrStatus(M0P_LPUART1,LPUartTC); ///<清发送中断请求
- LPUart_DisableIrq(M0P_LPUART1,LPUartRxIrq); ///<禁止接收中断
- LPUart_EnableIrq(M0P_LPUART1,LPUartTxIrq); ///<使能发送中断
- EnableNvic(LPUART1_IRQn,IrqLevel3,TRUE); ///<系统中断使能
- }
- ///<LPUART1 中断服务函数
- void LpUart1_IRQHandler(void)
- {
- if(LPUart_GetStatus(M0P_LPUART1, LPUartTC))
- {
- LPUart_ClrStatus(M0P_LPUART1, LPUartTC); ///<清发送中断请求
-
- LPUart_DisableIrq(M0P_LPUART1,LPUartTxIrq);///<禁止发送中断
- LPUart_EnableIrq(M0P_LPUART1,LPUartRxIrq); ///<使能接收中断
- }
-
- if(LPUart_GetStatus(M0P_LPUART1, LPUartRC)) ///接收数据
- {
- LPUart_ClrStatus(M0P_LPUART1, LPUartRC); ///<清接收中断请求
- rxdata = LPUart_ReceiveData(M0P_LPUART1);///读取数据
-
- LPUart_DisableIrq(M0P_LPUART1,LPUartRxIrq);///<禁止接收中断
- LPUart_EnableIrq(M0P_LPUART1,LPUartTxIrq); ///<使能发送中断
-
- LPUart_SendDataIt(M0P_LPUART1, rxdata); ///把接收数据取反,并发送
- }
- }
main函数:- int32_t main(void)
- {
- App_SystemClkInit_PLL48M_byXTH();
- Uart1_Init();
- // p1 = LpUart1_IRQHandler;
-
- //发送数据
- LPUart_SendDataIt(M0P_LPUART1, 0x55);
- while(1)
- {
- ;
- }
- }
调试的时候可以interrupts_hc32l07x.c的中断函数入口- /**
- *******************************************************************************
- ** \brief LPUART1 低功耗串口1 中断处理函数
- **
- ** \retval
- ******************************************************************************/
- void LPUART1_IRQHandler(void)
- {
- #if (INT_CALLBACK_ON == INT_CALLBACK_LPUART1)
- LpUart1_IRQHandler();
- #endif
- }
代码能跑到LpUart1_IRQHandler()这一句,但是没法进我自己写中断回调函数,感觉像程序找不到我自己写的中断回调函数一样,但是如果把main函数中的p1 = LpUart1_IRQHandler这一句注释去掉,就可以找了我自己写的中断回调函数,其实这一句什么也没干,就是中断回调函数的指针赋值给p1了,然后程序就能够进入我自己写的中断回调函数,这是什么原因,有人清楚吗?
|