我是照着官方例程写的,官方的例程,可以进串口中断回调函数,我自己不行,串口配置代码如下#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了,然后程序就能够进入我自己写的中断回调函数,这是什么原因,有人清楚吗?
|