在公司工作一个多星期了,最近忙忙碌碌,每天都学很多东西,可是脑子仿佛装不下知识,学了这个忘了那个。凡事欲速则不达,我要做好笔记,沉淀知识。
今天,我要记录的是串口UART的原理。串口看似普通,却是我们做什么都离不开的。它的运用场景主要是打印调试信息、还可以传输各种模块的数据如蓝牙、GPS等。
抓住两点:(1).波特率(115200)
(2).格式:数据位、停止位、校验位、流量控制
观察2440的电路图可知,uart串口的引脚分别为RXD0、TXD0,它们所对应的I/O口为GPH2、GPH3
GPHCON:将I/O设置为输出,
GPHCON &= ~((3<<4) | (3<<6)); //清零 GPHCON |= ((2<<4) | (2<<6)); //设置
GPHUP:使能内部上拉
GPHUP &= ~((1<<2) | (1<<3)); /* 使能内部上拉 */
UCON0:PCLK分频、中断/查询模式
UBRDIV0:根据公式,代入波特率、UART CLOCK等
ULCON0:设置数据格式,8n1代表8个数据位、无校验位、1个停止位
/* 设置波特率 */
/* 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个停止位 */
UTRSTAT0:第2位代表传输buffer状态,第0位代表接收buffer状态
URXH0:存放串口需要传输第数据的buffer
Uart.c的代码如下
/* 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++;
}
}
main.c代码如下
int main(void) { unsigned char c; uart0_init(); puts("Hello, world!\n\r"); while(1) { c = getchar(); if (c == '\r') { putchar('\n'); } if (c == '\n') { putchar('\r'); } putchar(c); } return 0; }
5 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!