使用 keil 创建 stm32 项目

Posted on Apr 6, 2023
tl;dr: 使用 keil 创建一个 stm32 项目,并编译、烧录、调试。

1 前言

搭建 stm32 开发环境,并创建第一个项目,进行编译、烧录、调试、拟真操作。

2 准备工作

0. 设备

stm32f103RCt6 开发板一块,ST-LINK V2 一个。

1. MDK-ARM下载

我下载的是:MDK-538A。

2. stm32 支持包下载

我的开发板处理器是 stm32f103RCT6,我下载了 Keil.STM32F1xx_DFP.2.4.0.pack

想要在国内如何快速下载 keil 的 pack 文件包,可以先在 keil 的 pack 官网查找自己想要的 pack,然后添加到 http://keilpack.azureedge.net/pack/ 末尾,如:http://keilpack.azureedge.net/pack/ARM.V2M_MPS3_SSE_300_BSP.1.1.0.pack

3. 手册下载

意法半导体官网下载芯片对应的手册:

  1. 参考手册
  2. 数据手册
  3. 编程手册
  4. 产品原理图

可在意法半导体官网或者 STMCU 中文官网 搜索下载。

4. 下载标准库

我的开发板处理器是 stm32f103RCT6,我下载了 STM32F10x_StdPeriph_Lib_v3.6.0

步骤如下:

3 搭建工程环境框架

3.1 项目结构

项目目录 demo 下新建目录:apps、doc、drivers、libs、project。

从标准库 \STM32F10x_StdPeriph_Lib_V3.6.0\Project\STM32F10x_StdPeriph_Examples\GPIO\IOToggle 中复制文件到 apps 目录下。

从标准库 \STM32F10x_StdPeriph_Lib_V3.6.0\Libraries 下复制目录 CMSISSTM32F10x_StdPeriph_Driver 到 libs 目录下。

程序的执行是从“main.c”文件开始的,其中必须包含有头文件“stm32f10x.h”。

“stm32f10x_conf.h"文件相当于一个开关文件,如果要用到STM32固件库驱动标准外设,则外设驱动头文件是必不可少的,如“stm32f10x_gpio.h”。

demo/
|-- apps/
|   |-- stm32f1xx_conf.h
|   |-- stm32f1xx_it.c
|   |-- stm32f1xx_it.h
|   |-- main.c
|-- doc/
|   |-- README.md
|-- drivers/
|   |-- incl/
|   |-- src/
|-- libs/
|   |-- CMSIS/
|   |-- STM32F10x_StdPeriph_Driver/
|-- porject/
  • apps,用来存放应用层文件。
  • doc,用来存放文档。
    • README.md,项目文档。
  • drivers,用来存放片外外设驱动程序。
    • src/incl,外设驱动程序的头文件和源码。
  • libs,用来存放标准外设库移植过来的文件。
    • CMSIS,Cortex™ 微控制器软件接口标准。
    • STM32F10x_StdPeriph_Driver
  • project,用来存放我们开发环境所生成的文件(可执行文件等,新建的工程也保存在此目录下)。

3.2 创建新工程

keil 中:

  • Project -> New uVision Project。
  • 定位到 demo/project 目录,在此存放工程文件 demo。
  • 选择处理器型号:STM32F103RC,点击 ok。

3.3 管理工程

添加文件到各组。

启动文件的选择

3.4 头文件路径配置

头文件只需要设置路径即可,无需添加到各组。

3.5 定义宏

STM32F10X_HD 表示大容量芯片,要根据不同型号进行不同配置。

USE_STDPERIPH_DRIVER 表示要使用标准库,不定义则表示不使用。

3.6 配置输出

如果使用 JLINK/STLINK 烧录,则必须使用bin文件,而不能使用hex文件。bin 文件需要 keil 自带的 fromelf.exe 工具来生成。方法是输入命令:D:\Keil_v5\ARM\ARMCC\bin\fromelf.exe --bin Objects\Template.axf -o Objects\Template.bin

4 烧录

4.1 ISP

ISP(在系统编程)是通过ST在芯片生产线上写入内嵌的自举程序到芯片系统存储器中,启动时从系统存储器中运行这个自举程序,它通过USART1串口来将我们的程序写入闪存存储器中。

注意下载时要将开发板上的boot开关打到ISP模式,ISP模式下载完成后可以立即执行程序。而如果要单独启动程序,则必须将boot开关打到RUN运行模式。

连接 ST-LINk 和 开发板:GND、SWCLK、SWDIO、VCC。

boot 开关打到 RUN 模式。

在 Debug 选项卡中,选择“ST-Link Debugger”。在选择完调试器之后,点击右边的 Setting 按钮,

默认情况选择的是 JTAG 调试方式,速度是 1.12Mhz。JTAG 模式和 SWD 模式使用方法都是一样的,不同的是,SWD 接口调试更加节省端口。为了节省更多的资源,用 SWD 模式仿真。

5 踩坑

5.1 Keil打开工程时,解决“Loading PDSC Debug Description Failed”错误

keil 版本和固件库版本不一致导致,下载符合 keil 版本的固件库即可。

5.2 Keil5遇到:*** Target ‘xxx‘ uses ARM-Compiler ‘Default Compiler Version 5‘ which is not available.

原因是 armcc5 编译器在Keil 5.37以后就不再默认安装了,从这个版本开始,Keil 默认安装的是 armclang 6。

在 Target一栏选择:Version 6 (或6.18)的编译器,点击Ok退出。重新编译就可以了。

5.3 最新版KEIL error: non-ASM statement in naked function is not supported或者 ‘__STATIC_INLINE‘

原因是最新的KEIL5版本使用的默认的 armclang6 的编译器,而固件库还是支持 armcc5 的编译器。

最好的方法是改用 HAL 库,放弃使用不再被维护的标准固件库。

如果一定要使用标准库,可以去 arm 官网下载 armcc 编译器,最新版本 5.06。

keil 安装目录下 arm 目录下新建 armcc 目录。

配置项目,添加 armcc 编译器。

参考


留言或评论请使用 Github Issues