[国嵌攻略][056][串口驱动程序设计]

初始化串口

1.配置引脚功能

在原理图上找到串口引脚,配置成RXD和TXD功能

2.设置数据格式

ULCON(0x50000000)用来设置数据格式

3.设置工作模式

在操作系统中,串口一般工作在中断模式或DMA模式,但是在引导中串口一般工作在轮询模式,UCON(0x50000004)用来设置工作模式

4.设置波特率

UBRDIV(0x50000028)用来设置波特率,串口使用的时钟是PCLK。

UBRDIV = (int)(PCLK/BAUD*16)-1

 

发送数据

1.判断发送缓冲是否为空

UTRSTAT(0x50000010)的第2位用来判断发送FIFO是否为空

2.发送数据

UTXH(0x50000020)用来发送数据

 

接收数据

1.判断接收缓冲是否不为空

UTRSTAT(0x50000010)的第1位用来判断接收FIFO是否不为空

2.接收数据

URXH(0x50000024)用来接收数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/********************************************************************
*名称:uart
*作者:D
*时间:2015.11.08
*功能:串口驱动
********************************************************************/
 
/********************************************************************
*                            宏定义
********************************************************************/
#define GPHCON   ( (*(volatile unsigned long *)0x56000070) )   //GPH组控制寄存器
#define ULCON0   ( (*(volatile unsigned long *)0x50000000) )   //UART0线控制寄存器
#define UCON0    ( (*(volatile unsigned long *)0x50000004) )   //UART0控制寄存器
#define UBRDIV0  ( (*(volatile unsigned long *)0x50000028) )   //UART0波特率分频寄存器
#define UTRSTAT0 ( (*(volatile unsigned long *)0x50000010) )   //UART0发送接收状态寄存器
#define UTXH0    ( (*(volatile unsigned long *)0x50000020) )   //UART0发送接缓冲寄存器
#define URXH0    ( (*(volatile unsigned long *)0x50000024) )   //UART0接收接缓冲寄存器
 
#define PCLK 50000000   //PCLK=1/8*FCLK=50MHz
#define BUAD 115200     //波特率
 
/********************************************************************
*                         函数原型声明
********************************************************************/
 
/********************************************************************
*名称:init_uart
*功能:初始化串口
*********************************************************************/
void init_uart(){
    //配置串口引脚
    GPHCON &= ~(0xF<<4);   //清零GPH[3-2]:0000
    GPHCON |= 0xA<<4;      //设置GPH2:10 TXD[0],GPH3:10 RXD[0]
     
    //设置数据格式
    ULCON0 = 0x00000003;   //设置word length[1-0]:11 8bit, number of stop bit:0 0bit, parity mode:000 no
     
    //设置工作模式
    UCON0 = 0x00000005;   //设置recevi mode:01, transmit mode:01 polling mode, clock selection:00 PCLK
     
    //设置波特率
    UBRDIV0 = (int)(PCLK/(BUAD*16))-1;
}
 
/********************************************************************
*名称:putc_uart
*参数:
    ch   发送字符
*返回:
    none
*功能:发送数据
*********************************************************************/
void putc_uart(unsigned char ch){
    //等待发送缓冲为空
    while( !(UTRSTAT0&(1<<2)) );   //等待发送缓冲和移位寄存器都为空
     
    //发送数据
    UTXH0 = ch;
}
 
/********************************************************************
*名称:getc_uart
*参数:
    none
*返回:
    ch   接收字符
*功能:接收数据
*********************************************************************/
unsigned char getc_uart(){
    unsigned char ch;
     
    //等待接收缓冲不为空
    while( !(UTRSTAT0&(1<<0)) );
     
    //接收数据
    ch = URXH0;
     
    return ch;
}

 

1
2
3
4
5
6
7
8
9
10
11
while(1){
        ch = getc_uart();
     
        if(ch == 0x0D || ch == 0x0A){   //如果输入的是回车或换货,那么输出回车和换行
            putc_uart(0x0D);
            putc_uart(0x0A);
        }else{
            putc_uart(ch);
        }
         
    }

 

posted @   盛夏夜  阅读(294)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示