3.仿32的驱动开发【笔记】

概述:本节主要利用自己创建结构体指针的方式,通过指针访问寄存器,达到类似于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将指令进行了变量化处理,在使用时更加方便。剩下的参考上一章注释。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值