在u-boot启动代码start.S中初始化串口,可用于打印调试信息。
1、用汇编写一个简单的串口初始化程序
#define PCLK 50625000 // cpu时钟是405MHz,所以PCLK=405000000/8
#define UART_CLK PCLK // UART0的时钟源设为PCLK
#define UART_BAUD_RATE 115200 // 波特率
#define UART_BRD ((UART_CLK / (UART_BAUD_RATE * 16)) - 1)
@ USART0相关寄存器定义
#define ULCON0 0X50000000 /*线路控制寄存器*/
#define UCON0 0X50000004 /*控制寄存器*/
#define UFCON0 0X50000008 /*FIFO 控制寄存器*/
#define UMCON0 0X5000000C /*MODEM 控制寄存器*/
#define UTRSTAT0 0x50000010 /*TX/RX 状态寄存器*/
#define UERSTAT0 0x50000014 /*Rx 错误状态寄存器*/
#define UFSTAT0 0x50000018 /*FIFO 状态寄存器*/
#define UMSTAT0 0x5000001C /*MODEM 状态寄存器*/
#define UTXH0_L 0x50000020 /*小端模式*/
#define UTXH0_B 0x50000023 /*大端模式*/
#define URXH0_L 0x50000024 /*小端模式*/
#define URXH0_B 0x50000027 /*大端模式*/
#define UBRDIV0 0x50000028 /*波特率分频寄存器 0*/
#define GPHCON 0x56000070 /*GPH控制寄存器*/
#define GPHUP 0x56000078 /*GPH内部上拉配置寄存器*/
/*usart0初始化*/
usart0_init:
@串口IO初始化
/**第4~7位设置 1010 ,把GPH2 GPH3引脚复用到usart0*/
ldr r12,=GPHCON
ldr r11,[r12]
bic r11,#0xf0
orr r11,r11,#0xa0
str r11,[r12]
/**GPH2 GPH3 设置内部上拉 */
ldr r12,=GPHUP
ldr r11,[r12]
bic r11,#0xc0
str r11,[r12]
@8N1(8个数据位,无较验,1个停止位)
ldr r11,=ULCON0
ldr r12,= 0x03
str r12,[r11]
@查询方式,UART时钟源为PCLK
ldr r11,=UCON0
ldr r12,= 0x05
str r12,[r11]
@不使用FIFO
ldr r11,=UFCON0
ldr r12,= 0x00
str r12,[r11]
@不使用流控制
ldr r11,=UMCON0
ldr r12,= 0x00
str r12,[r11]
@波特率设置为115200
ldr r11,=UBRDIV0
ldr r12,=UART_BRD
str r12,[r11]
mov pc,lr
@usart0发送测试
usart0_send:
ldr r12,=UTXH0_L
ldr r11,=0x38
str r11,[r12]
mov pc,lr
修改后的u-boot.bin通过Minitool选择裸机程序方式下载到开发板运行。
程序中调用usart0_send:,打印了asc码 0x38,即字符“8”,如下图所示:
2、在汇编中用串口打印寄存器内容
汇编代码如下:
@检查usart0是否发送完成,未完成则等待
check_tx_flag:
ldr r1,=UTRSTAT0
ldr r0,[r1]
tst r0,#4
beq check_tx_flag
mov pc,lr
@打印r10寄存器数据
usart0_print_r10:
mov r11, #0x4 @循环4次,每次打印一字节数据
0:
@发送一字节数据
ldr r12,=UTXH0_L
MOV R10, R10, ROR #24 @循环右移24位
str r10,[r12] @一次发生8bit数据
mov r1,lr @保存lr
bl check_tx_flag @等待发送完成(这里会改变lr)
mov lr,r1 @恢复lr
@判断循环是否结束
sub r11, r11, #1
mov r12, #0
cmp r11, r12
bne 0b
mov pc,lr //返回被调用的地方
使用方法如下:
...........
...........
@把R10寄存器的内容打印到串口
ldr r10,=0x31323334
bl usart0_print_r10
b . //程序停在在这里(死循环)
打印效果
字符显示:
16进制显示:
可以看到R10的内容(ldr r10,=0x31323334)被成功打印出来了。