Home » 朱老师嵌入式 » 串行通信编程实战

串行通信编程实战

编 辑:Y ┊ 时 间:2022年04月14日 ┊ 访问: 16 次

S5PV210串行通信编程实战1

新增uart.c

新增main.c

修改makefile

修改start.S

整个程序流程分析

  • 修改start.S

    bl main
  • uart.c

    void uart_init(void){}
    void uart_putc(char c){}
    char uart_getc(void){}
  • main.c

    void main(void) {
        uart_init();
        uart_putc('a');
    }

(1)整个串口通信相关程序包含2部分:uart_init负责初始化串口,uart_putc负责发送一个字节

串口控制器初始化关键步骤

REGISTER MAP (P864)
21702-7if6ujxf0sk.png

08882-rgw9vxux3ff.png

47597-m6p42rxjywj.png50279-5ppwhnsz2et.png

这里有串口0-3,四个串口。我们这里使用的是0
89312-rq3zwrx6wj.png

(1)初始化串口的Tx和Rx引脚所对应的GPIO(查原理图可知Rx和Rx分别对应GPA0_1和GPA0_0)
(P133)
15233-c9eohz5nlm9.png

(2)GPA0CON(0xE0200000),bit[3:0] = 0b0010 bit[7:4] = 0b0010
(3)初始化这几个关键寄存器UCON0 ULCON0 UMCON0 UFCON0 UBRDIV0 UDIVSLOT0
(P864)
63577-06yaaf7w40sf.png

主要的几个寄存器

(1)ULCON0 = 0x3 // 0校验位、8数据位、1停止位
02184-p9vzn06bc4f.png

(2)UCON = 0x5 // 发送和接收都是polling mode
63376-9twluuuv2l.png

94589-zjmh86c9bwn.png

(3)UMCON0 = 0x0 // 禁止modem、afc
20417-3qp7xl73l6w.png

(4)UFCON0 = 0x0 // 禁止FIFO模式
13114-qpqlxpj5ben.png

20804-4blc3s1tukz.png

(5)UBRDIV0和UDIVSLOT0和波特率有关,要根据公式去算的

在C源文件中定义访问寄存器的宏

定义好了访问寄存器的宏之后,将来写代码时直接使用即可。

#define GPA0CON        0xE0200000
#define UCON0         0xE2900004
#define ULCON0         0xE2900000
#define UMCON0         0xE290000C
#define UFCON0         0xE2900008
#define UBRDIV0     0xE2900028
#define UDIVSLOT0    0xE290002C
#define UTRSTAT0    0xE2900010
#define UTXH0        0xE2900020    
#define URXH0        0xE2900024    

#define rGPA0CON    (*(volatile unsigned int *)GPA0CON)
#define rUCON0        (*(volatile unsigned int *)UCON0)
#define rULCON0        (*(volatile unsigned int *)ULCON0)
#define rUMCON0        (*(volatile unsigned int *)UMCON0)
#define rUFCON0        (*(volatile unsigned int *)UFCON0)
#define rUBRDIV0    (*(volatile unsigned int *)UBRDIV0)
#define rUDIVSLOT0    (*(volatile unsigned int *)UDIVSLOT0)
#define rUTRSTAT0        (*(volatile unsigned int *)UTRSTAT0)
#define rUTXH0        (*(volatile unsigned int *)UTXH0)
#define rURXH0        (*(volatile unsigned int *)URXH0)

S5PV210串行通信编程实战2

串口Tx、Rx对应的GPIO的初始化

给GPA0CON的相应bit位赋值为相应值,用C语言位操作来完成。

// 串口初始化程序
void uart_init(void)
{
    // 初始化Tx Rx对应的GPIO引脚
    rGPA0CON &= ~(0xff<<0);            // 把寄存器的bit0~7全部清零
    rGPA0CON |= 0x00000022;            // 0b0010, Rx Tx
}

UCON、ULCON、UMCON、UFCON等主要控制寄存器

依据上节中分析的值进行依次设置即可。

// 串口初始化程序
void uart_init(void)
{
    // 初始化Tx Rx对应的GPIO引脚
    rGPA0CON &= ~(0xff<<0);            // 把寄存器的bit0~7全部清零
    rGPA0CON |= 0x00000022;            // 0b0010, Rx Tx
    
    // 几个关键寄存器的设置
    rULCON0 = 0x3;
    rUCON0 = 0x5;
    rUMCON0 = 0;
    rUFCON0 = 0;
}

波特率的计算和设置

86165-c1hrlozucjp.png

51516-q7un51uash.png

(1)第一步,用PCLK_PSYS和目标波特率去计算DIV_VAL: DIV_VAL = (PCLK / (bps x 16)) ?1
(2)第二步,UBRDIV0寄存器中写入DIV_VAL的整数部分
(3)第三步,用小数部分*16得到1个个数,查表得uBDIVSLOT0寄存器的设置值
45037-rgq0httcmhd.png

// 串口初始化程序
void uart_init(void)
{
    // 初始化Tx Rx对应的GPIO引脚
    rGPA0CON &= ~(0xff<<0);            // 把寄存器的bit0~7全部清零
    rGPA0CON |= 0x00000022;            // 0b0010, Rx Tx
    
    // 几个关键寄存器的设置
    rULCON0 = 0x3;
    rUCON0 = 0x5;
    rUMCON0 = 0;
    rUFCON0 = 0;
    
    // 波特率设置    DIV_VAL = (PCLK / (bps x 16))-1
    // PCLK_PSYS用66MHz算        余数0.8
    //rUBRDIV0 = 34;    
    //rUDIVSLOT0 = 0xdfdd;
    
    // PCLK_PSYS用66.7MHz算        余数0.18
    // DIV_VAL = (66700000/(115200*16)-1) = 35.18
    rUBRDIV0 = 35;
    // (rUDIVSLOT中的1的个数)/16=上一步计算的余数=0.18
    // rUDIVSLOT中的1的个数 = 16*0.18= 2.88 = 3
    rUDIVSLOT0 = 0x0888;        // 3个1,查官方推荐表得到这个数字
}

串口发送和接收函数的编写

79974-ejkz2409aar.png

(1)写发送函数,主要发送前要用while循环等待发送缓冲区为空才能发送。

// 串口发送程序,发送一个字节
void uart_putc(char c)
{                      
    // 串口发送一个字符,其实就是把一个字节丢到发送缓冲区中去
    // 因为串口控制器发送1个字节的速度远远低于CPU的速度,所以CPU发送1个字节前必须
    // 确认串口控制器当前缓冲区是空的(意思就是串口已经发完了上一个字节)
    // 如果缓冲区非空则位为0,此时应该循环,直到位为1
    while (!(rUTRSTAT0 & (1<<1)));
    rUTXH0 = c;
}

(2)写接受函数

// 串口接收程序,轮询方式,接收一个字节
char uart_getc(void)
{
    while (!(rUTRSTAT0 & (1<<0)));
    return (rURXH0 & 0x0f);
}

综合调试

注意Makefile的修改。

扩展练习

更改波特率后再调试
自己练习。注意程序中改了波特率后,SecureCRT也要相应修改,不然收不到东西




Copyright © 2026 Y 版权所有.网站运行:13年238天21小时29分