gpt4 book ai didi

c - 使用 UDRE 和 ATmega328P 的中断驱动 USART

转载 作者:行者123 更新时间:2023-12-05 00:33:58 25 4
gpt4 key购买 nike

我在用 C 语言为 Arduino 编程串口时遇到问题。应用程序需要速度,所以我需要用 C 语言来完成。我正在使用 Codeblocks,因为它很容易编译。

因为我也希望串行功能不阻塞应用程序并提供调试功能,所以我正在尝试编写一个循环缓冲区类型的串行库。应用不需要接收数据,只打印。

问题始于串行中断显然没有触发并且程序阻塞,编译器确实给出了警告:

main.c|11|warning: ‘UART_UDRE_vect’ appears to be a misspelled signal handler|

测试程序如下:

#include<avr/io.h>
#include<avr/interrupt.h>

#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU/(USART_BAUDRATE*16UL)))-1)

char ok = 0;

ISR(UART_UDRE_vect) {
ok = 1;
UCSR0B &= ~(1<<5);
}

int main(void) {
UBRR0H = (BAUD_PRESCALE >> 8);
UBRR0L = BAUD_PRESCALE;
UCSR0B |= (1<<TXEN0);
UCSR0C |= (1<<UCSZ00) | (1<<UCSZ01);
sei();
while(1){
// write the byte to the serial port
UDR0 = '0';
UCSR0B |= (1<<5);
while(ok != 1){}
ok = 0;
UDR0 = '\n';
UCSR0B |= (1<<5);
while(ok != 1){}
ok = 0;
}
return 0;
}

配置和波特率是正确的,因为回显示例找到了here确实有效。

还有其他示例不使用 UDRE,仅使用 RX 中断,这不是我想要的。

我是不是忘记了什么?

最佳答案

两个问题:

  • 根据 documentation您已链接,您的特定部分 ATmega328p 的中断 vector 应命名为 USART_UDRE_vect

  • 与中断共享的变量必须始终声明为 volatile,否则编译器可能无法理解它们的使用,因此会在优化时破坏您的程序。基本上,编译器认为变量 ok 永远不会得到除 0 之外的其他值,因为它在任何地方都看不到对 ISR 的函数调用(因为它是由硬件调用的,而不是由程序调用的)。将声明更改为 static volatile char ok;

关于c - 使用 UDRE 和 ATmega328P 的中断驱动 USART,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47017860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com