串口是嵌入式中常用的通信方式,他使用逐位发送,逐位接收。串行通信。串口有许多功能,诸如打印调试,连接各种模块。他安全可靠,连接简易所以被广泛使用。
串口通讯的基本定义:
1.波特率
2.格式:数据位,停止位,校验位,流量控制。
3.发送机与接收机用TX与RX相连接
USART的逻辑电平:
原来TX(即发送控制端)为高电平,ARM给予拉低并且保持1Bit的时间。PC机在低电平时开始计时,因为发送机于接收机之间有约定好的波特率,即按照约定好的波特率每隔一段时间读取一次发送引脚的电平。(一般是读取一个Bit中间时间的值),这样循环八次就完成了一个字节的接收。在接受完一个字节之后,以一个约定好的停止位结束本次字节的接收(停止位一般为1-2位数据)。在有些情况下,在八位数据与停止位的中间还会带有一个校验位。(一般为奇数偶数校验位,即一个字节中高电平的个数)。
串口存储:
因为是逐位发送的,在每接收到一位数据后会存入芯片中的FIFIO等待内存把他取出,取出之后再存入。
串口发送速度:
例如115200的波特率,一秒发送的Bit数目为115200/10=11520Bit
接下来我们开始分析编写USART的代码:
1.首先我们先从数据手册分析查看寄存器的配置:
GPH2与GPH3分别可以可以配置为串口0的TX与RX(即发送接收模式)
所需的条件是GPFCON[5:4]=10与GPFCON[7:6]=10
上面说过,串口不工作的时候引脚的电平默认为高电平
我们这里将GPH引脚初始化为高电平,即GPHUP[2]为1;
这样我们的引脚初始化就完成了。
2.接着我们来设定波特率
首先我们在手册中找到波特率的计算公式:
UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1
由此可以计算得到UBRDOVn= 50000000/(115200*16)-1=26
所以向UBRDIV0写入26
由模式设置寄存器中查的应向UCON0寄存器中写入0x00000005
3.设置完这些后,接下来我们设置串口的数据模式
由数据手册的列表中中得到:ULCON0 = 0x00000003; /* 8n1: 8个数据位, 无较验位, 1个停止位 */
接下来写串口输出与输入函数,这里就不多介绍了很简单的逻辑,这里罗列出来
int putchar(int c)
{
/* UTRSTAT0 */
/* UTXH0 */
while (!(UTRSTAT0 & (1<<2)));
UTXH0 = (unsigned char)c;
}
int getchar(void)
{
while (!(UTRSTAT0 & (1<<0)));
return URXH0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
接着来写一个打印函数,这里也罗列出来:
int puts(const char *s)
{
while (*s)
{
putchar(*s);
s++;
}
}在这里插入代码片
1
2
3
4
5
6
7
8
9
到这里就基本完成整个实验了,可以下载到开发板里面去试试开机的时候串口是否有打印出Hello World
备注:
实验代码:
在这里#include "s3c2440_soc.h"
/* 115200,8n1 */
void uart0_init()
{
/* 设置引脚用于串口 */
/* GPH2,3用于TxD0, RxD0 */
GPHCON &= ~((3<<4) | (3<<6));
GPHCON |= ((2<<4) | (2<<6));
GPHUP &= ~((1<<2) | (1<<3)); /* 使能内部上拉 */
/* 设置波特率 */
/* UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1
* UART clock = 50M
* UBRDIVn = (int)( 50000000 / ( 115200 x 16) ) –1 = 26
*/
UCON0 = 0x00000005; /* PCLK,中断/查询模式 */
UBRDIV0 = 26;
/* 设置数据格式 */
ULCON0 = 0x00000003; /* 8n1: 8个数据位, 无较验位, 1个停止位 */
/* */
}
int putchar(int c)
{
/* UTRSTAT0 */
/* UTXH0 */
while (!(UTRSTAT0 & (1<<2)));
UTXH0 = (unsigned char)c;
}
int getchar(void)
{
while (!(UTRSTAT0 & (1<<0)));
return URXH0;
}
int puts(const char *s)
{
while (*s)
{
putchar(*s);
s++;
}
}
上一篇:s3c2440芯片串口操作
下一篇:s3c2440串口使用
推荐阅读最新更新时间:2024-11-12 14:53
设计资源 培训 开发板 精华推荐
- 有刷直流电机驱动器MC34931的Freedom扩展板
- PCB元素周期表
- 黄淮学院创客空间立创杯电子设计大赛-刘向强-1002040A
- AD8657ARMZ-RL电压跟随器运算放大器典型应用电路
- LTM4636EY 4.7 至 15Vin、1V/40A DC/DC 降压型稳压器的典型应用电路
- 用于便携式的 3.3V DC 至 DC 单路输出电源
- NCP3064DFBSTGEVB:DFN-8 升压评估板
- OP297FSZ-REEL7精密绝对值放大器典型应用
- LT6656ACDC-2.5、2.5V 精密电流和升压电压基准的典型应用
- 使用 ON Semiconductor 的 ILC6301 的参考设计
- 了解 TE Connectivity 无创想,不奇迹 精彩专题,答题送好礼!
- TE专题:可靠连接解决方案大集合
- 免费申请 | Nordic Semiconductor nPM1300-EK PMIC 评估套件
- 下载汽车电气化精品文章,赢【体脂秤、罗技鼠标、手持风扇】,开启MPS汽车技术进阶之旅!
- 直播|基于英特尔® Agilex™ FPGA的PCIe Gen5和CXL解决方案
- 汽车VCU知识问答第二站:了解VCU开发流程和任务分解、岗位需求
- 借助 Microchip 生态系统中的 PIC® 和 AVR® 单片机开启嵌入式到云端之旅 系列在线研讨会
- 深入东芝参考设计库:夯实您的设计库,让您的设计更出彩