STM32CubeMx教程---LED闪烁实验

目录

写作目的:

开发环境:

Stm32三种开发模式:

寄存器开发

标准库开发

HAL库开发

项目实战:

新建一个工程

选择单片机型号

RCC时钟配置

时钟树配置

GPIO配置

工程管理

Project Manager---Project

Project Manager---Code Generator

Keil中代码编写

开源万岁:

参考文献:

结语:


写作目的:

        构建知识体系;提升写作能力;

开发环境:

        硬件平台:正点原子探索者stm32f4开发板

        软件平台:Keil+Stm32CubeMx

Stm32三种开发模式:

寄存器开发

        与51单片机类似,直接操作寄存器。这个过程需要开发者对照手册,一行一行把代码敲出来。明显的优点是:执行效率高;明显的缺点是:寄存器数量相对51单片机多的太多,编程效率太低,对开发者要求太高。

        一般不会选择基于寄存器开发,但这种开发模式背后要求的:对开发手册的阅读能力,对芯片架构的理解能力等,是开发者在往后的进阶学习中必须要掌握的。钱老说过:"手里没剑和有剑不用是两码事"。

标准库开发

        ST官方将寄存器操作封装成标准库函数,通过提供的现成的接口函数,开发者不用去管寄存器到底是如何操作的,直接调用接口函数即可。相对于直接的寄存器开发,大大提升了开发效率,降低了开发难度。

        这也是过去一个时代主流的开发模式,如博主最早接触的正点原子教程就是采用标准库函数开发的(当然现在也都有推出HAL库开发的教程,在这里也是非常感谢原子哥的入门教程)。近年来,ST官方对标准库的更新十分缓慢,而是主力推HAL库的开发方式。时代在进步,技术在发展。HAL库开发无疑在不久的将来会成为主流的开发模式,然后也必将被新的开发模式所取代。我们无需争论哪种方式更好,因为这对每个具体的人来说早已有答案。至于博主,那当然是全都要了,小孩子才做选择。

HAL库开发

        那么重点来说下HAL库开发吧。全称就是Hardware Abstraction Layer(硬件抽象层),库如其名,相当抽象。同标准库一样,HAL库的出现也是为了缩短程序的开发周期,而且HAL库显得更加有效。主要体现在以下几个方面:

        它们都将实现功能需要配置的寄存器做了集成,不同的是,对于某些功能,标准库可能要用几句话,HAL库只需用一句话就够了。只针对于某些功能,这点博主自身没感觉到太大区别。

        HAL库很好的解决了不同型号芯片间的移植问题,简单来说就是,在目前的开发模式中,用HAL库移植需要更改的地方最少。这点可真是太棒了,博主个人最讨厌移植,最最讨厌的就是在不同厂商的芯片间移植。简直是噩梦!强扭的瓜不甜啊,无法接受。

        HAL库作为目前的主推开发模式,会一直更新,稳定性有足够的保障。人么,图个安稳。

        HAL库+Stm32CubeMx结合开发,速度简直跟开挂一样,真是泰酷辣!

        当然,缺点也是有的,比如编译后代码偏大,执行效率偏低。这些就看个人了,俗话说快与持久不可兼得,博主本人倾向于这种方式,毕竟开发速度快。

项目实战:

        以一个实战项目来感受一下:利用STM32CubeMx+ Hal库新建一个工程,实现LED每隔1S翻转一次状态。

新建一个工程

File->New Project

选择单片机型号

1.搜索需要的单片机型号

2.点击选中相应的单片机,同时可以点击"星号"收藏,以便下次能够快速找到

3.点击"Start Project"创建工程   

注意:如果第2步中没有点击选择相应的单片机,第3步中的"Start Project"无法点击哦

RCC时钟配置

System Core->RCC->High Speed Clock(HSE)->Crystal/Ceramic Resonator

        时钟相关配置可以参考stm32的参考手册,后期也有计划记录下时钟相关的配置博客。这里先挖个坑,后面来填。

时钟树配置

时钟树的配置仔细核对与下图一致即可。

注意:鼠标需要先点击"Clock Configuration"切换到时钟树配置界面

为了核对方便

可以先将标号4中的内容改为168MHz,回车后软件会进行自动配置

然后对照下图从1->6的标号顺序逐个修改。

简单讲解:详细的讲解可以自己搜下哈~或者等博主以后来填坑。

标号1:正点原子stm32f4探索者开发板外接晶振为8MHz

标号2:选择HSE

标号3/5:PLLCLK 锁相环倍频

标号4:stm32f407zg系列最高支持168MHz

标号6:各种外设时钟频率(注意定时器的2倍频率啥的,芯片参考手册讲得比较详细)

GPIO配置

        开发板上的LED是通过IO口输出高低电平来控制亮灭的,所以这里需要对IO口(开发板用的是PF9口)进行配置

1.切换到"Pinout&Configuration"界面

2.System Core->GPIO

3.PF9->GPIO_Output     将IO口配置成输出模式

1.点击选中PF9这个IO口进入下面的配置界面 

2.GPIO mode:选择Output Push Pull 推挽输出

User Label可以自行命名,代码会生成相应的宏定义

eg.最终生成的宏定义代码如下图所示:

GPIO Pull-up/Pull-down:选择Pull-up 上拉

上拉,因为正点原子开发板上的LED原理图如下:

之前采用标准库函数,是通过直接修改代码进行配置的;而这里直接是图形化界面进行配置。

关于IO口的配置,这里做了些简单说明。后期也有计划记录下IO口相关的配置博客。这里先挖个坑,后面来填。

工程管理

Project Manager---Project

1.Project Manager

2.Project

3.Project Name  工程名字   最好不要用中文

4.Project Location 工程存储位置 最好不要用中文

5.Toolchain/IDE  Min Version  工具链   用的是keil的话,按下图配置即可  IAR的话自己搜下吧

6.Mcu and Firmware Package   安装好Stm32CubeMx后,会自行填充好相关路径

Project Manager---Code Generator

1.Project Manager

2.Code Generator

3.Generated files 建议勾选这个选型 为每个外设创建单独的.h/.c文件,会使项目结构更加清晰
   Generate peripheral initialization as a pair of.c/.h' files per peripheral

4.点击GENERATE CODE生成代码

Keil中代码编写

在Keil中编写代码,使LED灯1S翻转1次;

特别注意开发者自己代码的编写的位置

开源万岁:

gitlab: GitHub - JHZ97/CSDN_LED: CSDN教程的LED源码

参考文献:

STM32cubemx教程及STM32入门(一)

STM32的几种开发方式,你都知道吗?

时隔10年,STM32标准外设库再次升级

结语:

一个人走得更快,一群人走得更远。