Qt210uart学习笔记

来源:互联网 发布:windows 运行指令 编辑:程序博客网 时间:2024/06/06 01:25

Qt210uart学习笔记

1.学习串口思路

1.把相关引脚设为RXDTXD,2.设置查询或中断模式和时钟源3.设置数据位和校验位4.配置波特率5.接受和发送数据

2.看原理图知道串口与GPAO   寄存器有关

 

 

所以设置对应GPIO用于UART0

      GPA0CON |= 0x22;

3.设置查询或中断模式和时钟源

* Receive Mode [1:0]:1 =接收采用查询或者中断模式,* Transmit Mode[3:2]:1 =发送采用查询或者中断模式,* bit[6]:1 =产生错误中断,* bit[10]:0 =时钟源为PCLK(这是PSYS Domain的)约66Mhz在下图可看出

 

UCON0 = (1<<6)|(1<<2)|(1<<0);

4.设置数据位和校验位

bit[1:0]:0x3 = 8位数据位, 1位停止位,无校验,正常模式

ULCON0 |= (0x3<<0);

5.配置波特率,相关寄存器有UBRDIV0UDIVSLOT0

DIV_VAL = (PCLK / (bps x 16)) −1可以计算出UBRDIV0

其中PCLK如下图得到

 

PCLK=667mhz/5/ 2

UBRDIV0=667Mhz/5/ 2/115200/16 -1(UBRDIV0等于整数部分35,小数部分0.187*16=2则查下表)

得出UDIVSLOT0=0x0808

#define GPA0CON  (*(volatile unsigned int *)0xE0200000) #define ULCON0  (*(volatile unsigned int *)0xE2900000) #define UCON0  (*(volatile unsigned int *)0xE2900004) #define UTRSTAT0  (*(volatile unsigned int *)0xE2900010)#define UTXH0  (*(volatile unsigned char *)0xE2900020) #define URXH0  (*(volatile unsigned char *)0xE2900024) #define UBRDIV0 (*(volatile unsigned int *)0xE2900028) #define UDIVSLOT0  (*(volatile unsigned int *)0xE290002C)void uart_init(void){/* 设置对应GPIO用于UART0 */GPA0CON |= 0x22;/* 设置UART0寄存器 *//* bit[1:0]:0x3 = 8位数据位 * 其他位默认,即1位停止位,无校验,正常模式 */ULCON0 |= (0x3<<0);/* * Receive Mode [1:0]:1 = 接收采用查询或者中断模式 * Transmit Mode[3:2]:1 = 发送采用查询或者中断模式 * bit[6]:1 = 产生错误中断 * bit[10]:0 = 时钟源为PCLK */UCON0 = (1<<6)|(1<<2)|(1<<0);/* 设置波特率(详细信息请参考手册或者学习日记) * DIV_VAL = UBRDIVn + (num of 1's in UDIVSLOTn)/16 * DIV_VAL = (PCLK / (bps x 16)) - 1 */UBRDIV0 = 0x23;UDIVSLOT0 = 0x808;return;}char uart_getchar(void){char c;/* 查询状态寄存器,直到有有效数据 */while (!(UTRSTAT0 & (1<<0)));c = URXH0; /* 读取接收寄存器的值 */return c;}void uart_putchar(char c){/* 查询状态寄存器,直到发送缓存为空 */while (!(UTRSTAT0 & (1<<2)));UTXH0 = c; /* 写入发送寄存器 */return;}


QQ:790706648  4M小水管