STM32F4 之 keil 工程建立

:该文是对自己搭建 keil 工程所做精简记录,详细内容可参考《 STM32F4开发指南-库函数版本_V1.1
1 下载 pack 包
在 MDK5 安装完成后,要让 MDK5 支持 STM32F407 的开发,还要安装 STM32F4 的器件支持包: Keil.STM32F4xx_DFP.1.0.8.pack(STM32F4 的器件包),这样在 keil 中就可以选择我们所需要的芯片(STM32F4)建立工程了。pack包下载官网地址: http://www.keil.com/dd2/pack/#/eula-container  

2 下载固件库
我们之所以要下载对应 STM32F4 固件库是因为我们要用到固件库提供给我们的启动文件( startup_stm32f40_41xxx.s)以及一些关键文件和外设驱动。这块介绍在下面有做介绍。
针对 STM32F407 我们可以在 ST 官网上下载对应的标准外设固件库。
步骤一:打开ST公司官网: http://www.stmicroelectronics.com.cn/web/en/home.html
步骤二:点击官网左上方的 Tools & Software 选择 MCUs Embedded Software
然后依次找到自己想要的代码库。我这边下载的代码库文件是 STM32F4xx_DSP_StdPeriph_Lib_V1.8.0

3 建立 keil 工程目录

我这边建立目录情况如上:
core 放置芯片启动文件,即跳转到 main 函数的文件
Document 放置模块及系统相关描述性文档
driver 放置从标准固件库拷贝过来的外设驱动
init 放置应用程序初始化文件
project 放置不同客制化工程 keil 工具生成的文件
--ftproject 存放为不同项目建立的 keil 工程文件
RTOS 放置移植的实时操作系统,此次对象为 FreeRTOS
tool 放置各种第三方工具,例如 Lwip、Cjson 等

4 新建 keil 工程
打开 Keil,点击 Keil 的菜单: Project –>New Uvision Project ,然后将目录定位到刚才建立的文件夹 project 目录下的 ftproject 子目录,同时,工程取名为 ftproject之后点击保存,我们的工程文件就都保存到 ftproject 文件夹下面。在如上操作点击保存后,会弹出如下选择 Device 界面,我看了下我的主板型号为:STM32F407VGT6,后如下图所示选择对应设备,点击OK即可。
注意:一定要安装对应的器件 pack 才会显示如下截图列表内容,否则会出现找不到我们想要设备型号的选项


5 拷贝关键文件
在拷贝关键文件前,我们先了解下固件库里的一些关键文件及这些关键文件的联系。 通过从标准固件库里移植这些关键文件,我们就可以正常启动并使用我们手头上的开发板了。一些关键文件联系如下图所示:

core_cm4.h 这个是 CMSIS 核心文件,提供进入 M4 内核接口,这是 ARM 公司提供,对所有CM4 内核的芯片都一样。后面也不需要修改这个文件。
system_stm32f4xx.h 是片上外设接入层系统头文件。主要是申明设置系统及总线时钟相关的函数。与其对应的源文件为 system_stm32f4xx.c。 该头文件里面有一个非常重要的 SystemInit() 函数申明,这个函数在我们系统启动的时候都会调用,用来设置系统的整个系统和总线时钟。
stm32f4xx.h 是 STM32F4 片上外设访问层头文件。 这个文件就相当重要了,只要你做STM32F4 开发,你几乎时刻都要查看这个文件相关的定义。这个文件打开可以看到,里面非常多的结构体以及宏定义。 这个文件里面主要是系统寄存器定义申明以及包装内存操作
stm32f4xx_conf.h 是外设驱动配置文件。 文件打开可以看到一堆的#include,这里你建立工程的时候,可以注释掉一些你不用的外设头文件。
除了以上的文件以外,我们在建立工程时要引用一个很关键的 启动文件startup_stm32f40_41xxx.s
该启动文件主要进行堆栈之类的初始化, 中断向量表以及中断函数定义。启动文件要引导进入main 函数。其中Reset_Handler 中断函数是唯一实现了的中断处理函数,其他的中断函数基本都是死循环。 Reset_handler 在我们系统启动的时候会调用。如下截图所示:

注意:在进入 main 函数之前,首先要调用 SystemInit 系统初始化函数。该初始化函数在如上介绍的关键文件 stm32f4xx.h 中被声明。更详细的介绍可以参考《STM32F4开发指南-库函数版本_V1.1》第三章

通过对如上关键文件的了解,下面便是整理这些文件,建立自己的工程,操作如下:
将 \STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm 目录下的 startup_stm32f40xx.s 拷贝到之前建立的工程目录下的 core 文件夹下
将 \STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Libraries\CMSIS\Include 目录下的 core_cm4.hcore_cmSimd.hcore_cmFunc.h 以及 core_cmInstr.h 四个头文件拷贝到 core 目录下的 inc 文件夹下
将 \STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Libraries\CMSIS\Device\ST\STM32F4xx\Include 目录下的两个头文件( stm32f4xx.hsystem_stm32f4xx.h)拷贝到 core 目录下的 inc 文件夹下
将 \STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Project\STM32F4xx_StdPeriph_Templates 目录下如下文件拷贝到自己工程的对应目录下。

system_stm32f4xx.c 拷贝到 core 目录下
stm32f4xx_conf.h、main.h拷贝到 /init/inc 目录下
stm32f4xx_it.h 拷贝到 /driver/inc 目录下
stm32f4xx_it.c 拷贝到 /driver/src 目录下
main.c 拷贝到 /init/src 目录下

6 移植 driver
这里我们要用到之前下载的对应设备的标准固件库了,打开固件库 \STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Libraries\STM32F4xx_StdPeriph_Drive\将里面的文件拷贝到之前建立的工程目录下的 driver 文件夹下。
:STM32F4xx_StdPeriph_Driver 放的是 STM32F4 标准外设固件库源码文件和对应的头文件。inc 目录存放的是 stm32f4xx_ppp.h 头文件,无需改动。 src 目录下面放的是 stm32f4xx_ppp.c 格式的固件库源码文件。每一个.c 文件和一个相应的.h 文件对应。这里的文件也是固件库外设的关键文件,每个外设对应一组文件。

7 完善 keil 工程,导入代码
如下图所示,右击 Target1,选中 Manage Project Items,便可管理我们的工程目录及导入文件了。

下图所示,是我这边的工程文件目录安排情况,driver 部分暂时没有导入代码,后面需要用哪个外设时,再导入对应文件即可。

8 设置头文件存放路径
如下图所示,选择头文件路径,这样编写代码引用对应头文件就不会报错了


9 添加宏定义
如下图所示,在 stm32f4xx.h 文件中要求我们定义使用的设备,否则的话,会在编译时抛出一个错误。

为了解决上面的问题,我们需要在工程中定义个宏定义,操作如下图所示:


10 编译所建工程
至此,如下图所示,写个main函数,不执行任何操作,可编译通过了。剩下的就是在此工程的基础上搭建我们的功能和应用了


参考资料:
https://download.csdn.net/download/tuwenzan/10477536 STM32F4开发指南-库函数版本_V1.1
  • 2
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Version: 2.15.0 (2020-09-28) Keil.STM32F4xx_DFP.2.15.0.pack Download Updated Pack to STM32Cube_FW_F4 Firmware Package version V1.25.1 using HAL Drivers V1.7.9. STM32CubeMX integration (Version 6.0.1): Added support for Timebase Source TIMx (FrameworkCubeMX_gpdsc.ftl). Removed non-existent include path. CMSIS Flash Algorithm: Corrected STM32F42xxx_43xxx_OPT Algorithm. CMSIS SVD: Updated STM32F42*.svd, STM32F43*.svd files. CMSIS-Driver: I2C: Corrected 2 byte reception in master mode. MCI: Replaced empty delay loops with _NOP(). SPI: Corrected PowerControl function (to return error if Initialize was not called, to abort active transfer if power off was requested). Updated GetDataCount function to give accurate count in DMA mode. Corrected Control function (abort in DMA mode, software controlled slave select in slave mode, TI Frame Format selection, ignore bus speed for slave mode). Corrected Uninitialize function (to power off the peripheral if it is powered). Corrected SPI3_SCK pin configuration. Corrected DMA MemDataAlignment configuration. USART: Corrected DMA MemDataAlignment configuration. USBD_HS/USBH_HS: OTG_HS ULPI clock disabled in low power if internal PHY is used to enable proper operation of OTG_HS port in FS mode during CPU sleep. CAN/EMAC/USBD/USBH: Removed macros already provided by cmsis_compiler.h. Updated Boards Examples: Migrated CubeMX projects to V6.0.1 and updated config files. Changed variant selection to "MDK-Plus" where possible. Updated all USB Host/Device examples with user templates from MDK-Middleware v7.11.1. Terminating app_main thread with osThreadExit() to avoid endless loop Updated MS Windows UBS driver files.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值