基础的操作寄存器,是直接访问该寄存器,但如果寄存器太多,也会显得太过繁琐,也会比较乱。
模仿stm32驱动开发,利用结构体来承载所有的寄存器抽象化为外设。
将上一章的跑马灯实验修改一下。
修改驱动
1、清除bss段
bss段是链接脚本中定义但没有被初始化的变量,对于这些变量,最好是清零。
_start: /*设置处理器进入SVC模式*/
mrs ro, cpsr /*读取cpsr到ro*/
bic r®, r0,#x1f /*清除cpsr的bit4-0*/
orr r®, r,#@x13 /*使用SVC模式*/
msr cpsr, ro /*将ro写入到cpsr*/
/*清除BSS段*1
ldr ro,_bss_start
ldr rl,_bss_end
mov r2,#0
bss_loop:
stmia ro!,{r2}
cmp ro, r1 /*比较RO和R1里面的值*/
ble bss_loop /*如果ro地址小于等于r1,继续清除 bss段*/
2、定义外设的基地址,构建结构体。
#define CCM BASE
(0X020C4000)
#define CCM_ANALOG_BASE
(0X020C8000)
#define IOMUX_SW_MUX_BASE
(0X620E0014)
#define IOMUX_SW_PAD_BASE
(0X620E0204)
#define GPIO1_BASE
(0Xe209c000)
#define GPIO2_BASE
(0X020A0000)
#define GPIO3 BASE
(0x020A4000)
#define GPIO4_BASE
(0x020A8000)
#define GPIO5_BASE
(0Xe20AC000)
3、编写链接脚本。
SECTIONS {
0X87800000;
.text :
start.o
*(.text){
.rodata ALIGN(4):{*(.rodata)}
.data ALIGN(4):{*(.data)}
[ibss_sart=.;
.bss ALIGN(4):{*(.bss)*(COMMON)}
lbss_end=.;
}
运行结果:
对于一些比较大的工程,文件可能会比较多,所以会bsp工程管理很重要。
BSP工程管理原理
bsp工程管理的目的是为了模块化管理代码,同一属性的文件放在同一个文件夹里。
1、新建所需的文件夹,将同一属性的文件放到相应的文件夹中。
2、修改 clk、led、delay 驱动,创建对应的驱动文件,然后放置到对应的目录中。
3、根据编写的新驱动文件,修改 main.c 文件内容。
设置 VSCODE 头文件路径。先创建:yscode.目录,然后打开 c/c++配置器,会在yscode
目录下生成一个叫做 c.cpp_properties,json 的文件。
"configurations":[
{
"name":"Linux",
"includePath":[
"${workspaceFolder}/**”
"${workspaceFolder}/bsp/clk",
"${workspaceFolder}/bsp/delay"
"${workspaceFolder}/bsp/led",
"${workspaceFolder}/imxqu",
"${workspaceFolder}/project"
]
"defines":[],
"compilerPath":"/usr/bin/gcc",
"cStandard":"c11",
"cppStandard":"c++17",
"intellisenseMode":"clang-x64”
}
]
"version": 4