历史上的今天
返回首页

历史上的今天

今天是:2025年07月28日(星期一)

正在发生

2021年07月28日 | 基于STM32标准库建立Keil-MDK工程模板(STM32F407ZG)

2021-07-28 来源:eefocus

一、前言

最近由于项目需要使用标准库,标准库是很刚入门stm32那会学习的东西,忘得一干二净,所以编写一篇文章来记录一下建立工程模板的步骤,以便尽快熟悉标准库的架构和API。


我使用的开发板是正点原子探索者开发板,MCU为STM32F407ZGT6。


官方网站)是ST在早期为STM32F0到F4系列主流芯片提供的库,使开发者不需要直接操作寄存器,而是调用库提供的API即可完成对某个片内外设的操作,所以也称为标准外设库,或者固件库。

本文中我使用的是 STM32F4xx_DSP_StdPeriph_Lib_V1.8.0,可以从官网下载(下载地址):

解压之后,标准外设库中每个文件夹的说明如图:

三、建立Keil-MDK模板工程

1. 创建文件夹

创建一个模板工程的文件夹,如图:

  • doc:存放文档

  • libraries:存放标准外设库

  • project:存放工程文件

  • user:存放用户文件

在project文件下新建MDK文件夹,方便支持不同的编译器:

2. 复制标准库

将标准库中的Libraires文件夹中的内容复制到刚刚建立的文件夹中:

3. 创建工程

打开Keil-MDK,在刚刚创建的 project/MDK 下建立一个新的工程,设计如下分组:

3.1. 添加启动文件

启动文件在标准库中的CMSISDeviceSTSTM32F4xxSourceTemplates目录下:

这里我们使用的是MDK,所以选择arm文件夹下的启动文件,如图:

在Startup分组中添加该启动文件:

3.2. 添加系统初始化文件

系统初始化文件在 CMSISDeviceSTSTM32F4xxSourceTemplates目录下:

在CMSIS分组中添加该文件:

3.3. 添加标准外设库文件

标准外设库所有文件都在STM32F4xx_StdPeriph_Driversrc目录中,全部添加到 STM32F4xx_StdPeriph_Driver 分组中:

STM32F407系列中没有FMC外设,要去掉该驱动文件:

3.4. 添加用户文件

① 中断处理程序文件stm32f4xx_it.c:

中断处理程序文件在标准外设库中的示例工程中,复制到自己创建的user文件夹下:

编辑stm32f4xx_it.c文件,去掉包含main.h的代码:

再去掉Systick中断中的内容:

② 标准外设库配置文件stm32f4xx_conf.h:

③ 新建一个 main.c 文件:

④ 将user下的.c都添加到User分组下面:

3.5. 添加头文件路径

3.6. 添加宏定义

添加两个宏定义:

  • USE_STDPERIPH_DRIVER:表示工程使用标准外设库;

  • STM32F40_41xxx:表示工程对应的MCU型号;

如图:

3.7. 编写main.c

/**********************************************************

 * @brief

 * @author  Mculover666

 * @date    

 * @note

**********************************************************/


#include "stm32f4xx.h"


int main()

{


    /* Main Loop */

    while (1) {

    

    }

}


3.8. 额外的设置

① 该标准外设库不支持armcc6编译器,所以设置为默认的armcc5编译器:

② 标准库提供的文件上都有一把小黄锁,原因是这些文件都是只读文件,在libraries文件夹上右击,修改所有文件的只读属性即可:

3.9. 编译测试

至此,工程创建完成,编译通过:

四、修改时钟树配置

本文中所使用的时钟初始化配置文件``是从标准外设库中复制过来的,从其注释中可以看出该配置使用的HSE为25Mhz,如图:

而本文所使用的正点原子探索者开发板所使用的外部晶振为8Mhz(这就离谱!):

为了保证主频为168Mhz,需要对该配置进行修改。

① 修改HSE宏定义的值为8000000,在stm32f4xx.h中,如图:

② 修改PLL分频系数为8:

至此,时钟树配置完成。

五、如何使用模板工程

这里我以LED闪烁为例,演示如何使用该模板工程。

1. 复制一份模板工程

2. 添加LED驱动

在user文件夹下新建led文件夹及文件,用于存放led驱动:

将 bsp_led.c 添加到工程中:

将 bsp_led.h添加到头文件路径:

3. 编写LED驱动

编写 bsp_led.h 文件:


#ifndef _BSP_LED_H_

#define _BSP_LED_H_


#include "stm32f4xx.h"


#define LED_PORT    GPIOF

#define LED_PIN     GPIO_Pin_9


typedef enum led_status_en {

    LED_OFF = 0,

    LED_ON  = 1

} led_state_t;


void led_init(void);

void led_control(led_state_t status);


#endif /* _BSP_LED_H_ */


编写 bsp_led.c 文件:


#include "bsp_led.h"


void led_init()

{

    GPIO_InitTypeDef GPIO_InitStructure;

    

    /* 1. Enable Clock */

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);

    

    /* 2. Config GPIO Structure*/

    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;

    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;

    GPIO_InitStructure.GPIO_Pin   = LED_PIN;

    GPIO_InitStructure.GPIO_Speed = GPIO_Low_Speed;

    GPIO_Init(LED_PORT, &GPIO_InitStructure);

}


void led_control(led_state_t status)

{

    if (status == LED_ON) {

        GPIO_ResetBits(LED_PORT, LED_PIN);

    } else {

        GPIO_SetBits(LED_PORT, LED_PIN);

    }

}


4. 编写业务逻辑

在main.c中编写LED闪烁的代码:


/**********************************************************

 * @brief   LED blink

 * @author  Mculover666

 * @date    2020/1/20

 * @note

**********************************************************/


#include "stm32f4xx.h"

#include "bsp_led.h"


void delay(__IO uint32_t n)

{

for(; n != 0; n--);

}


int main()

{

    /* Init LED */

    led_init();

    

    /* Main Loop */

    while (1) {

        led_control(LED_ON);

        delay(0xFFFFF);

        led_control(LED_OFF);

        delay(0xFFFFF);

    }

}


编译、下载,可以看到板载LED0闪烁。


推荐阅读

史海拾趣

力芯微(ETEK)公司的发展小趣事

在初创期,力芯微公司专注于DVD、音响、机顶盒及遥控器等传统电子市场的芯片研发及销售。公司凭借对市场的敏锐洞察,与步步高、TCL、Sony、飞利浦、富士康等知名品牌建立了稳固的合作关系。这些合作不仅为公司带来了稳定的收入,也为力芯微积累了与品牌客户合作的宝贵经验。

Denyo Europa Gmbh公司的发展小趣事

Denyo Europa Gmbh公司始终认为企业是社会的一部分,应该承担起相应的社会责任。公司积极参与各种公益活动,为当地社区的发展贡献力量;同时,公司还关注弱势群体的需求,为他们提供力所能及的帮助。这种对社会责任的担当精神,使公司在社会中树立了良好的企业形象。

Herley New York公司的发展小趣事

Denyo Europa Gmbh公司一直将产品质量视为企业的生命线。公司建立了严格的质量管理体系,从原材料采购到生产流程,再到产品检测,每一个环节都严格把关。公司还定期对员工进行质量意识培训,确保每一个员工都能深刻理解质量对于企业发展的重要性。这种对质量的执着追求,使公司的产品在市场上赢得了良好的口碑。

Habia Cable公司的发展小趣事

Denyo Europa Gmbh公司一直将产品质量视为企业的生命线。公司建立了严格的质量管理体系,从原材料采购到生产流程,再到产品检测,每一个环节都严格把关。公司还定期对员工进行质量意识培训,确保每一个员工都能深刻理解质量对于企业发展的重要性。这种对质量的执着追求,使公司的产品在市场上赢得了良好的口碑。

Excel Cell Electronic Co Ltd公司的发展小趣事

自1981年成立以来,ECE公司始终将技术创新作为发展的核心驱动力。早期,公司专注于电子元器件的研发和生产,通过引进国际先进技术,并结合本地市场需求进行创新,成功推出了一系列具有竞争力的产品。随着技术的不断进步,ECE公司不断加大研发投入,积极探索新的应用领域,逐渐成为电子行业的领军企业。

Hong Kong X'Tals Ltd公司的发展小趣事
选择合适的电阻和电容,以确保定时精度和电路稳定性。同时,注意元件的温漂和老化对定时时间的影响。

问答坊 | AI 解惑

基于嵌入式PLC芯片组的多路模拟量PLC的开发

摘要:本文介绍了一种新的PLC开发过程——嵌入式PLC的开发。嵌入式PLC以用户的应用为中心,软硬件可由用户根据工艺需要来裁剪,很好地满足了用户的个性化需求。 关键词:嵌入式PLC芯片组  系统软件  内核    如今工 ...…

查看全部问答>

电容放电电路仿真

我想做一个已经充好电的电容对串联的电阻和电感放电,在用ORCAD仿真时不加开关直接设置电容的IC值,出来的结果和实际不符,我感觉电流应该从零开始增大的,然后振荡。各位大侠帮我看看,到底应该怎么做,附件里给出了仿真电路图和输出结果图…

查看全部问答>

哪位好心人能提供一下winCE 6.0的源码?

rt,,网上都说100%开源了,可我下载不到,由于没有装PB,所以请好心人提供一份,非常感谢!…

查看全部问答>

isplever编译问题!

Error output EDIF file DP_CPLD_TOP.edi Error executing Synplicity VHDL/Verilog HDL Synthesizer 这个怎么解决啊,是我的VHDL语言有语法错误还是别的什么??急!!!!!…

查看全部问答>

                                 问题已解决…

查看全部问答>

能不能谈谈在MDK里面,将程序烧写到外扩norflash的流程?

例程中有个binary文件夹,里面的readme我看了的,意思是: 1.将STM3210E-EVAL_NOR.FLM文件拷贝到Keil\\ARM\\Flash文件夹下 2.Project->Options->Target窗口中,选择ROM1,开始地址输入0x64000000,大小范围输入0x1000000,然后勾选“Star ...…

查看全部问答>

请问Allegro PCB设计中连线如何画出45度角的线

请问Allegro PCB设计中连线如何画出45度角的线…

查看全部问答>

DSP外扩FLASH

DSP使用SD卡来外扩FLASH,怎么编写CMD文件?…

查看全部问答>

UCOS-II 是几位操作系统

本人新学UCOS-II,我想问下UCOS-II 到底是多少位的操作系统??…

查看全部问答>