首页 > 解决方案 > 为什么我不能从我的主循环中读取中断标志?

问题描述

我正在为 stm32l011 MCU 编写代码,它现在必须完成一项基本任务 - 等待来自 UART 的特定字节(由我预定义)并遵循“\r\n”或“\n\r”序列。如果它接收到,它会设置一个指向预定义字符地址的空指针,该指针在主循环中读取和处理。

    volatile uint8_t uart_buff[UART_BUFF_LEN] = {'\0'};
    volatile uint8_t *uart_data = NULL;
    volatile uint8_t *uart_stack = uart_buff+2;

    void USART2_IRQHandler(void){
        if(LL_USART_IsActiveFlag_RXNE(USART2)){
            *uart_stack = LL_USART_ReceiveData8(USART2);
            user_uart_send_byte(*uart_stack);

            //same as if(!(strcmp((uart_stack-1), "\r\n") || strcmp((uart_stack-1), "\n\r")))
            if((*uart_stack == '\r' || *uart_stack == '\n') && (*(uart_stack-1) == '\r' || *(uart_stack-1) == '\n'))
            {
                uart_data = uart_stack - 2;
                uart_stack = uart_buff+2;
            }

            uart_stack++;
        }
    }

主要:

    extern volatile uint32_t systick_counter_ms;
    extern volatile uint8_t *uart_data;

    int main(void){

        init();

        while(1)
        {
            LL_GPIO_TogglePin(GPIOB, LL_GPIO_PIN_3);
            //delay_ms(1); //without that it doesn't want to work
            if(uart_data)
            {
                adc_transmit_reading(*uart_data);
                uart_data = NULL;
            }
        }
    }

我写了上面的C程序,它似乎不起作用。但是当我在主循环中引入延迟时,它就神奇地复活了。这是为什么?需要注意的关键事项:UART 有回声,因此我确信它在两种情况下都能正确处理中断,我还尝试通过使用 volatile 变量来删除编译器的优化(针对 size(Os) 进行优化)。延迟也是由while循环产生的,它等待每毫秒递增变量的中断。

我外行的猜测是,因为我只是围绕那个 uart_data 指针循环,所以中断和主循环之间的同步没有发生。

提前致谢 :)

标签: cembeddedstm32

解决方案


问题是您已经指出您uart_data指向易失性数据。但是在您的循环中,您正在测试指针而不是数据。

所以你必须指出你的指针也是易变的:

extern volatile uint8_t * volatile uart_data;

您可以在这篇文章中找到更多信息:为什么指向易失性指针(如“volatile int * p”)有用?


推荐阅读