打印
[技术问答]

HC32L073KATA不进串口中断回调函数

[复制链接]
2328|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我是照着官方例程写的,官方的例程,可以进串口中断回调函数,我自己不行,串口配置代码如下
#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了,然后程序就能够进入我自己写的中断回调函数,这是什么原因,有人清楚吗?

使用特权

评论回复
沙发
wubangmi| | 2021-11-10 14:42 | 只看该作者
你自己建的工程,漏了些配置

1636526448877.jpg (116.49 KB )

1636526448877.jpg

使用特权

评论回复
板凳
tangjie123|  楼主 | 2021-11-10 14:57 | 只看该作者
wubangmi 发表于 2021-11-10 14:42
你自己建的工程,漏了些配置

我刚刚应该猜测应该是编译配置问题,照着官方的模版,我也找到了这里,所以,加上这一句是什么意思了?

使用特权

评论回复
地板
wubangmi| | 2021-11-10 15:04 | 只看该作者
tangjie123 发表于 2021-11-10 14:57
我刚刚应该猜测应该是编译配置问题,照着官方的模版,我也找到了这里,所以,加上这一句是什么意思了? ...

大概就是防止被编译器优化吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

13

帖子

0

粉丝