我正在为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指针周围循环,所以中断和主循环之间的同步不会发生。
预先感谢:)
答案 0 :(得分:3)
问题是您已指示uart_data
指向易失数据。但是在循环中,您正在测试指针而不是数据。
因此,您还必须指出指针也是可变的:
extern volatile uint8_t * volatile uart_data;
您可以在这篇文章中找到更多信息:Why is a point-to-volatile pointer, like "volatile int * p", useful?