重头再学一次单片机——1.0、Cortex-M4下的引脚驱动

章节背景:从12年校外C语言培训13年底接触51单片机到14年自学STM32单片机,至今已有七八个年头了。

大专是自动化专业,本科也是。从一开始就确定了以后从事嵌入式工作的我一直在自学嵌入式,学校老师上课只会念书,专业课都用来打基础了(PS:大学的专业课还是很有用的说,不论是哪一门,学好了以后不知道什么时候就成为了你的竞争优势),和岗位强相关的几乎没有。所以自己也算是跨专业就业了。

学了这么多年的单片机,大部分时间都是裸奔,偶尔玩玩RTOS,到了现在,人近三十,焦虑了,迷茫了,感觉单片机这条路快走到头了(主要是作为普通员工二本专业,工资快到顶了~)。准备转行Linux了。但是回头想想,学单片机这么多年了,就这么直接放弃了是不是对不起自己这么多年的努力了?难道就不能变成我在以后其他同做嵌入式Linux同事面前的优势?

但是吧。。。。。。这个优势实在是有点拿不出手呀,也难怪,谁让单片机行业门槛低呢,低到什么程度呢?低到我可以教一个刚上初一初二的学生做驱动LED点阵,驱动遥控小车跑起来(软硬件都让学生自己搭建)。拿不出手呀。但是单片机就没有一点深入的东西了吗?其实也不尽然,大家都知道C语言是我们编程的工具、编译器也是,其实单片机掌握后也只是一个工具而已,能做什么事情不在于工具有多厉害(当然降维打击的就另说了),而在于使用工具的人。

于是自己琢磨琢磨自己到底对单片机了解多少的时候,却发现自己好像什么都懂了,但又好像什么都不太懂,总像是雾里看花水中捞月,隔着一层什么。像是最简单的引脚驱动、PWM驱动、SPI读写、IIC通信……这些都是14年就用过的东西,当时就能东抄抄西看看做出东西来,现在好像明白了更多,但是又好像什么都没明白,还是没有吃透这些东西。为了对以前做个交代,为了对以后的进阶打个良好的基础,我决定从头开始,好好的深挖一下单片机这个东西,看看自己到现在到底明白了多少,能做到什么地步。由此就开始了我下面的一系列文章:重头再学单片机。

目前暂定主要更新基于Cortex-M3的内容,用的最多,也最熟悉。其次是Cortex-M4,再其次是Cortex-M0,再其次就是Cortex-M0+。其余的由于自己能力有限,接触的太少,没有多少能拿的出来的东西,就干脆不写了。

软件架构方面,主要是基于IDE keil来编写,使用的库包括ST官方的3.0、3.5、HAL库、LL库等,至于国产芯片库就不多做介绍了,换个壳而已,用法是一样的。

单片机型号选择上可能会针对特定的型号或者厂家稍带说明,主要说差异和漏洞以及解决办法。仅以我接触过的ST/GD/APM/AT/HF来说明,其未接触过的也欢迎大家补充和探讨。

写这些文章的主要意义是为了自我总结和提高,所以很多地方说的可能不够详细,很多地方说的过于深入,“不太适合”初学者,更适合和我一样高不成低不就卡在中间阶段的“迷茫”人群,希望对你们的项目推进、技术提高有所帮助。

下面就进入今天的主题:新建工程+配置工程+驱动引脚电平翻转。

今天用到的配置为:

软件部分:IDE工具:KEIL5.20、 驱动库:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0、  运行环境:win10

硬件部分:芯片为STM32F407ZGT6、 测试环境:启明欣欣开发板。(STM32F4xx_DSP_StdPeriph_Lib_V1.4.0驱动库大家最好自己到官网下载或者自行到网上搜索)

首先第一步,新建工程:建立一个用于存放工程的文件夹。第一次建立工程,建议大家建立一个空白的工程模板,以后需要新建工程可以直接拷贝这个工程进行修改。

2、打开工程文件,建立三个文件,文件命名大家可以根据自己的需要设计,在这里先解释一下文件命名的意义。

App   用于存放用户自己设计的应用程序,包括底层驱动和上层应用。

Libraries  库 用于存放各种支持型的库文件,包括内核文件、外设库、启动文件、系统配置文件等。

Project 工程目录 用于存放工程配置文件,在keil5中,软件会自动在工程建立的路径下自动建立Output/Objects编译输出文件,listings编译缓存文件(或者说编译过程文件),DebugConfig调试缓存文件。所以我们就不用在工程模板路径下手动再建立这三个文件了。

3、从官方提供的参考库里提取需要的文件

首先我们先在Libraries路径下建立如下两个文件夹

CMSIS存放内核文件、启动文件、系统配置文件

STM32F4xxxxxxxxxxxxxV1.4.0最后的数字是库的版本,不同版本的库可能会存在命名、功能以及兼容上的区别。这个文件夹是用来存放芯片所对应的外设底层驱动库文件,基本上都是把寄存器对应的地址抽象成名称、为了方便管理寄存器或者外设配置而建立的结构体,一些外设的初始化函数和简单的调用函数等。

下面就是从STM32F4xx_DSP_StdPeriph_Lib_V1.4.0库里拷贝我们需要的文件了。

-1、在路径:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Device\ST\STM32F4xx\Include下找到上图1所指的文件

-2、在路径:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm下找到上图3所指的文件,这里根据编译器的不同选择不同的目录进行提取文件。

-3、在路径:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Include下找到上图2所指的文件,这里根据芯片的内核不同,选择不同的文件

-4、在路径:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates下找到上图4所指的文件

-5、在路径:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Project\STM32F4xx_StdPeriph_Templates下找到上图5所指的文件,这个文件并不是必须的,只是单纯为了方便管理的定义的一个文件。如果用户有自己的配置文件,则不需要这个文件

-6、在路径:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\STM32F4xx_StdPeriph_Driver下的inc、src两个外设底层驱动库文件夹宝贝我我们的工程模板下的STM32F4xxxxxxxxxxxxxV1.4.0文件夹目录下(这里纯粹是我为了偷懒不想打字用xxx代替,并不是建议大家将文件夹如此命名)。

然后就是打开keil加载文件了~(终于打开keil了),按照如下操作建立工程

其次会弹出选择芯片对话框,按照自己的芯片型号一级级的选择自己所使用的芯片,记住,这里一定要选到最后一层,否则选择的芯片型号将不会被保存。

按照下图所示工程文件配置,并按照下图1操作新增工程内的文件夹,建议按照2的示例进行命名,点击3所在对话框的下方add file添加文件

在3添加文件与2中文件夹的对应关系为:

Start-Up中加载工程模板\Libraries\CMSIS路径下:startup_stm32f40_41xxx.s启动文件

App中加载工程模板\App路径下:main.c源文件(咦,我的main.c文件呢?这里就麻烦大家先去App文件夹下建立一个txt文件命名为main,然后将文件格式.txt修改为.c)

lib中加载工程模板\Libraries\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\src路径下的全部文件,直接ctrl+A全选后点击add添加。

然后,点击OK保存。

此时我们的keil界面应该是这样的:

然后我们在main.c中写上如下代码:

#include "stm32f4xx.h"

int main(void)
{
    return 0;
}
 

点击F7进行编译,咦,怎么那么多报错。。。

没关系,别害怕,我们还有两个工作要做:配置工程环境和修改一个库文件。先点击alt+F7进入工程环境配置界面,剩下的具体操作如下图:

在define预编译栏内输入1和3两个预编译字符,2代表的是一个.,这个不能少了。不同的预定义字符之间需要用'.'符号隔开。

然后再include paths misc栏内把我们的库文件的链接路径添加进来,点击后面的“...”进入配置界面。这里我们只需要将自己需要链接的.h或者其他需要include包含的文件所在的路径添加进来就好了。

本示例工程需要包含的文件路径只有两个,如下图所示:

然后修改库文件是我们需要找到工程中添加的stm32f4xx_fmc.c文件,然后把它从工程中移除,因为它和工程中的stm32f4xx_fsmc.c文件都是FSMC的驱动文件,只是因为芯片不同对应的驱动操作不同而已。如果不移除,该文件内部定义了大量的FMC_xxxx命名的结构体及常量将因编译器搜索不到而报错

,相同的定义在stm32f4xx_fsmc.c文件中的命名方式则变成了FSMC_xxxx。但是,如下图,大家如果用的芯片不是stm32f40_40xxx,那么就要参考stm32fxx.h文件内的定义来考虑使用这两个中的哪个文件了(比如427——437xx用的就是FMC)。

好了,做完以上操作,我们重启F7编译一下,应该就没问题了~恭喜你成功新建了一个基于M4内核的keil5工程。

 

备注:工程配置的Define栏里填写什么纯粹是看大家用到了哪一块#if内定义的东西,如果你在文件里写了#define xxxx完全没必要在工程配置里填这个,另外,根据stm32f40_4xx.h中的

#ifdef STM32F40XX
  #define STM32F40_41xxx
#endif /* STM32F40XX */

这段话来看,你预定义STM32F40XX一样可以通过编译。

有什么问题、疑问和质疑,欢迎大家在下面留言,后续会保持持续更新。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值