电子说
今天,我们就来分析一下上次生成的CubeIDE点灯工程的源码,看看跟我们拿来“逆向”的开发板例程源码有什么异同。
上图中,Binaries和Includes文件夹我们不用去理它们,硬盘工程目录下并没有这两个文件夹,是在编译后产生的。另外3个文件夹是工程目录里实际上有的,其中Debug文件夹是在Debug工程配置下编译生成的,如果选择Release工程配置并编译,则会生成一个Release文件夹。
下面主要讲一下Core和Drivers文件夹以及工程根目录下的几个文件。
其中Core文件夹是用户代码的存放地,包括源文件和头文件。当然,你想重新建个文件夹放自己的代码也是没问题的。Core文件夹全打开后见下图。头文件和源文件是分开存放的,这跟硬盘上工程目录是一致的。
Keil MDK就不一样了,不会根据硬盘上工程目录下的文件位置去自动生成工程目录,需要手动去添加,哪怕你后期往工程目录里添加文件,也照样要在Keil里添加才出现在工程里。Eclipse就智能多了,自动识别硬盘上工程目录里的文件,自动添加。
上图中Inc目录里前两个头文件就不说了,stm32f7xx_hal_conf.h
的作用是要不要包含各种外设的头文件,如果你手动添加了一个外设,就算把HAL库里的外设驱动加进来了,也要在这个头文件里打开这个外设功能。
当然,也可以直接在用户代码里包含新添加的外设头文件,但是不推荐这样做。另外要注册自己的中断回调函数,也在这个头文件里开启相应的开关,这个回调函数的事情以后也可以说一说。
stm32f7xx_it.h
里放的都是中断服务函数的申明,包括异常和中断。
源文件里stm32f7xx_hal_msp.c
里放的是与MCU相关的初始化代码,msp也即MCU Specific Package
,一般外设的msp代码都放在外设对应的源文件中,stm32f7xx_hal_msp.c
基本上没什么东西。在CubeMX生成代码时也可以选择把外设的msp代码都放在stm32f7xx_hal_msp.c
中。
stm32f7xx_it.c
里放的都是中断服务函数,建议用户中断都放在这里,然后在相应的中断函数里调用自己写的中断服务函数或是HAL库提供的中断服务函数。
syscalls.c
里是系统调用的一些函数,可以改写。例如想用printf函数通过串口发送消息,则可以把串口发送代码添加进_write()
函数里。
sysmem.c
里有一个用来分配系统堆空间的函数。我们设置工程的时候只需要确定堆的大小即可,默认堆大小是512字节,如果在用户代码中不用malloc分配内存就不用改,完全够用。
系统内存在运行时,内存空间是按下图这样分配的。其中newlib heap那一段就是堆空间。未使用的RAM空间在bbs段与堆之间。
system_stm32f7xx.c
里包含系统初始化,时钟初始化函数。其中系统初始化函数是系统启动后,进入main函数之前执行的。
Startup文件夹下只有一个MCU对应的启动文件,以后可以具体分析一下这个启动文件,看一看系统启动后要执行哪些操作,然后才进入main函数。
Drivers文件夹展开后如下图。
基本上没什么好说的,一个是ARM提供的CMSIS标准软件接口,另一个是必要的HAL库函数。
上图中,第一个ioc文件不必多说,CubeMX生成的文件,后续可以改,重新生成代码。第二个launch文件是我们上次配置工程运行选项时生成的,要下载代码或调试代码都得有这个文件。如果用的是Release工程配置,则会生成一个Release.launch。
后边两个文件是链接文件,gcc里需要链接文件告诉编译器,各段要分别链接到什么地址上。其中FLASH.ld是我们常用的,生成的代码要下载到FLASH中运行。RAM.ld会把代码链接进RAM,调试的时候可以用,断电后内容就消失了。
更改链接文件的方法如下:
好了,今天就讲这么多,基本上CubeIDE工程里所有源文件的作用都讲到了,具体怎么实现的还需要自己去看源代码。接下来有时间讲讲启动代码。
全部0条评论
快来发表一下你的评论吧 !