概述:本节主要利用自己创建结构体指针的方式,通过指针访问寄存器,达到类似于STM32开发的效果。且NXP有自己的库,在下一节我们会学习到,但在学习中要直接怼到寄存器上,方便我们接下来学习Uboot和Linux!!!
汇编清除bss段
.global _start /* 全局标号 */
.global _bss_start
_bss_start:
.word __bss_start
/*相当于C语言里面的变量,.word表示在这里放了一个变量,
*_bss_start就是这个变量的标签,类似变量名,存放bss起始地址 */
.global _bss_end
_bss_end:
.word __bss_end
_start:
/* 进入SVC模式 */
mrs r0, cpsr
bic r0, r0, #0x1f /* 将r0寄存器中的低5位清零,也就是cpsr的M0~M4 */
orr r0, r0, #0x13 /* r0或上0x13,表示使用SVC模式 */
msr cpsr, r0 /* 将r0 的数据写入到cpsr_c中 */
/*清除BSS段 把r2的数据向r0写,每写一个数人r0地址加一,一直加到r1*/
ldr r0, _bss_start
ldr r1, _bss_end
mov r2, #0 /* 将0x0传递给r2寄存器,r2=0*/
bss_loop:
stmia r0!, {r2} /*往r0的地址里写r2 写完之后递增 */
cmp r0, r1 /*比较r0和r1里面的值 r0<=r1清除没有完成*/
ble bss_loop /*ble跳转 如果r0<=r1,继续清除bss段 直到r0>r1清除完成*/
/*设置sp指针 */
ldr sp,=0X80200000 /* 设置栈指针 */
b main /* 跳转到main函数 */
.h文件
节选部分代码,进行分析。
主要分为三个部分。
1.定义寄存器基地址#define CCM_BASE (0X020C4000)
2.定义结构体内容
在stm32中__IO即为volatile uint32_t为unsigned int
注意:在结构体中添加寄存器的时候一定要注意地址的连续性,如果不连续的话要添加占位。例如:RESERVED_1[2];
typedef struct
{
volatile unsigned int CCR;
volatile unsigned int RESERVED_1[2];
volatile unsigned int CDHIPR;
volatile unsigned int RESERVED_2[2];
volatile unsigned int CGPR;
volatile unsigned int CCGR0;
volatile unsigned int CCGR1;
volatile unsigned int CCGR2;
volatile unsigned int CCGR5;
volatile unsigned int CCGR6;
volatile unsigned int RESERVED_3[1];
} CCM_Type;
3.访问方式:通过指针访问寄存器。
#define CCM ((CCM_Type *)CCM_BASE)
.c文件
通过结构体指针访问寄存器
void led_init(void)
{
/* 1、初始化IO复用 */
IOMUX_SW_MUX->GPIO1_IO03 = 0X5; /* 复用为GPIO1_IO03 */
/* 2、配置GPIO1_IO03的IO属性 */
IOMUX_SW_PAD->GPIO1_IO03 = 0X10B0;
/* 3、初始化GPIO */
GPIO1->GDIR = 0X0000008; /* GPIO1_IO03设置为输出 */
/* 4、设置GPIO1_IO03输出低电平,打开LED0 */
GPIO1->DR &= ~(1 << 3);
}
Makefile
objs := start.o main.o
ld := arm-linux-gnueabihf-ld
gcc := arm-linux-gnueabihf-gcc
objcopy := arm-linux-gnueabihf-objcopy
objdump := arm-linux-gnueabihf-objdump
ledc.bin:$(objs)
$(ld) -Timx6ul.lds -o ledc.elf $^
$(objcopy) -O binary -S ledc.elf $@
$(objdump) -D -m arm ledc.elf > ledc.dis
%.o:%.s
$(gcc) -Wall -nostdlib -c -O2 -o $@ $<
%.o:%.S
$(gcc) -Wall -nostdlib -c -O2 -o $@ $<
%.o:%.c
$(gcc) -Wall -nostdlib -c -O2 -o $@ $<
clean:
rm -rf *.o ledc.bin ledc.elf ledc.dis
此次makefile将指令进行了变量化处理,在使用时更加方便。剩下的参考上一章注释。