APM32F072开发---中断正常,但是主程序不运行

APM32F072程序开发的时候,测试的时候会出现死机的情况,具体表现为上位机通过串口发送数据,连续点击按钮(一直发送数据)会导致主程序中的呼吸灯不闪烁(主程序不运行。)
有问题先debug看一下,发现主程序不运行之后,TImer定时器中断还在正常进入中断;
串口中断接收也一直进入中断,拔掉通信线,仍然一直进入串口中断,但是不是接收中断。凭借我多年的经验,应该是出现了别的说明其他的中断,该中断标志需要软件清除,接收中断的话读出接收寄存器就会清除中断标志。
我的中断函数如下:

void USART_CONFIG_Receive_Isr(void)
{
	uint8_t RX_CONFIG_Buffer;
    if (USART_ReadStatusFlag(USART_CONFIG, USART_FLAG_RXBNE) == SET)
    {
        RX_CONFIG_Buffer = (uint8_t)USART_RxData(USART_CONFIG);
        USARTCONFIG_RX_Buff[USARTCONFIG_RxEnd++] = RX_CONFIG_Buffer;
	    USARTCONFIG_RxEnd &= (USARTCONFIG_RX_LENGTH - 1);	
//        printf("%c", RX_CONFIG_Buffer);
    }	
}

查看配置文件,我也没有打开其他的中断啊,只打开了接收中断,就是这一句USART_EnableInterrupt(COM_USART[COM], USART_INT_RXBNEIE)。

void USART_Init(COM_T COM,uint16_t bauds)
{
    GPIO_Config_T gpioConfig;
    USART_Config_T usartConfigStruct;
    /* Enable GPIO clock */
    RCM_EnableAHBPeriphClock(COM_TX_PORT_CLK[COM] | COM_RX_PORT_CLK[COM]);

    /* Enable COM1 or COM2 clock */
    if (COM == COM1)
    {
        RCM_EnableAPB2PeriphClock(COM_USART_CLK[COM]);
    }
    else
    {
        RCM_EnableAPB1PeriphClock(COM_USART_CLK[COM]);
    }

    /* Connect PXx to USARTx_Tx */
    GPIO_ConfigPinAF(COM_TX_PORT[COM], COM_TX_PIN_SOURCE[COM], COM_TX_AF[COM]);

    /* Connect PXx to USARTx_Rx */
    GPIO_ConfigPinAF(COM_RX_PORT[COM], COM_RX_PIN_SOURCE[COM], COM_RX_AF[COM]);

    /* Configure USART Tx as alternate function push-pull */
    gpioConfig.mode = GPIO_MODE_AF;
    gpioConfig.pin = COM_TX_PIN[COM];
    gpioConfig.speed = GPIO_SPEED_50MHz;
    gpioConfig.outtype = GPIO_OUT_TYPE_PP;
    gpioConfig.pupd = GPIO_PUPD_PU;
    GPIO_Config(COM_TX_PORT[COM], &gpioConfig);

    /* Configure USART Rx as input floating */
    gpioConfig.pin = COM_RX_PIN[COM];
    GPIO_Config(COM_RX_PORT[COM], &gpioConfig);

    usartConfigStruct.baudRate = bauds;
    usartConfigStruct.mode     = USART_MODE_TX_RX;
    usartConfigStruct.hardwareFlowCtrl = USART_FLOW_CTRL_NONE;
    usartConfigStruct.parity   = USART_PARITY_NONE;
    usartConfigStruct.stopBits =  USART_STOP_BIT_1;
    usartConfigStruct.wordLength = USART_WORD_LEN_8B;
    USART_Config(COM_USART[COM], &usartConfigStruct);

    /* Enable USART_Interrupt_RXBNEIE */
    USART_EnableInterrupt(COM_USART[COM], USART_INT_RXBNEIE);

    if (COM_USART[COM] == USART1)
    {
        NVIC_EnableIRQRequest(USART1_IRQn, 1);
    }
    else if (COM_USART[COM] == USART2)
    {
        NVIC_EnableIRQRequest(USART2_IRQn, 2);
    }
	if (COM_USART[COM] == USART3)
    {
        NVIC_EnableIRQRequest(USART3_4_IRQn, 3);
    }

    /* Enable USART */
    USART_Enable(COM_USART[COM]);
}

但是肯定就是产生了其他中断,进了串口中断,但是USART_ReadStatusFlag(USART_CONFIG, USART_FLAG_RXBNE)的结果并没有置位,不是接收中断,根据连点产生这种情况的现象,大胆猜测一下应该是溢出中断,但是为啥呢?查手册!!!!!!!!!
好家伙,别人置0都是禁止使能中断,唯独溢出中断置0是使能,寄存器的复位值是0,原来溢出中断是打开的。
在这里插入图片描述
所以,两种方法:
1.设置溢出中断使能位为1,禁止溢出中断;
2.在串口中断中,软件清除溢出中断标志位。

验证(我比较懒,懒得查怎么关闭中断):

我直接在串口中断中判断是否溢出中断,如果产生了溢出中断,就清除中断标志位。

void USART_CONFIG_Receive_Isr(void)
{
	uint8_t RX_CONFIG_Buffer;
    if (USART_ReadStatusFlag(USART_CONFIG, USART_FLAG_RXBNE) == SET)
    {
        RX_CONFIG_Buffer = (uint8_t)USART_RxData(USART_CONFIG);
        USARTCONFIG_RX_Buff[USARTCONFIG_RxEnd++] = RX_CONFIG_Buffer;
	    USARTCONFIG_RxEnd &= (USARTCONFIG_RX_LENGTH - 1);	
//        printf("%c", RX_CONFIG_Buffer);
    }
	if (USART_ReadStatusFlag(USART_CONFIG, USART_FLAG_OVRE) == SET)//溢出中断
	{
	 USART_ClearIntFlag(USART_CONFIG,USART_INT_FLAG_OVRE);
	}
	
}

如上改动之后,再次测试,没有发生死机现象,问题解决。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: APM32F030是一款32位微控制器芯片,程序跳转是指在程序执行过程中无条件或有条件地改变执行地址,使程序跳转到其他指定的地址处继续执行。 在APM32F030中,程序跳转可以通过修改程序计数器(Program Counter,简称PC)来实现。PC是一个特殊的寄存器,用于指向下一条将要执行的指令地址。通过改变PC的值,就可以改变程序的执行流程。 在APM32F030中,程序跳转使用跳转指令来实现。通过跳转指令,可以无条件地将程序跳转到指定的地址,或根据特定条件来判断是否跳转。 比如,可以使用无条件跳转指令“JMP”来实现无条件跳转。通过设置跳转指令的操作数为目标地址,执行该指令时就会将PC的值设置为目标地址,使程序跳转到目标地址处继续执行。 另外,还可以使用有条件跳转指令,如“JE”(等于跳转)、“JNE”(不等于跳转)、“JZ”(零跳转)等,根据特定条件来判断是否跳转。例如,可以通过判断某个标志位的状态,来确定是否执行跳转指令。 总之,在APM32F030中,程序跳转是通过修改PC的值来实现的。通过使用跳转指令,可以无条件或有条件地改变PC的值,从而实现程序的跳转,改变程序的执行流程。这样,可以根据实际需要,实现复杂的程序逻辑和功能。 ### 回答2: APM32F030是一款微控制器芯片,程序跳转是指在程序执行过程中,从当前位置跳转到其他位置继续执行程序的操作。在APM32F030中,程序跳转可以通过使用函数指针或者汇编语言来实现。 首先,函数指针是一种指向函数的指针变量,通过函数指针,我们可以将某个函数的地址赋值给函数指针,然后可以通过调用函数指针来执行这个函数。如果想要在程序中实现跳转到其他位置执行的功能,可以定义一个函数指针变量,并将需要跳转的位置的函数地址赋值给函数指针,然后通过调用函数指针来执行跳转到该位置的程序代码。 其次,汇编语言是一种低级的编程语言,可以直接访问计算机的硬件资源。在汇编语言中,通过使用跳转指令可以实现程序的跳转。APM32F030支持汇编语言编程,通过使用汇编语言编写一段程序代码,可以实现程序的跳转操作。 总结起来,APM32F030的程序跳转可以通过使用函数指针或者汇编语言来实现。函数指针适用于高级语言编程,而汇编语言适用于底层编程,根据具体的应用场景和开发需求,选择合适的方式来实现程序跳转。 ### 回答3: APM32F030是一款基于ARM Cortex-M0内核的微控制器,其具有支持程序跳转的功能。程序跳转是指在程序的执行过程中,通过特定的指令或条件,将控制权从当前位置转移到另一个指定的位置。 在APM32F030中,程序跳转可以通过使用汇编语言或C语言中的跳转指令来实现。例如,使用汇编语言的跳转指令可以是B(无条件跳转)、BL(带链接的跳转)、BEQ(等于零时跳转)等。这些指令可以在程序中的特定位置使用,以实现在需要的时候改变程序的控制流。 具体来说,要进行程序跳转的操作,可以按照以下步骤进行: 1. 首先,确定需要跳转的目标位置。这可以是代码的另一个函数、循环体、条件语句等。 2. 在需要执行跳转的位置,通过使用适当的跳转指令将控制权转移到目标位置。这可以是使用汇编语言编写的指令,也可以是通过C语言中的特殊语法来实现。 3. 跳转到目标位置后,程序会从该位置继续执行。这样可以实现在运行时改变程序流程,实现不同的功能。 需要注意的是,在进行程序跳转时,需要确保目标位置的代码是可执行的,并且满足程序的逻辑要求。否则,可能会导致程序运行错误或异常。 总的来说,APM32F030支持灵活的程序跳转功能,通过适当的跳转指令,可以实现在程序的不同位置之间切换控制权,以满足不同的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值