ConfidenceMan_ 2024-03-19 17:40 采纳率: 0%
浏览 28

keil5在debug时关于中断函数

keil5在debug的时候,如果手动一行一行执行代码,就不会跳进中断函数里。除非是在中断函数中加断点才能在显示,但是这样就无法看到是哪一行代码执行之后进入的中断。那请问如何知道什么时候触发中断了呢?

  • 写回答

2条回答 默认 最新

  • 码农阿豪 Java领域优质创作者 2024-03-19 17:40
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题描述:在使用Keil5进行debug时,手动执行代码不会进入中断函数,除非在中断函数中加断点。但这样就无法知道是哪一行代码触发了中断,如何解决? 答案:
    1. 使用Watch窗口 在Debug模式中,打开Watch窗口,可以监视全局变量、寄存器和内存,其中可以添加一个变量IRQn,该变量为当前中断的中断号。当中断发生时,IRQn的值会被更新,可以通过其值来判断是哪个中断被触发了。 例如,我们要监视USART1的中断,可以在Watch窗口中添加IRQn变量,并设置值为USART1_IRQn,如下图所示。 当USART1接收到数据时,中断会被触发,此时Watch窗口中的IRQn的值会被更新为USART1_IRQn,如下图所示。
    2. 使用系统日志 Keil提供了系统日志功能,可以用于记录代码的执行情况,包括中断的触发情况。可以在代码中添加日志输出语句,在中断函数中输出中断号和触发时间等信息。在Debug模式中,打开日志窗口,可以查看系统日志。 例如,我们可以在USART1的中断函数中添加以下日志输出语句:
    void USART1_IRQHandler(void)
    {
        // 输出日志
        printf("USART1_IRQHandler is called, time: %d\r\n", TIM2->CNT);
      
        // ...
    }
    

    其中,TIM2->CNT表示当前时间,可以用于记录中断触发的时间。在Debug模式中,打开日志窗口,可以查看日志输出。 3. 使用断点 在中断函数的入口处设置断点,当中断触发时,程序会停在该断点处,此时可以查看程序状态和变量值等信息,以确定是哪个中断触发了。 例如,我们在USART1的中断函数入口处设置断点,如下图所示。 当USART1接收到数据时,程序会停在断点处,此时可以查看程序状态和变量值等信息,以确定是哪个中断触发了,如下图所示。 代码示例: 以下是一个使用日志输出的示例代码,可以用于记录中断的触发情况。

    #include <stdio.h>
    #include "stm32f4xx.h"
    int main(void)
    {
        // 初始化USART1
        // ...
        // 初始化TIM2
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
        TIM_TimeBaseInitStruct.TIM_Period = 0xFFFF;
        TIM_TimeBaseInitStruct.TIM_Prescaler = 84 - 1;
        TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
        TIM_Cmd(TIM2, ENABLE);
        // 注册中断函数
        NVIC_InitTypeDef NVIC_InitStruct;
        NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStruct);
        // 启动USART1接收
        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
        // 输出日志
        printf("Program started.\r\n");
        while (1)
        {
            // ...
        }
    }
    void USART1_IRQHandler(void)
    {
        // 输出日志
        printf("USART1_IRQHandler is called, time: %d\r\n", TIM2->CNT);
        // 处理接收数据
        uint8_t data = USART_ReceiveData(USART1);
        // ...
    }
    
    评论

报告相同问题?

问题事件

  • 创建了问题 3月19日

悬赏问题

  • ¥20 access多表提取相同字段数据并合并
  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算
  • ¥15 powerbuilder中的datawindow数据整合到新的DataWindow
  • ¥20 有人知道这种图怎么画吗?
  • ¥15 pyqt6如何引用qrc文件加载里面的的资源
  • ¥15 安卓JNI项目使用lua上的问题
  • ¥20 RL+GNN解决人员排班问题时梯度消失
  • ¥60 要数控稳压电源测试数据
  • ¥15 能帮我写下这个编程吗