Windows下使用Keil MDK5进行 STM32F407ZGT6, 配合ST-LINK工具进行烧录, 使用硬件抽象库HAL.

xingyun86 2022-7-11 649

Keil5创建工程(STM32F407):https://blog.csdn.net/qq_36955622/article/details/118549620

基于抽象外设库HAL的STM32F401开发:https://blog.csdn.net/michaelchain/article/details/120300555


Windows下使用Keil MDK5进行 STM32F407ZGT6, 配合ST-LINK工具进行烧录, 使用硬件抽象库HAL.

STM32F4 硬件抽象库 STM32F4xx_HAL_Driver

直接下载 STM32CubeF4 MCU 固件开发包

  1. 前往 
  2. https://www.st.com/zh/embedded-software/stm32cubef4.html
  3. 或者
  4. https://github.com/STMicroelectronics/STM32CubeF4
  5. 点击Code -> Download ZIP
  6. 文件比较大, 有接近700M, 解压备用

ST硬件抽象库HAL结构说明

STM32CubeF4\Drivers 目录结构



概述

Windows下使用Keil MDK5进行 STM32F407VET6 的开发和编译, 配合ST-LINK工具进行烧录, 使用标准外设库SPL.

STM32F407硬件环境

主要参数

  • STM32F407VET6 Arm Cortex-M4
  • 168MHz Max Clock Speed
  • 512k flash
  • 192k ram
  • LQFP 100 pins
  • Backup SRAM 4k

STM32F407ZGT6 Black Board 开发板

具体说明可以查看 https://stm32-base.org/boards/STM32F407ZGT6-STM32F4XX-Pro

ST-Link 编程器

使用普通的4线 ST-Link V2, 也可以使用增加了串口的V2.1

ST-Link 与 stm32核心板的连接需要4根线, 连接关系为

G   -- GND
CLK -- SWCLK
IO  -- SWDIO
V3  -- 3.3V

烧录时, 如果开发板已经外接了电源, 那么st-link的3.3V不要接到开发板.

外观

STM32F4XX Pro: Top view

连接ST-Link


USB2TTL 转接卡

在观察串口输出时需要使用.

STM32F4 官方标准外设库 Standard Peripheral Libraries

创建目录并填充文件

以下以名称为test001的项目为例

    1.创建工作目录 test001

    2.在工作目录下创建 Drivers, User 2个目录

    3.从解压后的标准外设库中, 复制 Drivers\CMSIS 目录到 Drivers, CMSIS 这个目录下只需要保留 Device 和 Include 这两个目录, 其他目录不需要

    4.复制 Drivers\STM32F4xx_HAL_Driver 整个目录到 Drivers

    5.User

        a,复制 Projects\STM32F401-Discovery\Templates\Src 下面的 stm32f4xx_hal_msp.c stm32f4xx_it.c 到这个目录

        b.复制 Projects\STM32F401-Discovery\Templates\Inc 下面的 stm32f4xx_hal_conf.h stm32f4xx_it.h 到这个目录

        c.添加用户代码

按步骤手工创建项目

先组织好库文件和目录, 然后创建项目

创建目录并填充文件


在Keil uVision5中创建项目

  1. 1.Project -> New uVision Project, 选择工作目录 test001, 使用名称test001, 保存
  2. 2.在弹出的对话框中, 选择芯片型号, 选择芯片型号STM32F407VE
  3. 3.在后续的 Manage Run-Time Enviroment 对话框中什么都不选, 因为会在项目里自己管理库文件

配置项目

在上面的步骤完成后, Keil MDK中就会显示一个项目的初始结构, 目录为 Project:test001, 以及一个 Target1

修改 Target 名称以及添加源文件

在菜单中点击 Project -> Manage -> Project Items, 或者直接在图标栏中点击红黄绿品字形的图标, 在弹出的对话框中

  1. 1.修改 project targets 名称为 test001, 这个可以随便改
  2. 2.编辑并添加 Groups, 最终会有以下 Groups
    • CMSIS
    • StdPeriph_Driver
    • Startup
    • User

对每个group, 添加的文件为

  • CMSIS
    • 添加 Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c
  • StdPeriph_Driver
    • HAL:添加 Drivers\STM32F4xx_HAL_Driver\src 下面的所有C文件, 除了以 _template.c 结尾的那几个
    • SPL:添加 Drivers\STM32F4xx_StdPeriph_Driver\src 下面的所有c文件, 除了 stm32f4xx_fmc.c 和 stm32f4xx_fsmc.c
  • Startup
  •          Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm\startup_stm32f40_41xxx.s 文件
  • User
    • 添加 User 目录下的所有C文件

修改项目包含路径

在菜单中点击Project -> Options for Target 'test001', 或者直接在图标栏中点击configure target option图标, 在弹出的对话框中

  1. 1.定位到c/c++标签页
  2. 2.Define: 这个是编译参数, 
  3. HAL:写入 USE_HAL_DRIVER,STM32F40_41xxx
  4. SPL:写入 USE_STDPERIPH_DRIVER,STM32F40_41xxx
  5. 3.Include Paths: 这里是头文件的包含路径, 如果按上面的目录结构组织的项目, 可以直接复制下面的配置
.\Drivers\CMSIS\Include;.\Drivers\CMSIS\Device\ST\STM32F4xx\Include;.\Drivers\STM32F4xx_StdPeriph_Driver\inc;.\User

在下面的 compiler control string 中可以查看完整的命令行

--c99 --gnu -c --cpu Cortex-M4.fp -g -O0 --apcs=interwork --split_sections -I ../libraries/CMSIS/Include -I ../libraries/CMSIS/Device/ST/STM32F4xx/Include -I ../libraries/STM32F4xx_StdPeriph_Driver/inc -I ../user
-I./RTE/_stm32f407test01
-IC:/Keil_v5/ARM/PACK/Keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include
-IC:/Keil_v5/ARM/CMSIS/Include
-D__UVISION_VERSION="525" -DSTM32F407xx -DUSE_STDPERIPH_DRIVER -DSTM32F40_41xxx
-o .\Objects\*.o --omf_browse .\Objects\*.crf --depend .\Objects\*.d

STM32F407 Black Board 示例代码

下面的例子, 使用开发板自带的led灯(A6, A7)实现交替亮灭的效果.
在User目录下创建 main.h 和 main.c, 注意通过Keil MDK创建的时候, 要注意文件位置, 默认是放到项目根目录的, 这里要改到User目录下.

main.c

#include "main.h"
#define GPIO_LED      GPIOA
#define GPIO_PIN_LED0 GPIO_Pin_6
#define GPIO_PIN_LED1 GPIO_Pin_7
static u8  fac_us=0;//us延时倍乘数			   
static u16 fac_ms=0;//ms延时倍乘数,在ucos下,代表每个节拍的ms数
void delay_init(u8 SYSCLK)
{
  SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
	fac_us=SYSCLK/8;		//不论是否使用ucos,fac_us都需要使用
	fac_ms=(u16)fac_us*1000;//非ucos下,代表每个ms需要的systick时钟数   
}		
void delay_us(u32 nus)
{		
	u32 temp;	    	 
	SysTick->LOAD=nus*fac_us; //时间加载	  		 
	SysTick->VAL=0x00;        //清空计数器
	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //开始倒数 
	do
	{
		temp=SysTick->CTRL;
	}
	while((temp&0x01)&&!(temp&(1<<16)));//等待时间到达   
	SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器
	SysTick->VAL =0X00;       //清空计数器	 
}
//延时nms
//注意nms的范围
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对168M条件下,nms<=798ms 
void delay_xms(u16 nms)
{	 		  	  
	u32 temp;		   
	SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
	SysTick->VAL =0x00;           //清空计数器
	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //开始倒数  
	do
	{
		temp=SysTick->CTRL;
	}
	while((temp&0x01)&&!(temp&(1<<16)));//等待时间到达   
	SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器
	SysTick->VAL =0X00;       //清空计数器	  	    
} 
//延时nms 
//nms:0~65535
void delay_ms(u16 nms)
{	 	 
	u8 repeat=nms/540;	//这里用540,是考虑到某些客户可能超频使用,
						//比如超频到248M的时候,delay_xms最大只能延时541ms左右了
	u16 remain=nms%540;
	while(repeat)
	{
		delay_xms(540);
		repeat--;
	}
	if(remain)delay_xms(remain);
	
} 
void LED_Init(void)
{    	 
  GPIO_InitTypeDef  GPIO_InitStructure;
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟
  //GPIOF9,F10初始化设置
  GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED0 | GPIO_PIN_LED1;//LED0和LED1对应IO口
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIO_LED, &GPIO_InitStructure);//初始化GPIO
	
  GPIO_SetBits(GPIO_LED,GPIO_PIN_LED0 | GPIO_PIN_LED1);//设置高,灯灭
}
int main(void)
{
  delay_init(168);		  //初始化延时函数
  LED_Init();		        //初始化LED端口
	
  /**下面是通过直接操作库函数的方式实现IO控制**/
	while(1)
	{
    GPIO_ResetBits(GPIO_LED,GPIO_PIN_LED0);
    GPIO_SetBits(GPIO_LED,GPIO_PIN_LED1);
    delay_ms(500);
    GPIO_SetBits(GPIO_LED,GPIO_PIN_LED0);
    GPIO_ResetBits(GPIO_LED,GPIO_PIN_LED1);
    delay_ms(500);
	}
}

main.h

#ifndef __MAIN_H
#define __MAIN_H
#include "stm32f4xx.h"
#endif /* __MAIN_H */

编译

按F7执行编译

烧录

在菜单中点击Project -> Options for Target 'test001', 或者直接在图标栏中点击configure target option图标, 在弹出的对话框中

    1.定位到 Debug 标签页

    2.Use 选择 ST-Link Debuger, 点击Settings

    3.如果 Debug Adapter 里是空白没有显示ST-LINK/V2, 去windows设备管理器看下设备是否正常

    4.切换到 Flash Download 标签, 勾选Reset and Run

    5.点击 Download 按钮, 或者按F8, 进行烧录

其他

  • 如果不能从丝印判断自己开发板芯片的型号, 可以用STM32 ST-LINK Utility连上查看
  • 开发包中的例子. 在官方库的压缩包里, 包含着这个版本各个外设功能的代码例子, 可以直接参考.


×
打赏作者
最新回复 (0)
只看楼主
全部楼主
返回