ARM汇编 beep及bsp工程管理
1.beep
查阅手册知,蜂鸣器对应的网络编号为 SNVS_TAMPER1,故需要设置其相关的配置
- iomuxc引脚复用功能配置
- iomuxc引脚电器特性配置
- GPIO引脚方向配置
void beep_init(void)
{//IOMUXC引脚复用功能配置IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01, 0);//IOMUXC引脚电器特性配置IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01, 0x10B0);//GPIO引脚输出方向GPIO5->GDIR |= (1<<1);
}
可用sdk(NXP提供的I.MX6ULL头文件)的头文件,使用IOMUXCC_SetPinMux,设置IO复用功能的配置,后面的宏,前面写引脚本身的功能后面写要变成的功能
IOMUXC_SetPinConfig,设置IOMUXC引脚电器特性的配置
经查SNVS_TAMPER1的IOMUXC复用为GPIO5_IO01,故后面需要配置GPIO5_IO01
后设置蜂鸣器相关的亮灭都是控制GPIO5_IO01
void beep_on(void)
{GPIO5->DR &= ~(1<<1);
}void beep_off(void)
{GPIO5->DR |= (1<<1);
}
2.CCR
Clock Control Module(时钟控制模块),这是嵌入式系统中与时钟管理相关的硬件模块
在 ARM 架构嵌入式处理器的时钟控制模块(CCM) 中,CCGR(Clock Gating Register,时钟门控寄存器) 是负责控制外设或模块时钟使能 / 关闭的关键寄存器,其核心作用是通过 “时钟门控” 机制实现精细化的功耗管理。
一个CCM包含多个CCGR因此,先将所有外设的时钟门打开,
一个 CCGR 通常为 32 位寄存器;
void clock_init(void)
{CCM->CCGR0 = 0xFFFFFFFF;CCM->CCGR1 = 0xFFFFFFFF;CCM->CCGR2 = 0xFFFFFFFF;CCM->CCGR3 = 0xFFFFFFFF;CCM->CCGR4 = 0xFFFFFFFF;CCM->CCGR5 = 0xFFFFFFFF;CCM->CCGR6 = 0xFFFFFFFF;
}
3.链接脚本
1.定义
链接脚本(Linker Script)是编译器工具链(如 GCC 中的ld
)使用的一种配置文件,用于控制链接器(Linker)如何将多个目标文件合并为最终的可执行文件或库文件。它的核心作用是定义程序在内存中的布局 —— 包括代码、数据、变量等在内存中的存储位置、地址分配和段(Section)组织方式。
2.段
程序的目标文件中包含多种 “段”(如代码段、数据段),链接脚本需指定这些段映射到哪个内存区域:
.text
:存放程序代码(函数指令);.data
:存放已初始化的全局变量;.bss
:存放未初始化的全局变量(运行时自动清零);.rodata
:存放只读数据(如字符串常量);
3.示例
SECTIONS
{. = 0x87800000;.text :{obj/start.o*(.text)}.rodata ALIGN(4) : {*(.rodata*)}.data ALIGN(4): {*(.data)}__bss_start = .;.bss ALIGN(4) : {*(.bss) *(COMMON)}__bss_end = .;
}
“.”在链接脚本里面叫做定位计数器,默认的定位计数器为 0,我们要求链接的开始地址为0x87800000,.text文本段,设置引导c语言启动的汇编代码start.o在这里开始,*代表通配符的意思
接下来.rodata段 ALGIN(4)代表此段4字节对齐
注意.bss段是未初始化的全局变量段,c语言规定.bss段的全局变量默认为0,故需要手动清0,因此需要记录.bss段的起始位置和终点位置,然后再start.S中进行手动清0
如图为start.S的清0示例:
_bss_init:ldr r0, =__bss_startldr r1, =__bss_endmov r2, #0
loop:str r2, [r0]add r0, r0, #4cmp r0, r1blt loopbx lr
先将起始位置和终点位置用r0和r1记录,随后给r2赋值0,将r2的0赋值给r0,将r0不断加4(即4字节)比较r0和r1,若开始位置大于或等于结束位置,则代表.bss段初始化结束
4.编译过程工具
arm-linux-gnueabihf-gcc ARM 架构的交叉编译工具链
arm-linux-gnueabihf-ld 链接文件
arm-linux-gnueabihf-objcopy 格式转换
5.bsp工程管理
在嵌入式开发中,BSP(Board Support Package,板级支持包)工程管理是指对 “支持特定硬件板卡运行所需的底层软件集合” 进行系统化组织、维护和优化的过程。它是连接硬件板卡与上层软件(如操作系统、应用程序)的桥梁,核心目标是让上层软件无需关注硬件细节即可在目标板上运行。
1.project :存放必要程序
main.c start.S
2.imx6ull :存放NXP提供的i.mx6ull头文件
cc.h core_ca7.h fsl_common.h fsl_iomuxc.h MCIMX6Y2.h
3.bsp :存放硬件外设相关功能模块
led.c led.h beep.c beep.h
4.Makefile: 需要遍目录