Keil MDK STM32系列(三) 基于标准外设库SPL的STM32F407开发

发布者:mlgb999最新更新时间:2022-08-15 来源: csdn关键字:Keil  MDK  STM32系列  标准外设库  SPL 手机看文章 扫描二维码
随时随地手机看文章

概述

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

STM32F407VET6 Black Board 开发板

具体说明可以查看 https://stm32-base.org/boards/STM32F407VET6-STM32-F4VE-V2.0.html


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不要接到开发板.


外观

连接ST-Link

USB2TTL 转接卡

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


STM32F4 官方标准外设库 Standard Peripheral Libraries

参考STM32F401的说明, 与STM32F401相同


按步骤手工创建项目

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


创建目录并填充文件

参考STM32F401的说明, 与STM32F401相同, 完成后的目录结构是这样的


test001>

├─Drivers

│  ├─CMSIS

│  │  ├─Device

│  │  │  └─ST

│  │  │      └─STM32F4xx

│  │  │          ├─Include

│  │  │          └─Source

│  │  └─Include

│  └─STM32F4xx_StdPeriph_Driver

│      ├─inc

│      └─src

└─User

在Keil uVision5中创建项目

Project -> New uVision Project, 选择工作目录 test001, 使用名称test001, 保存

在弹出的对话框中, 选择芯片型号, 选择芯片型号STM32F407VE

在后续的 Manage Run-Time Enviroment 对话框中什么都不选, 因为会在项目里自己管理库文件

配置项目

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


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

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


修改 project targets 名称为 test001, 这个可以随便改

编辑并添加 Groups, 最终会有以下 Groups

CMSIS

StdPeriph_Driver

Startup

User

对每个group, 添加的文件为


CMSIS

添加 DriversCMSISDeviceSTSTM32F4xxSourceTemplatessystem_stm32f4xx.c

StdPeriph_Driver

添加 DriversSTM32F4xx_StdPeriph_Driversrc 下面的所有c文件, 除了 stm32f4xx_fmc.c 和 stm32f4xx_fsmc.c

Startup

注意, 这里是与F401不同的:添加 DriversCMSISDeviceSTSTM32F4xxSourceTemplatesarmstartup_stm32f40_41xxx.s 文件

User

添加 user 目录下的所有C文件

修改项目包含路径

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


定位到c/c++标签页

Define: 这个是编译参数, 注意这里也与F401不同, 写入 USE_STDPERIPH_DRIVER,STM32F40_41xxx

Include Paths: 这里是头文件的包含路径, 如果按上面的目录结构组织的项目, 可以直接复制下面的配置

.DriversCMSISInclude;.DriversCMSISDeviceSTSTM32F4xxInclude;.DriversSTM32F4xx_StdPeriph_Driverinc;.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 */


关键字:Keil  MDK  STM32系列  标准外设库  SPL 引用地址:Keil MDK STM32系列(三) 基于标准外设库SPL的STM32F407开发

上一篇:Keil MDK STM32系列(十) Ubuntu下的PlatformIO开发环境
下一篇:Keil MDK STM32系列(四) 基于抽象外设库HAL的STM32F401开发

推荐阅读最新更新时间:2024-10-29 05:50

keil利用Breakpoints追踪内存值异常修改分析说明
在开发过程中,经常会遇到内存值被异常篡改的情况。而且,篡改者往往并不是你当前所正在进行调试的部分(即内存异常篡改其实早就存在,只不过现在才凸显出来),这样问题很难跟踪,故利用keil的这一特性,追踪问题。 以下项目举例说明 1. 用电设备,A相电压偏差极值显示63.25%,而此时额定电压为220v,A相单相上电,偏差值不应有这么大偏差值计算公式为: ΔU = ((U - Un) / Un) * 100%; 式中:△U--电压偏差百分比;U一实际电压:Un电网标称电压。 2. 观察ac_data_memory中相应数据显示确实为这么大,考虑数据调试过程中异常,故对到下一日,对时后,数据变为0,1分钟后变为
[单片机]
<font color='red'>keil</font>利用Breakpoints追踪内存值异常修改分析说明
STM32系列微控制器标准外设简单介绍
ST为了普及旗下产品,发布包括标准外设库在内的众多支持软件,有效降低开发门槛。作者使用ST的标准外设库大概两年时间,在这里介绍何为外设库: 外设库,是支持片上外设的函数,数据结构和宏的集合。外设库的精髓在于初始化结构体和初始化函数的配合使用,把外设的各类工作参数赋予初始化结构体,然后调用初始化函数将这些参数写入外设寄存器,完成外设的初始化。 外设库提供大量的状态获取,中断控制等函数,它们进行必要的检查之后,再操作外设,安全高效。 在开发过程中,程序员会频繁地从某个外设接收数据或者向某个外设发送数据,介于此外设库把这些函数全部封装完毕,格式统一,便于使用。 针对初学者,以下几个地方易错: 启动文件和外设头文件里面的MC
[单片机]
Keil c51 U3字符显示错位问题的解决办法
相信很多人遇到多光标处显示的字符并不是正确的字符,可一直没有办法解决。 其实很简单,在Keil c目录下TOOLS.INI文件中第三行增加一条语句:ANSI=1就可以了。 看看我的这个配置文件内容: ORGANIZATION= HEYONG NAME= USER , wym ANSI=1(就加这一句) EMAIL= 498729914@qq.com BOOK0=UV3\RELEASE_NOTES.HTM( uVision Release Notes ,GEN) ARMSEL=1 PATH= c:\Keil\C51\ BOOK0=HLP\Release_Notes.htm( Release Notes ,GEN) BOOK1=
[单片机]
STM32入门系列-存储器与寄存器介绍
介绍两部分内容: 什么是存储器映射 什么是寄存器及寄存器映射 为了让大家对存储器与寄存器有一个更清楚的认识,并且为之后使用 C 语言来访问 STM32 寄存器内容打下基础。等明白了如何使用 C 语言封装底层寄存器,也就为后面学习库函数的开发做好了铺垫。 什么是存储器映射 程序存储器、数据存储器、寄存器和I/O端口排列在同一顺序的4GB地址空间内。这就是我们曾提到过的被控总线的连接部分,而编程时就是操作这一块地方。存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程称为存储器映射,如果再分配一个地址就叫重映射。 STM32F103ZET6 数据手册中存储器映射图如下所示。 从上图中可以看到
[单片机]
详解基于STM32KEIL4 MDK软件仿真输出IO口的波形图
这是一个STM32的PA6和PA7口输出PWM波形的仿真步骤,其它情况类似 每一步我都做了截图,大家照着一步步来,有些参数根据自己的情况稍微改下就好,肯定可以出波形的!请大家放心参考
[单片机]
STM32系列里RTC的亚秒特性及功能(上)
绝大多数STM32系列里的RTC都具有亚秒【或称子秒】计数单元。为了了解亚秒特性及功能,不妨先看RTC的功能框图。本文中的有关截图若无特别说明均来自STM32L4系列参考手册。 RTC的时钟源【RTCCLK】可以是LSE、LSI或者HSE/32,由RTCCLK最终变成日历的秒脉冲驱动信号经过了2次分频。先经过上图中A处的异步分频单元,默认分频系数是128,形成ck_apre时钟,默认情况下该时钟频率为256Hz;然后该时钟脉冲来到图中B处的同步分频单元,默认分频系数为256,最终形成1Hz的秒脉冲【ck_spre】到日历单元。关于两分频单元分频系数的配置,通过对RTC_PRER寄存器的相关位编程实现。 其中异步分频系数配
[单片机]
<font color='red'>STM32</font><font color='red'>系列</font>里RTC的亚秒特性及功能(上)
如何转换Keil工程为ECloudIDE工程
3.1 转换插件使用方法 由于市面上绝大部分STM32教程是基于Keil软件教学,而ECloudIDE是基于GCC编译器( gcc-arm -none-eabi),两者在工程管理上存在一些差异,无法直接使用,我们团队提供了一个转换插件用与将Keil工程转换成ECloudIDE工程。 目前该插件只支持Keil5软件和STM32F10x系列芯片,其他芯片还在抓紧测试验证中...,这里一 实验3 按键实验 为例演示如何转换Keil工程为ECloudIDE工程 第一步:复制 keil2platformio 插件到工程目录下 第二步: 运行 插件 进入到实验代码路径中,运行 keil2platformio/keil2platformio.p
[单片机]
如何转换<font color='red'>Keil</font>工程为ECloudIDE工程
技巧 3 -- Keil C51 中 P1.0、P1^0、P1_0 的区别
以 Keil uVision2 为例,在安装路径下的 \ C51 \ INC 文件夹中,打开 reg52.h 头文件,可以看到:   #ifndef __REG52_H__   #define __REG52_H__   /* BYTE Registers */   sfr P0 = 0x80;   sfr P1 = 0x90;   sfr P2 = 0xA0;   sfr P3 = 0xB0;   sfr PSW = 0xD0;   sfr ACC = 0xE0; 其中 sfr 关键字是 C51 特有的关键字,它用来定义变量和地址的对应关系。如 sfrP0 = 0x80,意思就是:P0 口的地址是 0x80。(0x
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved