一、汇编LED原理分析
学习Cortex-A汇编:1.用汇编初始化一些SOC外设;
2.使用汇编初始化DDR,I.MX6U不需要
3.设置sp指针,一般指向DDR,设置好C语言运行环境。
二、STM32 IO 初始化流程
1.使能GPIO时钟;
2.设置IO复用,将其复用为GPIO;
3.配置GPIO的电气属性;
4.使用GPIO,输出高/低电平。
三、I.MX6ULL IO 初始化:
1.使能时钟,CCGR0~CCGR6这7个寄存器控制着6ULL所有外设时钟的使能。为了简单,设置CCGR0-CCGR6这7个寄存器全部为0XFFFFFFFF,相当于使能所有外设时钟。
2.IO复用,将寄存器IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 bit3~0 设置为0101=5,这样GPIO_IO03就设置为复用GPIO。
3. 寄存器IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03是设置GPIO_IO03的电气属性。包括压摆率、速度、驱动能力、开漏、上下拉等。
4. 配置GPIO功能,设置输入输出。设置GPIO1_DR寄存器bit3为1,也就是设置为输出模式,设置GPIO1_DR寄存器的bit3,为1表示输出高电平,为0,表示输出低电平。
四、基础汇编指令
1.MOV :
MOV R0,R1 ;寄存器间数据传递
MOV R0,#0X12;立即数传递寄存器
2.MRS :
MRS R0,CPSP;用于将特殊寄存器(如CPSR和SPSR)中的数据传递给通用寄存器,读取特殊 寄存器中数据只能用MRS指令。
3. MSR :
MSR CPSR,R0;与MRS指令相反。
4.LDR:
LDR Rd,[Rn, #offset]; 从存储器Rn+offset的位置读取数据存放到Rd中
5.STR:
STR Rd,[Rn, #offset] ; 将Rd中数据写入到存储器中的Rn+offset位置
五、编译程序
1.使用arm-linux-gnueabihf-gcc编译将.c .s文件变为 .o
2.将所有的.o 文件链接为elf格式的可执行文件,链接需要指定链接起始位置,即代码运行的起始地址,对于6ULL来说,应该指向RAM地址。(Cortex-A一般内部无flash)RAM分为内部RAM和外部RAM,也就是DDR。6ULL内部RAM地址范围0X900000~0X91FFFF,外部RAM(DDR)若为512MB,则0X80000000-0XA0000000,对于256MB大小,则0X80000000-0X8FFFFFFF。裸机代码链接起始地址为0X87800000。
3.将elf文件转为bin文件,bin的运行地址一定要和链接起始地址一致,位置无关代码除外
4.将elf文件转为汇编,反汇编
示例代码:
arm-linux-gnueabihf-gcc -g -c led.s -o led.o
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
arm-linux-gnueabihf-objdump -D led.elf > led.dis
makefile:
强调 arm前用tab键隔开
led.bin:led.s
arm-linux-gnueabihf-gcc -c led.s -o led.o
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
arm-linux-gnueabihf-objdump -D led.elf > led.dis
clean:
rm -rf *.o led.bin led.elf led.dis