上一节,我们提到了为什么使用汇编来写点亮led的驱动程序。因为没有c语言的运行环境,本节我们就来配置c语言的运行环境,毕竟c语言看起来还是舒服的。具体的寄存器地址和值请见上一节。
目录
一.配置C语言的运行环境
C语言的运行环境包括:
1.处理器模式的选择
2.堆栈指针(sp)的设置
3.转到C语言的入口程序main
1.处理器模式的选择
我们用的是arm-cortexA7的芯片有9种处理器模式,简单起见,我们选择超级管理员模式。接下查看reference sheet。处理器模式在寄存器CPSR的M[4:0]设置。可以看到我们使用超级管理员权限,即SVC模式。所以设置为10011。即0x13。
2.堆栈指针(sp)的设置
DDR开始的地址是0x80000000,因为堆栈是从大到小分配内存的,所以SP指针设置为0x80200000,大小为2M。
3.编写汇编程序
start.s
.global _start
_start :
@设置cpu为超级管理员模式
/*读取cspr的内容,用到的函数是MRS*/
MRS r0,cpsr
/*将r0中的M[4:0]清空*/
BIC r0,r0,#0x1f
/*将r0与0x13按位或*/
ORR r0,r0,#0x13
/*将r0中的数据写道cspr中 */
MSR cpsr,r0
@设置sp指针
LDR sp ,=0x80200000
@跳转到main函数
B main
二.编写c语言led驱动程序
我们将寄存器地址写在main.h文件中。
1.main.h
#ifndef __MIAN_H
#define __MIAN_H
/*CCM时钟寄存器的地址*/
#define CCM_CCGR0 *((volatile unsigned int*)0x020C4068)
#define CCM_CCGR1 *((volatile unsigned int*)0x020C406c)
#define CCM_CCGR2 *((volatile unsigned int*)0x020C4070)
#define CCM_CCGR3 *((volatile unsigned int*)0x020C4074)
#define CCM_CCGR4 *((volatile unsigned int*)0x020C4078)
#define CCM_CCGR5 *((volatile unsigned int*)0x020C407c)
#define CCM_CCGR6 *((volatile unsigned int*)0x020C4080)