uboot学习之UART

本文介绍了学习过程中对Exynos4412SCP UART模块的理解,涉及datasheet分析、UART结构、波特率设置、FIFO配置、中断与DMA机制,以及uboot源码中具体操作步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面的话

本文章为笔者学习uboot时做的笔记,仅供参考

datasheet分析

  • Exynos 4412 SCP包含4路通用的uart和1路专用于GPS的uart.
  • 每一个uart都包含一个发送fifo和一个接收fifo。FIFO是一个先进先出的数据结构,串口设计FIFO是提高通信性能,假如没有FIFO或者缓冲区容量只有一个字节,这意味着每接收到一个字节,就会触发一次中断,频繁的中断会出发CPU资源;另外如果没有及时读取数据,就会被下一个数据覆盖掉,导致数据丢失。增加FIFO后,FIFO满之后才会触发中断,这样就可以避免上面两个问题,但是会引出另外一个问题,当FIFO一直没有满,就无法及时读出数据,因此,UART增加了另一个功能,设定一个定时,当时间到,就会触发中断,引发读取FIFO的动作。
  • uart和内核通过中断或者DMA传输信息。
  • Exynos 4412 SCP的组成结构:波特率发生器、发送单元、接收单元和控制单元,如图0-0-1。
    图0-0-1 uart组成架构图
  • 过程概述:波特率发生器产生串口时钟SCLK_UART。发送和接受单元都包含有FIFO和数据移位寄存器,把要发送的数据写入FIFO,然后会自动拷贝到移位寄存器中,然后一位一位地通过发送引脚Tx把数据发送出去。通过Rx引脚传输进来的数据线保存在移位寄存器中,然后拷贝到FIFO中,最后uart控制器把数据读走。
  • UART时钟控制
    在这里插入图片描述
  • uart寄存器
  1. ULCONn 寄存器(n代表哪一个uart)
    ULCONn寄存器控制uart的奇偶校验位、停止位和数据位。
    在这里插入图片描述
  2. UCONn寄存器
    这个寄存器用来设定UART的模式(中断模式、轮询或DMA)。
    在这里插入图片描述
    在这里插入图片描述
  3. UFCONn寄存器
    用于设定FIFO的使能及触发FIFO中断的阈值。

在这里插入图片描述
在这里插入图片描述

uboot UART源码分析

1. 设定UART的GPIO

	/* set GPIO to enable UART */
	@ GPIO setting for UART for UART0/1
	ldr	r0, =0x11400000
	ldr	r1, =0x22222222
	str   	r1, [r0]
	ldr	r0, =0x11400020
	ldr	r1, =0x222222
	str	r1, [r0]
  1. 0x11400000表示GPA0CON寄存器,这个寄存器是配置GPA0 GPIO组,把这这个GPIO设置为UART,要把对应位配置为0x2。0x11400020同理。
    在这里插入图片描述
    在这里插入图片描述
    2. 设置UART的时钟和波特率
	ldr	r0, =CMU_BASE	@0x1003_0000
	ldr	r1, =CLK_SRC_PERIL0_VAL		@0x666666
	ldr	r2, =CLK_SRC_PERIL0_OFFSET
	str	r1, [r0, r2]
	ldr	r1, =CLK_DIV_PERIL0_VAL		@0x777777
	ldr	r2, =CLK_DIV_PERIL0_OFFSET
	str	r1, [r0, r2]

- 选择时钟源和分频器
查看datasheet设置UART单元的时钟,需要设置MUXUART0~4多路选择器和分频器,最终生成SCLK UART时钟。
在这里插入图片描述
- 设置多路选择器,选择时钟源
CLK_SRC_PERIL0寄存器用于控制选择时钟源,把这个寄存器设置为0x666666,意味着把对应位设置0x6(0110),即选择SCLKMPLL_USER_T为时钟源。
在这里插入图片描述
在这里插入图片描述
- 设置分频系数
CLK_DIV_PERIL0寄存器控制分频系数,把这个值设置为7,就是分频系数为8,SCLK MPLL时钟大小为400M,所以SCLK UART为50M。

在这里插入图片描述

3. 设置FIFO
使能FIFO,并设置FIFO发生中断的阈值,接收的FIFO的阈值为64,发送的FIFO的阈值为32.

	ldr	r0, =ELFIN_UART_CONSOLE_BASE		@0xEC000000
	ldr	r1, =0x111
	str	r1, [r0, #UFCON_OFFSET]

4. 设置UART的停止位、校验位和数据位
ULCON控制UART的停止位、校验位和数据位,向ULCON寄存器写入0x03即把UART设置无停止位、无校验位和8个数据位。

	mov	r1, #0x3
	str	r1, [r0, #ULCON_OFFSET]

5. 设置UART的模式
UCON寄存器控制UART的模式,把寄存器配置为0x3c5,即把UART配置为接收和发送中断模式。

	ldr	r1, =0x3c5
	str	r1, [r0, #UCON_OFFSET]

6. 设置波特率

	ldr	r1, =UART_UBRDIV_VAL	@0x2B /*  UDIV(43) = ((82,500,000 / 16 / 115200) - 1) */
	str	r1, [r0, #UBRDIV_OFFSET]

	ldr	r1, =UART_UDIVSLOT_VAL	@0xC /* UFRACVAL(12) = ((((82,500,000 / 16 / 115200) - 1) - 43) * 16) */
	str	r1, [r0, #UDIVSLOT_OFFSET]

7. 发送数据
UTXH_OFFSET寄存器保存准备发送的数据

	ldr	r1, =0x4f4f4f4f
	str	r1, [r0, #UTXH_OFFSET]		@'O'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值