1. 创建目录
先创建项目根目录, 比如我的项目名称为Test01, 然后在其中创建如下子目录 OBJ, HALLIB, CORE, USER, 结构如下:
TEST01
├─CORE
├─HALLIB
├─OBJ
└─USER
2. 新建空工程
打开Keil, 我所使用的版本是V5.25.2.0
Project -> New uVision Project 在弹出的对话框选中 TEST01/USER 路径
下一步会让选配MCU型号, 我这里用到的是STM32L475VE
之后会在USER自动生成项目文件
TEST01
├─CORE
├─HALLIB
├─OBJ
└─USER
├─DebugConfig 调试配置文件
├─Listings 中间文件
├─Objects 中间文件
├─test01.uvoptx
└─test01.uvprojx 工程文件, 非常关键, 不能删除
3. 从STM32CubeL4包中复制文件到项目中
STM32CubeL4包版本使用的是 STM32Cube_FW_L4_V1.13.0 版本
复制内容列表
From:
STM32Cube_FW_L4_V1.13.0\Drivers\STM32L4xx_HAL_Driver
To:
Test01\HALLIB
复制完成后, 在STM32L4xx_HAL_Driver目录下只保留Inc, Src, 其他全删掉
From:
STM32Cube_FW_L4_V1.13.0\Drivers\CMSIS\Device\ST\STM32L4xx\Source\Templates\arm\startup_stm32l475xx.s
To:
Test01\CORE
From:
STM32Cube_FW_L4_V1.13.0\Drivers\CMSIS\Include
这个目录下复制如下5个文件
cmsis_armcc.h
core_cm4.h
core_cmFunc.h
core_cmInstr.h
core_cmSimd.h
To:
Test01\CORE
From:
STM32Cube_FW_L4_V1.13.0\Drivers\CMSIS\Device\ST\STM32L4xx\Include
这个目录下赋值如下3个文件
stm32l4xx.h
stm32l475xx.h
system_stm32l4xx.h
To:
Test01\USER
From:
将如下两个目录中所有文件复制过去
STM32Cube_FW_L4_V1.13.0\Projects\B-L475E-IOT01A\Templates\Inc
STM32Cube_FW_L4_V1.13.0\Projects\B-L475E-IOT01A\Templates\Src
所有文件如下
main.c
stm32l4xx_hal_msp.c
stm32l4xx_it.c
system_stm32l4xx.c
main.h
stm32l4xx_hal_conf.h
stm32l4xx_it.h
To:
Test01\USER
这一步复制正点原子自定义的SYSTEM文件夹, 其中内容也可以自己实现, 包括时钟初始化, 串口,和延时函数
From:
开发板资料\【正点原子】潘多拉IoT开发板资料\4,程序源码\1,裸机例程 - HAL库版本\实验0-1 Template工程模板-新建工程章节使用\SYSTEM
To:
Test01\SYSTEM
4. 将复制来的文件添加到Keil工程中
在工程名(Target1)上右键-> Manage Project Items...
- 在
Project Targets一栏中修改工程名为Test01 - 在
Groups一栏删掉默认的Source Group 1, 新增CORE,SYSTEM,HALLIB,USER - 选择
HALLIB, 添加HALLIB\STM32L4xx_HAL_Driver\Src目录下所有文件 - 选择
CORE, 添加CORE目录下所有文件(选择 All Files) - 选择
USER, 添加所有的USER/*.c文件 - 选择
SYSTEM, 添加所有的SYSTEM/*.c文件
5. 设置头文件存放路径
菜单栏Projects => Options For Target 'Test01'...
在弹出的对话框选择C/C++选项, 定位到下方的Include Paths, 然后添加如下路径:
..\CORE
..\USER
..\SYSTEM\delay
..\SYSTEM\sys
..\SYSTEM\usart
..\HALLIB\STM32L4xx_HAL_Driver\Inc
6. 添加全局宏定义标识符
依旧是菜单栏Projects => Options For Target 'Test01'...
在弹出的对话框选择C/C++选项, 在Processor Symbols一栏中, 定位到Define输入框
输入: USE_HAL_DRIVER,STM32L475xx 注意逗号
7. 选择编译中间文件存放目录
依旧是菜单栏Projects => Options For Target 'Test01'...
在弹出的菜单栏选择Output选项卡, 点击Select Folder For Objects...按钮, 在弹出的窗口中选择路径 Test01\OBJ
然后在Output选项卡勾选Create HEX File选项, 用于生成可烧录的hex二进制文件
然后取消勾选Browse Information选项, 如果勾选了会导致编译时间过长
8. 编辑main.c文件
在main.h中删除#include "stm32l475e_iot01.h"这一行, 否则会报错
移除HALLIB/stm32l4xx_hal_msp_template.c文件, 这里会出现重复定义报错
移除HALLIB/stm32l4xx_hal_timebase_tim_template.c 文件, 这个文件会导致延时函数不可用
使用如下代码执行编译
c
#include "sys.h"
#include "delay.h"
#include "usart.h"
void Delay(__IO uint32_t nCount);
void Delay(__IO uint32_t nCount)
{
while(nCount--){};
}
int main(void){
GPIO_InitTypeDef GPIO_InitStruct;
HAL_Init(); //初始化 HAL 库
SystemClock_Config(); //初始化系统时钟为 80M
__HAL_RCC_GPIOE_CLK_ENABLE(); //开启 GPIOE 时钟
GPIO_InitStruct.Pin = GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_InitStruct.Pull = GPIO_PULLUP; //上拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; //高速
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
while(1)
{
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_SET); //PE7 置 1
Delay(0x7FFFFF);
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_RESET); //PE7 置 0
Delay(0x7FFFFF);
}
}
9. 烧录hex文件
编译后在OBJ目录下会生成test01.hex文件
菜单栏Projects => Options For Target 'Test01'...
在 Debug选项卡, 在下面Use选项栏选择ST-Link Debugger
在下方勾选Run to main(), 只要电击仿真就会直接运行到main函数, 否则会先执行startup_stm32l475xx.s文件中的Reset_Handler函数, 之后再跳到main函数
然后电机Settings设置ST LINK参数:
Port选择SW
Clock栏下Req填写4MHz
然后返回菜单栏Projects => Options For Target 'Test01'...
在Utilities选项卡下勾选 Use Debug Driver
然后电击面板中的Settings
勾选Reset and Run
完成以上设置后, 电击Download按钮, 或者按F8, 即可实现烧录