历史上的今天
返回首页

历史上的今天

今天是:2025年11月17日(星期一)

正在发生

2022年11月17日 | JZ2440 串口裸机编程

2022-11-17 来源:zhihu

ARM裸机1期加强版视频课程配套WiKi第11课_串口(UART)的使用,

共2节:第001节_辅线1_硬件知识_UART硬件介绍和第002节_S3C2440_UART编程,讲的是JZ2440 UART裸机编程。


文字不能完全替代视频,所以如果你看了这些文章感觉不错却不太懂,建议购买视频进一步学习。


第001节_辅线1_硬件知识_UART硬件介绍

1. 串口的硬件介绍

UART的全称是Universal Asynchronous Receiver andTransmitter,即异步发送和接收。串口在嵌入式中用途非常广泛:

  • 打印调试信息

  • 外接各种模块:GPS、蓝牙

串口因为结构简单、稳定可靠,广受欢迎。通过三根线即可:发送、接收、地线。


通过TxD->RxD把ARM开发板要发送的信息发送给PC机。通过RxD->TxD线把PC机要发送的信息发送给ARM开发板。最下面的地线统一参考地。


2. 串口的参数

波特率:一般波特率都会有9600,19200,115200等选项。意思是每秒传输这么多个比特位数(bit)。

  • 起始位:先发出一个逻辑”0”的信号,表示传输数据的开始。

  • 数据位:可以是5~8位逻辑”0”或”1”。如ASCII码(7位),扩展BCD码(8位)。小端传输。

  • 校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。

  • 停止位:它是一个字符数据的结束标志。


怎么发送一字节数据,比如‘A‘?


‘A’的ASCII值是0x41, 二进制就是01000001,怎样把这8位数据发送给PC机呢?

1. 双方约定好波特率(每一位占据的时间)

2. 规定传输协议

a. 原来是高电平,ARM拉低电平,保持1bit时间;

b. PC在低电平开始处计时;

c. ARM根据数据依次驱动TxD的电平,同时PC依次读取RxD引脚电平,获得数据;


前面图中提及到了逻辑电平,也就是说代表信号1的引脚电平是人为规定的。如图是TTL/CMOS逻辑电平下,传输‘A’时的波形:


在xV至5V之间,就认为是逻辑1,在0V至yV之间就为逻辑0。

如图是RS-232逻辑电平下,传输‘A’时的波形:

在-12V至-3V之间,认为是逻辑1,在+3V至+12V之间为逻辑0。

RS-232的电平比TTL/CMOS高,能传输更远的距离,在工业上用得比较多。

市面上大多数ARM芯片都不止一个串口,一般使用串口0来调试,使用其它串口外接模块。


ARM芯片上的串口都是TTL电平,通过板子上或者外接的电平转换芯片,转成RS232接口,连接到电脑的RS232串口,实现两者的数据传输:


现在的电脑越来越少有RS232串口接口,几乎都有USB口。因此使用USB串口芯片将ARM芯片上的TTL电平转换成USB串口电平,即可让开发板通过USB与电脑数据传输。

上面的两种方式,对ARM芯片的编程操作是一样的。

ARM芯片是如何发送/接收数据?

如图所示JZ2440 串口结构图:

从上图可知,要发送数据时,CPU控制内存要发送的数据通过FIFO传给UART,UART里面的移位器依次将数据发送出去,在发送完成后产生中断提醒CPU传输完成。

接收数据时,获取接收引脚的电平,逐位放进接收移位器,再放入FIFO,写入内存。在接收完成后产生中断提醒CPU传输完成。


第002节_S3C2440_UART编程

在文件uart.c里需要编写这几个函数:

uart0_init() : 用于初始化串口
putchar() : 用于发送一个字符
getchar() : 用于接收一个字符
puts() : 用于发送一串字符


在uart0_init()的功能如下:

  • 1. 设置引脚用于串口:根据原理图和参考手册设置GPH2,3用于TxD0, RxD0,并且为了将其保持为高电平,先设置其为上拉:

GPHCON & = ~((3<<4) | (3<<6));

GPHCON | = ((2<<4) | (2<<6));

GPHUP & = ~((1<<2) | (1<<3)); /* 使能内部上拉 */

  • 2. 设置波特率

UCON0 = 0x00000005; //将uart时钟设置为PCLK, 中断/查询模式:


uart clock=50M,波特率假设是115200,

根据公式

UBRDIVn = (int)( UARTclock / ( buad rate x 16) ) –1

得到

UBRDIVn = (int)(50000000 / ( 115200 x 16) ) –1 = 26

UBRDIV0 = 26;

  • 3. 设置数据格式

数据格式设置为常用的8n1: 8个数据位, 无较验位, 1个停止位

ULCON0 = 0x00000003; /* 8n1: 8个数据位, 无较验位, 1个停止位 */


读取UTRSTAT0寄存器,查询其第2位判断发送buff是否为空,即上一次发送是否完成,如果完成即向UTXH0写入要发送的新数据;查询其第0位判断接收buff是否为空,即本次接收是否完成,如果接收完成,读取URXH0的值。

int putchar(int c)
{
while (!(UTRSTAT0 & (1<<2)));
UTXH0 = (unsigned char)c;
}
int getchar(void)
{
while (!(UTRSTAT0 & (1<<0)));
return URXH0;
}

循环输出字符,就可以实现字符串的输出:

int puts(constchar*s)
{
while (*s)
{
putchar(*s);
s++;
}
}

在main.c主函数里,先调用初始化函数uart0_init(),然后循环获取用于输入的数据,然后回显出来。并且在收到`r`回车时,输出`n`换行,有些时候`n`表示回车,则输出`r`换行。

main.c代码如下:

#include "s3c2440_soc.h"
#include "uart.h"

int main(void)
{
unsigned char c;

uart0_init();
puts("Hello, world!nr");

while(1)
{
c = getchar();
if (c =='r')
{
putchar('n');
}

if (c =='n')
{
putchar('r');
}

putchar(c);
}
return0;
}


推荐阅读

史海拾趣

Fagor Electrónica公司的发展小趣事

进入1960年代,Fagor Electrónica迎来了其发展的第一个重大里程碑。1964年,公司成功启动了第一批硅整流器的制造。这一创新不仅提高了产品的性能,还为公司带来了更大的市场份额。硅整流器的推出标志着Fagor Electrónica在电子制造技术上的领先地位,也为其后续的发展奠定了坚实的基础。

Dongguan Jingyue Electronics Co Ltd公司的发展小趣事

Dongguan Jingyue Electronics Co Ltd始终将社会责任和可持续发展作为公司发展的重要组成部分。公司积极参与公益事业,关注环境保护和员工福利。通过捐赠教育基金、支持环保项目、改善员工待遇等方式,公司履行了社会责任,也为公司的可持续发展奠定了基础。

请注意,以上故事均为虚构内容,仅用于展示电子行业公司可能的发展故事框架。

Clever Little Box公司的发展小趣事

Clever Little Box深知,优质的客户服务是企业长期发展的关键。因此,公司始终注重提升服务质量,为客户提供专业的技术支持和售后服务。同时,公司还注重与客户建立良好的关系,通过定期沟通、反馈收集等方式,了解客户的需求和意见,以便更好地满足客户的期望。

Alpha Wire公司的发展小趣事

Clever Little Box深知,优质的客户服务是企业长期发展的关键。因此,公司始终注重提升服务质量,为客户提供专业的技术支持和售后服务。同时,公司还注重与客户建立良好的关系,通过定期沟通、反馈收集等方式,了解客户的需求和意见,以便更好地满足客户的期望。

Aerovox Corporation公司的发展小趣事

在市场竞争日益激烈的情况下,Clever Little Box意识到,单打独斗很难取得长久的成功。于是,公司开始积极寻求与其他企业的合作,通过共赢的战略选择,实现资源共享、优势互补。这种合作模式不仅帮助公司扩大了市场份额,还提高了公司的品牌知名度和影响力。

Abracon公司的发展小趣事

随着公司的发展,Clever Little Box逐渐意识到,单一的产品线无法满足市场的多样化需求。于是,公司开始积极拓展产品线,不仅涵盖了脉冲发生器、转换器等核心产品,还增加了音频/视频电缆组件等辅助产品。同时,公司注重创新,不断研发新技术、新产品,以满足市场的不断变化和客户的个性化需求。

问答坊 | AI 解惑

华为前员工揭密华为内部薪资待遇真相(转帖)

编者按:该稿件为华为前员工按照不同部门揭示华为内部薪资待遇问题,相信对于一直想要介入华为这个大企业的个人以及各位同行的人事部门朋友们一个很好的参考。   我的情况:1978年生,北方某省会城市人,男,2000年毕业于北京某知名大学电子通 ...…

查看全部问答>

制梁厂水泥养护室温度集中监测系统

随着国民经济的快速发展,近年来高等级公路、铁路大量修建。水泥混凝土构件在桥梁建设中占有重要位置。影响水泥构件强度性能的因素有1.水泥的矿物成分2.外添加剂3.矿物掺料4.用水量5.水泥混凝土的养护 混凝土浇捣后,之所以能逐渐凝结硬化,主要是 ...…

查看全部问答>

求个键盘 以及LED显示的流程图 和程序

求个键盘 以及LED显示的流程图 和程序求个键盘 以及LED显示的流程图 和程序   键盘是4个独立键盘  LED是通过TLC1549转换的…

查看全部问答>

关于evc下运行控制台程序

在evc中将一个入口为int main (int argc, const char *argv [])的C程序新建一个WCE PocketPC 2003 Application并做成exe 然后在另一个程序的按钮消息中利用ShellExecuteEx函数调用它,可是一运行却总警告First-chance exception in xxx.exe:0xC000 ...…

查看全部问答>

光电计数电路图

如图所示电路,当光敏三极管VT1接收到红外发光二极管射来的红外光线时,VT1导通,比较器IC2-B的反相输入端6脚为低电平,7脚输出高电平,加到比较器IC2-A的反相输入端,使1脚输出低电平,则光电耦合器4N35内的发光管点亮,对应的光敏管导通,三极管V ...…

查看全部问答>

怎么用zigbee给邻居节点发送信息啊

zigbee好像哪里有邻居节点信息,怎么和所有邻居节点通信,取得他们的信息呢…

查看全部问答>

Altera公司与TSMC采用CoWoS生产技术

Altera公司与TSMC宣布,采用TSMC CoWoS生产技术共同开发全球首颗能够整合多元芯片技术的三维集成电路(Heterogeneous  3DIC ) 测试芯片 ,此项创新技术系将模拟、逻辑及内存等各种不同芯片技术堆栈于单一芯片上组合而成,可协助半 ...…

查看全部问答>

咨询问题

论坛里有没有搞OMAP_L138的,我最近在研究这个板子,遇到了一些问题,就是我程序也下进板子了,也可以编译,运行,最后下到板子里也可以把程序跑完了,可是当我用View观察图形时,就出不来了,谁人知道是什么原因吗?麻烦知道的给解决一下,不胜感 ...…

查看全部问答>

关于I2C的问

这两天做个I2C方面的东西,可以Master读取数据的时候总是卡住,用示波器看了下,发现少个CLOCK,有谁知道啥原因吗?…

查看全部问答>