一般教科书上提供的uart收发的程序往往是一段采用轮循(polling)方式完成收发的简单代码。但对于高速的avr来讲,采用这种方式大大降低了 muc的效率。在使用avr时,应根据芯片本身的特点(片内大容量数据存储器ram,更适合采用高级语言编写系统程序),编写高效可靠的uart收发接口(低层)程序。下面是一个典型的atmega128的软件usart的接口程序。
// usart0 initialization
// communication parameters: 8 data, 1 stop, no parity
// usart0 receiver: on
// usart0 transmitter: on
// usart0 mode: asynchronous
// usart0 baud rate: 9600
ucsr0a=0x00;
ucsr0b=0xd8;
ucsr0c=0x06;
ubrr0h=0x00;
ubrr0l=0x67;
// global enable interrupts
#asm(“sei”)
while (1)
{
// place your code here
};
}
这段由cvavr程序生成器产生的uart接口代码是一个非常好的、高效可靠,并且值得认真学习和体会的。其特点如下:
1. 它采用两个8字节的接收和发送缓冲器来提高mcu的效率,如当主程序调用putchar()发送数据时,如果uart口不空闲,就将数据放入发送缓冲器中,mcu不必等待,可以继续执行其它的工作。而uart的硬件发送完一个数据后,产生中断,由中断服务程序负责将发送缓冲器中数据依次送出。
2.数据缓冲器结构是一个线性的循环队列,由读、写和队列计数器3个指针控制,用于判断队列是否空、溢出,以及当前数据在队列中的位置。
3. 用编译控制命令#pragma savereg-和#pragma savereg+,使得由cvavr在生成的中断服务程序中不进行中断保护(cvavr生成中断保护会将比较多的寄存器压入堆栈中),而在中断中嵌入汇编,只将5个在本中断中必须要保护的寄存器压栈。这样提高了uart中断处理的速度,也意味着提高了mcu的效率。
4.由于在接口程序putchar()、getchar()和中断服务程序中都要对数据缓冲器的读、写和队列计数器3个指针判断和操作,为了防止冲突,在putchar()、getchar()中对3个指针操作时临时将中断关闭,提高了程序的可靠性。
建议读者能逐字逐句地仔细分析该段代码,真正理解和领会每一句语句(包括编译控制命令的作用)的作用,从中体会和学习如何编写效率高,可靠性好,结构优良的系统代码。这段程序使用的方法和技巧,对编写spi、i2c的串行通信接口程序都是非常好的借鉴。
作为现在的单片机和嵌入式系统的工程师,不仅要深入全面的掌握芯片和各种器件的性能,具备丰富的硬件设计能力;同时也必须提高软件的设计能力。要学习和掌握有关数据结构、操作系统、软件工程、网络协议等方面的知识,具有设计编写大的复杂系统程序的能力。
手持读写器应用和特点
高性能经济型数字示波器MSO5000系列简介
手机欠费三个月以上或将接入个人征信系统,江西率先执行
DS21Q42 vs. DS21Q41B
Morse Micro 样品 Wi-Fi HaLow SoC 和模块
基于ATmega128单片机的USART接口程序的开发
国内工业机器人不断扩大,3C及新能源汽车市场引领需求增长
两个变频器不能启动的故障处理案例分享
实现生成式AI的关键半导体技术
大华股份AI取得任务中字符行识别和单字识别两项第一
直流充电桩测试仪的工作原理是怎样的
导线覆冰形成的原因及危害、覆冰在线监测的必要性!
SITL代码分布结构
从双目标定到立体匹配:Python实践指南
2019年各种人工智能技术将加速落地 人工智能应用范围将不断扩大
长安汽车与华为签署合作备忘录,共建“Newcool”新合资公司
基于5G智能网关的智慧塔吊监测方案
电缆老化的原因_老化的电缆怎么处理
特斯拉电动卡车被控侵犯案 可能要赔偿20亿美元
关于商用组串式逆变器安装的方法介绍