Linux 学习记录54(ARM篇)
本文目录
- Linux 学习记录54(ARM篇)
- 一、框图分析
- 1. 芯片手册内部框图
- 2. 操作GPIO过程
- 二、通过汇编完成GPIO操作
- 1. 常用的汇编指令
- 2. GPIO初始化流程
- 3. 查找相关寄存器
- (1. RCC寄存器
- (2. GPIO寄存器
- >1. 模式配置寄存器
- >2. 输出模式配置寄存器
- >3. 速度配置寄存器
- >4. 上下拉配置寄存器
- >5. GPIO输出寄存器
- 4. 寄存器配置示例
- (1. RCC寄存器配置
- (2. GPIO寄存器配置
- 思维导图
- 练习代码
一、框图分析
以STM32MP157为例
1. 芯片手册内部框图
可以看到在STM32MP157A中有三个内核2个Cortex-A7 以及 一个Cortex-M4
2. 操作GPIO过程
二、通过汇编完成GPIO操作
1. 常用的汇编指令
1、数据操作指令1>数据搬移指令 mov2>移位操作指令 lsr lsl asr ror3>位运算指令 and orr eor bic4>算数运算指令 add adc sub sbc mul5>比较指令 cmp
2、跳转指令 b / bl
3、特殊功能寄存器操作指令 msr mrs
4、内存操作指令1> 单寄存器操作指令 ldr / str2> 多寄存器操作指令 ldm / stm3> 栈指针操作指令 stmfd / ldmfd
2. GPIO初始化流程
3. 查找相关寄存器
相关数据手册在文章顶部下载
(1. RCC寄存器
2.5.2
(2. GPIO寄存器
>1. 模式配置寄存器
>2. 输出模式配置寄存器
>3. 速度配置寄存器
>4. 上下拉配置寄存器
>5. GPIO输出寄存器
4. 寄存器配置示例
(1. RCC寄存器配置
@RCC_Init: @RCC时钟初始化 GPIOE
ldr r0,=0x50000A28 @GPIO的RCC地址为0x50000000,E组GPIO需要加上0x0A28的偏移量,上面图片的RCC寄存器可查
ldr r1,[r0] @将0x50000A28寄存器的地址中的数据读出
orr r1,r1,#(0X1<<4) @将E组的GPIO使能位置1
str r1,[r0] @重新写入寄存器中
(2. GPIO寄存器配置
@LED_Init: @LED的GPIO初始化@初始化GPIOE 8-10ldr r0,=0x50006000 @GPIOE模式 基地址ldr r1,[r0] @当前寄存器数据and r1,r1,#(~(0x3<<16)) @将要修改的位先清零orr r1,r1,#(0x1<<16) @重新赋值参数到r1寄存器str r1,[r0] @设置GPIO 参数到模式寄存器@输出配置ldr r0,=0x50006004 @GPIOE输出 基地址ldr r1,[r0] @当前寄存器数据bic r1,r1,#(0x1<<8) @重新赋值参数到r1寄存器str r1,[r0] @设置GPIO 参数到模式寄存器@速度配置ldr r0,=0x50006008 @GPIOE速度 基地址ldr r1,[r0] @当前寄存器数据bic r1,r1,#(0x3<<16) @将要修改的位先清零orr r1,r1,#(0x1<<16) @重新赋值参数到r1寄存器str r1,[r0] @设置GPIO 参数到模式寄存器@上下拉配置ldr r0,=0x5000600c @GPIOE速度 基地址ldr r1,[r0] @当前寄存器数据bic r1,r1,#(0x3<<16) @将要修改的位先清零orr r1,r1,#(0x1<<16) @重新赋值参数到r1寄存器str r1,[r0] @设置GPIO 参数到模式寄存器@将该引脚设置为高电平ldr r0,=0x50006014 @GPIOE速度 基地址ldr r1,[r0] @当前寄存器数据orr r1,r1,#(0x1<<8) @重新赋值参数到r1寄存器str r1,[r0] @设置GPIO 参数到模式寄存器
思维导图
练习代码
.text
.global _start_start: bl Initmov r5,#0loop:bl LED_ONbl delay_1sbl LED_OFFbl delay_1scmp r5,#10add r5,r5,#1bls loopInit:
@RCC_Init: @RCC时钟初始化ldr r0,=0x50000A28ldr r1,[r0]orr r1,r1,#(0X3<<4)str r1,[r0]@LED_Init: @LED的GPIO初始化@初始化GPIOE 8-10ldr r0,=0x50006000 @GPIOE模式 基地址ldr r1,[r0] @当前寄存器数据bic r1,r1,#(0x33<<16)orr r1,r1,#(0x11<<16) @重新赋值参数到r1寄存器str r1,[r0] @设置GPIO 参数到模式寄存器@输出配置ldr r0,=0x50006004 @GPIOE输出 基地址ldr r1,[r0] @当前寄存器数据bic r1,r1,#(0x5<<8) @重新赋值参数到r1寄存器str r1,[r0] @设置GPIO 参数到模式寄存器@速度配置ldr r0,=0x50006008 @GPIOE速度 基地址ldr r1,[r0] @当前寄存器数据bic r1,r1,#(0x33<<16) @重新赋值参数到r1寄存器orr r1,r1,#(0x11<<16) @重新赋值参数到r1寄存器str r1,[r0] @设置GPIO 参数到模式寄存器@上下拉配置ldr r0,=0x5000600c @GPIOE速度 基地址ldr r1,[r0] @当前寄存器数据bic r1,r1,#(0x33<<16) @重新赋值参数到r1寄存器orr r1,r1,#(0x11<<16) @重新赋值参数到r1寄存器str r1,[r0] @设置GPIO 参数到模式寄存器@初始化GPIOF 10ldr r0,=0x50007000 @GPIOE模式 基地址ldr r1,[r0] @当前寄存器数据bic r1,r1,#(0x3<<20)orr r1,r1,#(0x1<<20) @重新赋值参数到r1寄存器str r1,[r0] @设置GPIO 参数到模式寄存器@输出配置ldr r0,=0x50007004 @GPIOE输出 基地址ldr r1,[r0] @当前寄存器数据bic r1,r1,#(0x1<<10) @重新赋值参数到r1寄存器str r1,[r0] @设置GPIO 参数到模式寄存器@速度配置ldr r0,=0x50007008 @GPIOE速度 基地址ldr r1,[r0] @当前寄存器数据bic r1,r1,#(0x3<<20) @重新赋值参数到r1寄存器orr r1,r1,#(0x1<<20) @重新赋值参数到r1寄存器str r1,[r0] @设置GPIO 参数到模式寄存器@上下拉配置ldr r0,=0x5000700c @GPIOE速度 基地址ldr r1,[r0] @当前寄存器数据bic r1,r1,#(0x3<<20) @重新赋值参数到r1寄存器orr r1,r1,#(0x1<<20) @重新赋值参数到r1寄存器str r1,[r0] @设置GPIO 参数到模式寄存器mov pc,lrLED_ON:ldr r0,=0x50006014 @GPIOE速度 基地址ldr r1,[r0] @当前寄存器数据orr r1,r1,#(0x5<<8) @重新赋值参数到r1寄存器str r1,[r0] @设置GPIO 参数到模式寄存器ldr r0,=0x50007014 @GPIOE速度 基地址ldr r1,[r0] @当前寄存器数据orr r1,r1,#(0x1<<10) @重新赋值参数到r1寄存器str r1,[r0] @设置GPIO 参数到模式寄存器mov pc,lrLED_OFF:ldr r0,=0x50006014 @GPIOE速度 基地址ldr r1,[r0] @当前寄存器数据bic r1,r1,#(0x5<<8) @重新赋值参数到r1寄存器str r1,[r0] @设置GPIO 参数到模式寄存器ldr r0,=0x50007014 @GPIOE速度 基地址ldr r1,[r0] @当前寄存器数据bic r1,r1,#(0x1<<10) @重新赋值参数到r1寄存器str r1,[r0] @设置GPIO 参数到模式寄存器mov pc,lr@ 大概1s的延时函数
delay_1s: @延时函数mov r3, #0x10000000mm:cmp r3, #0subne r3, r3, #1bne mmmov pc, lr.end