为什么不能从主循环读取中断标志?

时间:2019-02-27 14:09:49

标签: c embedded stm32

我正在为stm32l011 MCU写代码,它现在必须执行一项基本任务-等待UART中的特定字节(由我预定义)并跟随“ \ r \ n”或“ \ n \ r”顺序。如果收到该消息,它将为预定义char的地址设置一个空指针,该地址在主循环中读取和处理。

    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有回声,因此我确定在两种情况下它都能正确处理中断,我也尝试使用易失性变量来删除编译器的优化(优化大小(Os))。另外,延迟是由while循环造成的,它等待中断,该中断每毫秒增加一次变量。

我的外行猜测是因为我只在uart_data指针周围循环,所以中断和主循环之间的同步不会发生。

预先感谢:)

1 个答案:

答案 0 :(得分:3)

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

因此,您还必须指出指针也是可变的:

extern volatile uint8_t * volatile uart_data;

您可以在这篇文章中找到更多信息:Why is a point-to-volatile pointer, like "volatile int * p", useful?