0X_ARMv8_指令集_基于汇编的UART驱动
https://gist.github.com/carloscn/dec6fe9743b9cbbdc58a44e048ab5598
【摘要】:笨叔在完成ARMv8一些指令集操作之后,留了一个编写串口驱动的大作业,我觉得这个也算实操了,根据树莓派的datasheet,我们使用ARMv8的汇编完成UART驱动,也是对这一段时间学习的总结和运用。
【目标】:基于树莓派4B,编写基于UART的汇编驱动,实现UART的初始化、数据发送和数据接收的简单功能(不包含对于串口的FIFO等高级配置)
1. 初始化
树莓派串口的初始化操作和一般的bare-mental环境一致的,需要完成以下初始化操作:
配置GPIO复用,选择UART0为功能引脚,而不是GPIO口。
配置UART的RTL的时钟分频器,还要检查是否UART的时钟被使能。
配置UART协议相关项目,115200波特率,8位,1位,无奇偶校验。
配置UART中断,这里咱是配置为关闭。
使能UART整个模块的开关。
1.1 配置GPIO
根据文档,11.3. Primary UART Inputs and Outputs (Table 171. UARTAssignment on the GPIO Pin map),查询到UART0的TXD0对应GPIO14, RXD0对应GPIO15,物理属性皆为下拉,选择ALT功能为ALT0。
配置寄存器的GPFSEL1 Register的FSEL15和FSEL14配置GPIO14,GPIO15为100'b(0x4)作为ALT0功能。GPFSEL1的基地址是:0x7e200000 + 0x04。我们可以使用汇编LDR指令,把(1<<17) | (1<< 14) 配置到32位寄存器里面。
1.2 UART配置
这部分内容应该在UART的控制寄存器(CR register)
31:16:0000_0000_0000_0000
15-CTSEN: CTS硬件流控制,set 0
14-RTSEN: RTS流控,set 0
13:12 set 00
11: RTS: 0
10: DTR: 0
9: RXE, 使能接受 1
8: TXE,使能发送 1
7: LBE,数字回环 0
6:3 : 0000
2: SIRLP: 0
1: SIREN: 0
0: UARTEN 1
配置如上,应该向CR reg(0x7e201000 + 0x30)写入: 1000_0000_1100_0000_0000_0000_0000_0000'b -> 0x80C00000
相应的波特率,中断寄存器也是这样的操作
2. 发送和接收
发送和接收使用数据寄存器和标志位寄存器。
判断标志位寄存器:
Ref
最后更新于