串口UART

                                                串口 UART     在公司工作一个多星期了,最近忙忙碌碌,每天都学很多东西,可是脑子仿佛装不下知识,学了这个忘了那个。凡事欲速则不达,我...

   

 串口 UART

    在公司工作一个多星期了,最近忙忙碌碌,每天都学很多东西,可是脑子仿佛装不下知识,学了这个忘了那个。凡事欲速则不达,我要做好笔记,沉淀知识。

    今天,我要记录的是串口UART的原理。串口看似普通,却是我们做什么都离不开的。它的运用场景主要是打印调试信息、还可以传输各种模块的数据如蓝牙、GPS等。

使用UART

    抓住两点:(1).波特率(115200)

                      (2).格式:数据位、停止位、校验位、流量控制

观察2440的电路图可知,uart串口的引脚分别为RXD0、TXD0,它们所对应的I/O口为GPH2、GPH3

attachments-2020-05-mReFUVke5eb4a463513ed.png

attachments-2020-05-j157Msy15eb4a59becdb5.png

配置寄存器

    GPHCON:将I/O设置为输出,

attachments-2020-05-DpAczmpv5eb4a574d32b7.png

	GPHCON &= ~((3<<4) | (3<<6));   //清零
	GPHCON |= ((2<<4) | (2<<6));    //设置

    GPHUP:使能内部上拉

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

attachments-2020-05-h8NrTsYe5eb4a63645f3f.png

    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个停止位 */

   attachments-2020-05-9P1ENdV65eb4abea2209f.png

attachments-2020-05-3qs2JnhU5eb4ac57e37bd.png

attachments-2020-05-ynUfIIgL5eb4ac956399e.png

     UTRSTAT0:第2位代表传输buffer状态,第0位代表接收buffer状态

    URXH0:存放串口需要传输第数据的buffer


attachments-2020-05-hwARfQk95eb4ae21f27df.png


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;
}

    

0 条评论&回复

请先 登录 后评论
Litchi_Zheng
Litchi_Zheng

5 篇文章

作家榜 »

  1. 百问网-周老师 18 文章
  2. st_ashang 14 文章
  3. 渐进 12 文章
  4. zxq 11 文章
  5. helloworld 8 文章
  6. 谢工 5 文章
  7. Litchi_Zheng 5 文章
  8. 星星之火 5 文章