历史上的今天
返回首页

历史上的今天

今天是:2026年01月12日(星期一)

正在发生

2023年01月12日 | STM32F4 新建标准库函数工程

2023-01-12 来源:zhihu

前言

在 STM32 开发中,库函数开发相比寄存器方式具有开发周期短、代码可读性好、便于移植等优点,而使用 Keil 环境的第一步就是新建工程。本文以 STM32F401CE 芯片为例,介绍使用标准库函数新建工程的步骤。

材料准备

  • STM32F4xx 固件库:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0.rar

  • Keil-MDK

  • 一点耐心

新建库函数工程注意事项

不同芯片在新建工程时的配置略有区别,主要体现在以下几点:

  1. 工程目标 Device 选择的芯片型号不同。

  2. 添加的启动文件不同。要根据芯片型号在 arm 目录下选择相应的 .s 文件。

  3. C/C++ 选项卡的芯片型号宏定义不同。具体有哪些选择可在 stm32f4xx.h 头文件中的条件编译指令中找到。不确定选哪个的话可以根据芯片主频从 system_stm32f4xx.c 文件的 PLL 分频参数反推宏定义(要求对时钟树比较熟)。

  4. 工程所包含的外设库函数不同。MDK 会在编译时根据芯片型号宏定义进行寄存器映射,所以要对芯片所没有的外设库文件要排除编译(如文中的 fmc 和 fsmc),否则会报标识符未定义错误。

补充:如何确定芯片有无某个外设?

芯片数据手册中描述了芯片的所有资源,当想要了解具体某一型号芯片的外设时,应该查阅数据手册而不是参考手册(参考手册针对的是整个系列芯片的通用说明)。

Cortex-M4 新建库函数工程步骤

一、新建工程文件夹

  1. 新建一个文件夹 template 用于存放工程模板。

  2. 在 template 文件夹内分别新建 Doc(存放文档)、User(存放用户文件)两个文件夹。

  3. 在 User 文件夹中新建 inc 和 src 两个文件夹分别存放用户头文件和源文件。

二、复制库函数文件

1. 复制 Libraries 文件夹

打开固件库目录 STM32F4xx_DSP_StdPeriph_Lib_V1.4.0, 复制 Libraries 文件夹到工程文件夹template 中。

2. 裁剪 Libraries 文件夹

由于固件库的 Libraries 文件夹是对整个 Cortex-M4 系列通用的,包含了一些项目所用不到的文件,为了节约空间,可以把用不到的多余文件删除。

  • 删除 templateLibrariesCMSIS 目录下除 Device 和 Include 外的所有文件夹。

  • 删除 templateLibrariesCMSISDeviceSTSTM32F4xxSourceTemplates 目录下除 arm 文件夹和 system_stm32f4xx.c 外的所有文件夹。

  • 删除 templateLibrariesCMSISDeviceSTSTM32F4xxSourceTemplatesarm 目录下除startup_stm32f401xx.s 外的其余启动文件。

  • 固件库里类似 Release_Notes.html 的说明文件也可以删了。

3. 添加文件到 User 文件夹

往 templateUser 目录中添加以下三个库文件,并新建 main.c 文件。

  • 打开 STM32F4xx_DSP_StdPeriph_Lib_V1.4.0ProjectSTM32F4xx_StdPeriph_Templates 目录,找到 stm32f4xx_conf.h、stm32f4xx_it.h、stm32f4xx_it.c 三个文件。

  • 复制 stm32f4xx_conf.h 文件到 templateUserinc 目录。

  • 复制 stm32f4xx_it.h 文件到 templateUserinc 目录。

  • 复制 stm32f4xx_it.c 文件到 templateUsersrc 目录。

  • 在 templateUsersrc 目录中新建 main.c 文件,并编写以下主函数代码保存。

其中 stm32f4xx_conf.h 文件包含了所有库函数头文件,stm32f4xx_it.c 文件用于编写中断服务函数,便于统一管理,使工程结构更加规范。

完成以上工作后整个工程目录结构如下图:

三、Keil 新建工程

把工程文件夹建好并复制相关库文件后,就可以打开 Keil 软件新建工程了。

1. 新建工程

打开 Keil 软件,点击 Project 菜单下的 New uVision Project 选项新建工程,并保存到新建的工程文件夹 template 中。

2. 选择芯片型号

在弹出的芯片选型窗口中选择目标板的芯片型号,这里选 STMicroelectronics(ST公司)下的 STM32F401CE(根据具体硬件选择)。

关掉弹出的组件添加窗口,因为我们采用的是手动添加库文件的方式。

3. 新建工程分组

点击「品字形」按钮打开工程管理界面,最左侧是工程名称,可以给工程改个名,然后在中间组管理中点虚框图标新建 CMSIS、STM32F4xx_StdPeriph_Driver、USER、DOC 四个分组,对应工程文件夹中的分类。

4. 添加文件到分组

依然是在工程管理界面下,这一步要做的事情是把准备好的库文件添加到 Keil 工程中,具体操作如下:

  • 往分组 CMSIS 中添加 system_stm32f4xx.c 系统配置文件和 startup_stm32f401xx.s 启动文件。

往分组 STM32F4xx_StdPeriph_Driver 中添加 LibrariesSTM32F4xx_StdPeriph_Driversrc目录下的所有 .c 文件。

往分组 USER 中添加文件 main.c 和 stm32f4xx_it.c。

四、工程配置

点击「魔术棒」按钮打开工程选项界面,进行必要的工程配置。

1. Target 选项卡配置

  • 勾选 Use Micro LIB 选项,为了在工程中使用 printf() 函数。

2. Output 选项卡配置

  • 如需生成 .hex 文件,则需勾选 Create HEX File 选项。

3. C/C++ 选项卡配置

  • 在「预处理符号」Preprocessor Symbols 下的 Define 一栏中添加 STM32F401xx 和USE_STDPERIPH_DRIVER 两个宏定义(用逗号分隔)。

  • 在 Include Paths 中添加以下头文件路径,注意要具体到头文件上一层目录。

  1. .LibrariesCMSISDeviceSTSTM32F4xxInclude

  2. .LibrariesCMSISInclude

  3. .LibrariesSTM32F4xx_StdPeriph_Driverinc

  4. .Userinc

五、下载器配置

依然是在工程选项界面下,进行下载器配置

Debug 选项卡配置

在右上角选择所使用的调试器,根据实际情况选择。这里我用的是 ST-Link,选 ST-Link Debugger。

点击 setting 按钮,在 Falsh Download 选项卡中勾选 Reset and Run 选项,确保程序下载后能自动复位运行,最后点击确定按钮保存所有的工程配置。

六、最后小整改

此时编译整个工程依然会有大量错误,为了能使工程顺利编译最后还要稍作修改,具体如下:

取消编译 fmc 和 fsmc 库文件

查阅数据手册得知 STM32F401 系列芯片没有 fmc 和 fsmc 外设,所以去掉 fmc 和 fsmc 部分的库文件。

在工程文件视图下展开 STM32F4xx_StdPeriph_Driver 分组,选中 stm32f4xx_fmc.c 文件,右键调出 Options for File stm32f4xx_fmc.c 窗口,取消勾选 Include in Target Build 选项,排除stm32f4xx_fmc.c 文件参与编译。stm32f4xx_fsmc.c 用文件同样方式处理(或者直接从工程中移除这两个文件)。

修改 stm32f4xx_it.c 文件

  1. 删除 stm32f4xx_it.c 文件 32 行的代码 #include “main.h”(因为没有写这个文件)。

  2. 删除 stm32f4xx_it.c 文件 144 行的代码 TimingDelay_Decrement();(滴答定时器延时相关,暂时用不到)。

七、编译工程、下载验证

最后点击编译按钮,如果工程配置正确就会看到令人愉悦的 0 Error(s), 0 Warning(s) ,通过下载器连接板子和电脑,烧写程序检验成果,见证令人激动的时刻吧!


推荐阅读

史海拾趣

Hirel Systems Ltd公司的发展小趣事

对于四通道红外遥控器接收器电路,网友可能提出的问题涉及多个方面,以下是一些可能的问题及回答:

一、技术原理类问题

  1. 问题:四通道红外遥控器接收器电路是如何工作的?
    回答:四通道红外遥控器接收器电路主要通过光电二极管接收遥控器发射的红外信号,经过放大、解码等处理,最终识别出不同的按键指令,并控制相应的设备执行操作。具体来说,当遥控器发射出特定频率的红外光信号时,光电二极管将光信号转换为电信号,经过放大电路放大后,送入解码器进行解码,解码器根据解码结果输出相应的控制信号,控制设备执行相应的操作。

  2. 问题:接收器电路中的关键元件有哪些?
    回答:接收器电路中的关键元件包括光电二极管(用于接收红外光信号)、放大器(用于放大微弱的电信号)、解码器(用于解码信号并输出控制信号)以及可能的滤波电路(用于滤除噪声干扰)等。这些元件共同协作,实现红外信号的接收和处理。

二、故障排查与维修类问题

  1. 问题:接收器无法接收到信号,可能的原因有哪些?
    回答:接收器无法接收到信号的可能原因包括:

    • 光电二极管损坏或老化,导致无法有效接收红外光信号。
    • 接收器电路中的连接线松动或接触不良,导致信号传输中断。
    • 放大器或解码器故障,无法对接收到的信号进行正常放大或解码。
    • 接收器受到外界干扰(如光线、电磁干扰等),影响信号的接收和处理。

    针对以上问题,可以逐一检查光电二极管、连接线、放大器、解码器等元件的状态,并采取相应的维修或更换措施。同时,注意避免将接收器放置在易受干扰的环境中。

  2. 问题:如何排查和解决接收器响应延迟或误动作的问题?
    回答:排查和解决接收器响应延迟或误动作的问题可以从以下几个方面入手:

    • 检查遥控器发射的红外信号是否正常,包括信号的频率、强度等是否符合接收器的要求。
    • 检查接收器电路中的滤波电路是否设置得当,以避免噪声干扰导致误动作。
    • 检查解码器的解码逻辑是否正确,以确保能够准确识别出遥控器发射的指令。
    • 如果以上均正常,可以考虑检查接收器的电源系统是否稳定,以及是否有其他电路元件故障导致的影响。

    针对具体问题,可以采取相应的调整或维修措施来解决。

三、应用与拓展类问题

  1. 问题:四通道红外遥控器接收器电路可以应用于哪些场景?
    回答:四通道红外遥控器接收器电路可以广泛应用于各种需要遥控控制的设备中,如智能家居系统(如电视、空调、灯光等的遥控控制)、工业自动化控制(如电机、阀门等的远程控制)、安防监控系统(如摄像头、报警器的遥控操作)等。通过扩展通道数量和增加控制逻辑,还可以实现更复杂的控制功能。

  2. 问题:如何对四通道红外遥控器接收器电路进行升级或改造?
    回答:对四通道红外遥控器接收器电路进行升级或改造时,可以考虑以下几个方面:

    • 升级光电二极管或放大器等关键元件的性能,以提高接收灵敏度和信号处理能力。
    • 增加滤波电路或改进解码算法,以减少噪声干扰和提高解码准确性。
    • 扩展通道数量或增加控制逻辑,以实现更复杂的控制功能。
    • 引入无线通信模块(如Wi-Fi、蓝牙等),将红外遥控与无线控制相结合,提高控制的灵活性和便捷性。

    在进行升级或改造时,需要根据具体的应用需求和技术条件进行选择和设计。

艾华集团(AISHI)公司的发展小趣事

随着市场的不断变化和竞争的加剧,艾华集团意识到,要想在行业中立足并取得长远发展,必须走科技创新之路。于是,公司成立了多个研究院,专注于基础材料、产品、工业装备以及产品应用的研究。通过不断的科技创新和产品升级,艾华集团成功研发出了耐超高纹波和耐超强冲击电流的铝电容器技术,这一技术在市场上获得了广泛认可,赢得了飞利浦、欧司朗、GE等世界知名照明客户的青睐。

Ford Aerospace & Communications Corp公司的发展小趣事

在20世纪20年代,亨利·福特不仅专注于汽车制造业,还展现了对航空技术的浓厚兴趣。他资助了威廉·布什纳尔·斯道特(Willam Bushnell Stout)的飞机研发项目,这标志着福特向航空领域的初步探索。斯道特设计的福特三发飞机(后被称为“铁皮鹅”)虽未直接成为商业成功的典范,但它为福特汽车公司积累了宝贵的航空技术经验,也为后续可能的航空通信项目奠定了基础。

Atlantic Microwave Ltd公司的发展小趣事

随着电子行业的快速发展,Atlantic Microwave Ltd公司意识到,只有不断创新才能在激烈的市场竞争中立于不败之地。公司投入大量研发资金,吸引了一批优秀的科研人才,专注于微波技术的研发与创新。经过数年的努力,公司成功推出了一款具有颠覆性的微波产品,凭借其卓越的性能和稳定性,迅速获得了市场的认可,为公司带来了可观的收益。

FLIR公司的发展小趣事

近年来,随着智能化和便携化趋势的兴起,FLIR积极响应市场需求,推出了一系列智能化、便携化的红外热像仪产品。例如,FLIR的I系列和T系列产品就以其小巧轻便、操作简便的特点受到了广大用户的青睐。这些产品不仅具备高性能的红外成像能力,还集成了多种智能化功能,如自动测温、图像分析、报告生成等,极大地提升了用户的使用体验和工作效率。此外,FLIR还推出了适用于智能手机的红外热像仪配件,进一步拓宽了产品的应用领域和市场空间。

CAROLCABLE公司的发展小趣事

CAROLCABLE公司的创立,标志着电子线缆行业迎来了一位新的竞争者。在电子科技飞速发展的时代背景下,创始人凭借对线缆技术的深刻理解和市场需求的敏锐洞察,决定创立CAROLCABLE公司。公司初期,面临着资金短缺、技术瓶颈和市场认知度低等多重挑战。然而,创始人凭借着坚定的信念和不懈的努力,带领团队克服了一个又一个困难。他们积极研发新产品,优化生产工艺,提高产品质量,逐渐在市场上站稳了脚跟。

随着公司业务的不断拓展,CAROLCABLE开始与一些知名的电子企业建立合作关系,为其提供高质量的线缆产品。这些合作不仅为公司带来了稳定的订单和收入,也进一步提升了CAROLCABLE在行业内的知名度和影响力。

问答坊 | AI 解惑

共享

大家享受下…

查看全部问答>

简单实用声控电子门铃电路

利用本电路作为门铃时,不需在门前安装按钮开关,来客只需叩一下大门,门铃便会发声。电路如图所示。 电路最大的特点就是利用扬声器做振动输入,又做门铃声输出。…

查看全部问答>

基于无线射频技术的无人值守病房监护系统

体温、心率和呼吸频率等三项生理参数是人体最重要、最基本的生命体征。对伤病人员进行多项生命体征的监测有利于对其进行及时有效的治疗处理,但目前我国大部分监护系统都是人工床边监护和有线方式床边监护,前者浪费人力,可靠性低;后者成本高,布 ...…

查看全部问答>

2410 做产品时,还需要 Nor Flash 吗?

2410 可以通过 Nand Flash 启动,是不是就不需要 Nor Flash 了? 不知道做过产品的朋友,你们都装不装 Nor Flash ? 如果装了,那都起什么作用?…

查看全部问答>

关于uboot如何获取MAC

各位大侠好,我在网上搜了一下关于uboot获取mac的方法,说是在board.c中的下面这一段实现了获取mac的功能, /* MAC Address */ { int i; ulong reg; char *s, *e; char tmp[64]; i = getenv_r (\"ethaddr\", tmp, sizeof (tmp)); s ...…

查看全部问答>

有没有人学嵌入式的啊??

刚开始学的,看书糊里糊涂的,概念乱啊,有点看不下去了, 书是北航的嵌入式系统原理 不知道是不是要换换学嵌入式的方法, 不知道版里的前辈们有什么好的建议啊?谢谢阿…

查看全部问答>

WideCharToMultiByte在WCE下的问题

char HostIPAdd[32]; TCHAR * nHostAddress; WideCharToMultiByte(CP_OEMCP,NULL,nHostAddress,-1,HostIPAdd,0,NULL,FALSE); m_SockHostAddr.sin_addr.S_un.S_addr=inet_addr(HostIPAdd); m_SockHostAddr.sin_port=htons(nHostPort); TCHAR->ch ...…

查看全部问答>

急啊,WinCE串口通讯的问题

突然来了这么个任务.Wince下,要能够串口通讯,能够操作数据库. 我在Wince下没有开发过,问几个幼稚问题: 1.使用哪款PDA比较合适? 2.使用什么开发环境和数据库? 3.开发步骤怎样的? 如果那位高手有时间的话能帮我做了,我可以支付报酬. 我的msn: s ...…

查看全部问答>

RT-Thread GSoC - 面向在校学生的开源项目

大家好, RT-Thread目前正在申请Google Summer of Code的活动。Google编程之夏 (Google Summer of Code,简称GSoC),是由Google公司所主办的年度学生程序设计与开发活动计划,旨在鼓励学生参与开放源 代码的程 ...…

查看全部问答>

下载出现问题。。。【 could not open file at GEL_load】

今天把launchpad上面5V的接口用排针焊上了,很小心的焊的。然后我再下载程序:惊奇的发现,不能下载了。~~~~(>_<)~~~~ 这是为什么啊??错误提示的  could not open file at GEL_load。几天前提问过问题,我还有好多金币,怎么悬赏啊 ...…

查看全部问答>