littlebot
Published on 2025-04-08 / 0 Visits
0

【源码】基于AVR架构的中断驱动和缓冲UART库

项目简介

本项目是一个面向tiny - 和megaAVR系列微控制器的UART(通用异步收发传输器)库。该库参考Microchip的技术文档TB3216,在功能和命名规范上遵循相关约定。它支持多达6个并发的UART,每个UART都配备独立的循环缓冲区,可相互独立工作。项目编译后的代码大小较小,适用于多种AVR设备。

项目的主要特性和功能

  1. 多UART支持:最多支持6个并发的UART,可依据微控制器的能力按任意顺序和数量启用。
  2. 独立缓冲区:每个UART都有自己的循环缓冲区,能独立处理数据。
  3. 丰富的函数接口:提供初始化、发送字符、发送字符串、读取字符和关闭UART等功能函数。
  4. 文件流支持:支持使用fprintf函数向每个UART打印格式化字符串。

安装使用步骤

准备工作

假设用户已经下载了本项目的源码文件,编译步骤最初在UNIX机器(如Apple Mac)上完成,也可在Microchip Studio中编译。

参数设置

所有库的设置在uart_settings.huart_settings.c中完成: 1. 设置缓冲区大小:在uart_settings.h中,通过RBUFFER_SIZE定义Rx和Tx环形缓冲区的大小,可选值为2、4、8、16、32、64或128,默认值为32。 2. 启用USART单元:在uart_settings.h中,取消注释相应的#define USARTn_ENABLE来启用USART单元,最多支持6个。 3. 分配PORTMUX和Rx、Tx引脚:根据所选的USARTn和引脚,在uart_settings.c中设置PORTMUX和引脚方向。

使用示例

```c // (1) - 初始化USART usart0_init((uint16_t)BAUD_RATE(9600));

// (2) - 启用全局中断 sei();

// (3) - 向USART发送字符串 usart0_send_string("\r\n\r\nPEACE BRO!\r\n\r\n", 18);

// (4) - 使用fprintf写入流 fprintf(&USART0_stream, "Hello world!\r\n");

for(size_t i=0; i<5; i++) { // (5) - 使用格式化的fprintf写入流 fprintf(&USART0_stream, "\r\nCounter value is: 0x%02X ", j++); _delay_ms(500);

// (6) - 通过轮询环形缓冲区获取USART输入
while(!((c = usart0_read_char()) & USART_NO_DATA)) {
    if (c & USART_PARITY_ERROR) {
        fprintf(&USART0_stream, "USART PARITY ERROR: ");
    }
    if (c & USART_FRAME_ERROR) {
        fprintf(&USART0_stream, "USART FRAME ERROR: ");
    }
    if (c & USART_BUFFER_OVERFLOW) {
        fprintf(&USART0_stream, "USART BUFFER OVERFLOW ERROR: ");
    }

    // (7) - 向USART发送单个字符
    usart0_send_char((char)c);
}

}

// (8) - 在关闭USART之前检查所有内容是否已打印 fprintf(&USART0_stream, "\r\n\r\n<-<->->");

// (9) - 关闭USART0 usart0_close();

// (10) - 清除全局中断 cli(); `` 注意,调用init()sei()usart0_close()cli()`的顺序对正确操作至关重要。

下载地址

点击下载 【提取码: 4003】【解压密码: www.makuang.net】