1. 混合编程
所谓的混合编程就是c语言资源和汇编资源的相互调用
思想:将汇编的标签当作C语言的函数使用
将C语言的函数当作汇编的标签使用
1.1 汇编调用c语言
1.2 C语言调用汇编
1.3 c语言内联汇编
在某一些特定的场景下需要在c语言中直接使用汇编的语法,此时需要内联汇编。内联汇编的实现需要通过asm关键字进行修饰
2. 软件编程控制硬件的原理(重点)
CPU可以执行的指令
数据处理指令 跳转指令 内存读写指令 状态寄存器传输指令 软中断产生指令
硬件的工作都是cpu进行控制的,软件编写的程序会保存到cpu的内存中,cpu从内存中得到硬件控制程序的指令,根据指令完成硬件控制
cpu想要控制各类硬件外设接口,必须将手伸到CPU外部,而能够让CPU将手伸到CPU外面的指令只有内存读写指令,换句话说,CPU通过对内存的读写完成对于硬件的控制
一个芯片厂商在生产一个芯片时,会在soc内部固化一段内存,这段内存占据了内存的0-4G寻址空间一部分。这段内存称为特殊功能寄存器组织。每一个外设接(GPIO\UART\IIC\DMA\TIM...) 都会在这个寄存器组织中有自己对应的寄存器组织,当CPU对特殊功能寄存器组织进行数据的读和写,就可以让对应的外设接口进行工作
3. GPIO实验
通过GPIO实验,编写GPIO控制程序,可以控制芯片的GPIO管脚输出高低电平,进而控制LED、风扇、蜂鸣器进行工作
作业
.text
.global _start
_start:
@设置使能时钟 把RCCMPAHB4ENSETR寄存器的第四位设置为1
ldr r0,=0x50000a28
ldr r1,[r0]
orr r1,r1,#(0x3<<4)
str r1,[r0]
@设置引脚为输出模式
ldr r0,=0x50006000
ldr r1,[r0]
bic r1,r1,#(0x3<<20)
bic r1,r1,#(0x3<<16)
orr r1,r1,#(0x1<<20)
orr r1,r1,#(0x1<<16)
str r1,[r0]
ldr r0,=0x50007000
ldr r1,[r0]
bic r1,r1,#(0x3<<20)
orr r1,r1,#(0x1<<20)
str r1,[r0]
@设置引脚为推挽输出
ldr r0,=0x50006004
ldr r1,[r0]
bic r1,r1,#(0x1<<10)
bic r1,r1,#(0x1<<8)
str r1,[r0]
ldr r0,=0x50007004
ldr r1,[r0]
bic r1,r1,#(0x1<<10)
str r1,[r0]
@设置输出速度为低速输出
ldr r0,=0x50006008
ldr r1,[r0]
bic r1,r1,#(0x3<<20)
bic r1,r1,#(0x3<<16)
str r1,[r0]
ldr r0,=0x50007008
ldr r1,[r0]
bic r1,r1,#(0x3<<20)
str r1,[r0]
@设置是否有上拉下拉电阻
ldr r0,=0x5000600c
ldr r1,[r0]
bic r1,r1,#(0x3<<20)
bic r1,r1,#(0x3<<16)
str r1,[r0]
ldr r0,=0x5000700c
ldr r1,[r0]
bic r1,r1,#(0x3<<20)
str r1,[r0]
loop:
bl led1_on
bl delay
bl led1_off
bl led2_on
bl delay
bl led2_off
bl led3_on
bl delay
bl led3_off
b loop
@led1开启
led1_on:
ldr r0,=0x50006014
ldr r1,[r0]
orr r1,#(0x1<<10)
str r1,[r0]
mov pc,lr
@led1关闭
led1_off:
ldr r0,=0x50006014
ldr r1,[r0]
and r1,#(0x0<<10)
str r1,[r0]
mov pc,lr
@led2开启
led2_on:
ldr r0,=0x50007014
ldr r1,[r0]
orr r1,#(0x1<<10)
str r1,[r0]
mov pc,lr
@led2关闭
led2_off:
ldr r0,=0x50007014
ldr r1,[r0]
and r1,#(0x0<<10)
str r1,[r0]
mov pc,lr
@led3开启
led3_on:
ldr r0,=0x50006014
ldr r1,[r0]
orr r1,#(0x1<<8)
str r1,[r0]
mov pc,lr
@led3关闭
led3_off:
ldr r0,=0x50006014
ldr r1,[r0]
and r1,#(0x0<<8)
str r1,[r0]
mov pc,lr
delay:
ldr r5,=0x0f000000
mm:
cmp r5,#0x0
subne r5,r5,#0x1
bne mm
mov pc,lr
.end