TQ210裸机编程——uart

来源:互联网 发布:增值税发票的税率算法 编辑:程序博客网 时间:2024/05/21 06:54

TQ210底板上引出了四个uart,实际上S5PV210只有4对独立的异步串行端口

其中UART1和UART2也被转为232接口

S5PV210的uart结构图如下

所有端口都可工作与中断模式或DMA模式,可提供3M的位速率,每个UART都有两个FIFO,分别用于接收和发送,但每组端口的FIFO大小不尽相同。

要使串口工作,可按如下操作进行相应的配置

1、配置时钟,选择时钟源。

2、配置ULCON寄存器,设置模式,校验位,停止位和数据位

3、配置UCON寄存器,设置数据接收和发送模式,以及时钟源等

4、配置UFCON寄存器,选择使用或禁用FIFO

5、配置UBRDIV和UDIVSLOT寄存器,用于配置波特率

对于学过M3/M4的人来说,这些并不难,但波特率的计算方式有些许差别

数据手册上有相应的计算公式

计算出来的小数部分需要进行查表

uart的配置代码如下

#include "stdio.h"#definepinaddr*((unsigned int*)0xE0200000)#define pindata *((unsigned int*)0xE0200004)#define ULCON0*((unsigned int*)0xE2900000)#define UCON0*((unsigned int*)0xE2900004)#define UFCON0*((unsigned int*)0xE2900008)#define UTRSTAT0*((unsigned int*)0xE2900010)#define UBRDIV0*((unsigned int*)0xE2900028)#define UDIVSLOT0*((unsigned int*)0xE290002C)#define UTXH0*((unsigned int*)0xE2900020)#define URXH0*((unsigned int*)0xE2900024)void uart_init(void){pinaddr = 0x00000022;ULCON0 = 0x03 | (0 << 2) | (0 << 3) | (0 << 6);UCON0 = 0X01 | (1 << 2) | (0 << 10);UFCON0 = 0;/*** 波特率计算:115200bps** PCLK = 66MHz** DIV_VAL = (66000000/(115200 x 16))-1 = 35.8 - 1 = 34.8** UBRDIV0 = 34(DIV_VAL的整数部分)** (num of 1's in UDIVSLOTn)/16 = 0.8** (num of 1's in UDIVSLOTn) = 12** UDIVSLOT0 = 0xDDDD (查表)*/UBRDIV0 = 34;UDIVSLOT0 = 0xDDDD;}char recv_byte(void){if((UTRSTAT0 & 0x01) == 0x01)return URXH0;elsereturn 0;}void send_byte(char c){while(!(UTRSTAT0 & (1 << 2)));UTXH0 = c;}char put_string(char* string){while(*string != '\0'){send_byte(*string);if(*string == '\r'){send_byte('\n');return 0;}string += 1;}}

再用led做一个指示灯

#include "stdio.h"#define CONADDR *((unsigned int*)0xE0200060)#defineDATADDR*((unsigned int*)0xE0200064)void led_init(void){CONADDR = 0x00011000;}void led1_toggle(void){unsigned int readdat=0;readdat = DATADDR;readdat^= 0x08;DATADDR = readdat;}void led2_toggle(void){unsigned int readdat=0;readdat = DATADDR;readdat^= 0x10;DATADDR = readdat;}
现象:发送1,led1翻转;发送2,led2翻转

#include "stdio.h"void led1_toggle(void);void led2_toggle(void);char recv_byte(void);int main(void){char c = 0;put_string("TQ210 USART TEST\r\n" );put_string("--------------------\r\n"            );put_string("auther:JESSE\r\n"         );put_string("date  :2017.11.7\r\n" );led1_toggle();while(1){c = recv_byte();if(c == 1)led1_toggle();if(c == 2)led2_toggle();}}
再写个简单的脚本,编译一下就可以了



原创粉丝点击