在这次博客的编写开始前,我想说一下为什么我会用到这个芯片以及为什么要移植LVGL,首先在前面的博客由于我的最小系统板内存紧张,频率低,io口资源紧张,所以我就买了一个f429的开发板,但是我在网上看了很多教学视频,都是教你怎么移植LVGL或者就是教你怎么移植HAL版本的文件,但是对于我想移植标准库文件的人来说,就非常不友好,于是我就开始了这篇博客的撰写。
首先网上有的说,如今st公司不再提供标准库的f429。但是我搜了一下st官网,上面有个1.9.0版本的f429,那么我们就用它来进行移植。首先需要下载并获得它的压缩包,然后进行移植。
我们在移植前需要创建一个工程文件夹,其中存放四个文件,分别是Project工程文件层,Libraries库文件层,User:用户层,Demo:实例层
具体文件首先我们要知其然知其所以然,拿到了压缩包文件,其内部是干嘛的?首先我们移植需要三个层次文件,分别为
1:CMSIS:COTEX MICROCONTROLLER SOFTWARE INTERFACE STANDARD :cotex微控制器软件接口标准:这个标准是由ARM公司指定的Cortex-M软件统一标准,起作用是屏蔽编译器差异,统一内核操作API,提升嵌入式代码可移植性。
2:StdPeriph_Driver层:标准库外设驱动层
3:User:用户层
一:对于第一层我们需要分为核心层文件和外设文件,其中核心层文件是由ARM公司提供,其决定的是内核,对于所有CM4芯片是通用的。我们需要五个文件
1:core_cm4.h:cm4内核寄存器定义:包含NVIC,SCB,SysTick,FPU等api
2:core_cmfunc.h:内核功能函数的内联实现
3:core_cminstr.h:内核指令的内联实现
4:core_cmsimd.h:SIMD指令支持
5:cmsis_compiler.h:编译器适配层,根据Keil/GCC/IAR自动选择实现。
这个核心层文件是放置在库文件层的CMSIS的inc目录,因为是h文件,所以放置inc目录Libraries/CMSIS/Include/
二:接着是CMSIS设备层文件(是由ST提供),这一层呢并不是刚刚的核心层,针对的是内核,这一层是针对STM32F429这颗芯片,其位于 Libraries/CMSIS/Device/ST/STM32F4xx/下。其中包含四个文件:
1:stm32f4xx.h:F4全系列寄存器地址,外设结构体,中断号枚举的芯片说明书。移植F429时通过宏STM32F429XX激活F429专属定义
2:system_stm32f4xx.c:SystemInit()函数所在,上电后配置PLL将系统时钟设为180Mhz,F429需在此开启Over-Drive模式:这里标注OVER-DRIVE意思是超速模式,首先stm32f4内部稳压电源有2种工作模式:第一种为Normal正常模式:内核允许最高时钟是168MHZ,第二种为Over-Drive超速模式:提升内部电压调节器输出电压,芯片可稳定跑到180MHZ。
3:system_stm32f4xx.h:System_Init()和SystemCoreClock的声明
4:startup_stm32f429_439xx.s:f429专用启动文件,定义中断向量表,堆栈,reset_handler复位中断。这里启动文件关键职责:1:初始化MSP(主栈指针)和堆空间,2:复制.data段到SRAM,清零.bss段,3:调用systeminit()配置时钟,4:跳转main()
三:标准外设库驱动文件(ST提供)需要添加inc头文件,以及src源文件,其中所需要的外设自行添加。misc.c/h:NVIC中断控制器封装,配置中断优先级,使能中断。不加入则无法使用中断
注意点:
1:这里必须要移除stm32f4xx_fsmc.c/.h——这是 F407 专属的,与 F429 的 stm32f4xx_fmc.c 存在符号冲突,同时加入会导致链接报错
四:用户层配置文件:
1:main.c.h程序入口以及公共头文件
2:stm32f4xx_conf.h:外设库总配置文件:被stm32f4xx.h通过#include引入,内部根据stm32f429_439xx宏条件编译
3:stm32f4xx_it.c/h:中断服务函数集中文件。模板中预定义了NML,HardFault,MemManagem,BusFalut,UsageFault等系统异常的空函数,用户在此添加外设中断服务函数。(这里非常重要,在我们遇到栈指针溢出,内存溢出等情况导致的hardfault时,我们就可以在这个中断函数打印日志,查询出错的栈指针,判断哪里出现问题。这里后面我也会单独出一个博客,来表明我的观点。)
注意:移植过程中,我们还需要添加两个宏,否则库不会工作
1:USE_STDPERIPH_DRIVER:标准外设库总开关。stm32f4xx.h头部检测此宏,未定义则跳过#include,所有外设api不可用
2:STM32F429_439xx:芯片型号标识。库内部通过 #if defined(STM32F429_439xx) 选择编译 F429 专属外设代码,屏蔽 F407 不兼容部分
解释:这里可能大家会好奇为什么要这么设置,首先这是编译器预处理阶段行为,这个作用是编译器在编译每一个c源文件前,都会先加载工程选项里填写的全局#define,再去解析当前.c里面的#include的所有头文件,所有#ifdef/#if define() 全部可以识别这两个宏,相当于编译器自动给每一个待编译文件头部隐形添加两个宏定义
五:最后就是给头文件包含路径配置。如果大家遇到什么问题欢迎私信问我或者在评论区交流,我会持续发布博客的,大家可以关注我。
网硕互联帮助中心






评论前必须登录!
注册