stm32固件库介绍_STM32固件库使用手册

stm32固件库介绍_STM32固件库使用手册STM32固件库编程入门

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

目录

 

一、初识stm32固件库

1、什么是固件库

2、初识库函数

二、库函数新建工程

1、新建本地工程文件夹

2、新建工程

三、GPIO 输出—使用固件库点亮 LED

1、LED引脚宏定义

2、 LED 灯亮灭状态的宏定义

3、LED GPIO 初始化函数

4、主函数

工程文件结构的基本构成

软件设计

 


一、初识stm32固件库

资料准备:

STM32F4xx
参考手册》

STM32F4xx
规格书》

Cortex-M3 权威指南》

Cortex™-M4 内核参考手册》

 STM32
标准库帮助文档——《
stm32f4xx_dsp_stdperiph_lib_um.chm

1、什么是固件库

ST
公司提供的标准软件库,包含了 STM32
芯片所有寄存器的控制操作,我们直接学习如何使用
ST
标准库,会极大地方便控制 STM32
芯片。

stm32固件库介绍_STM32固件库使用手册

在library里有:

stm32固件库介绍_STM32固件库使用手册

在使用库开发时,我们需要把
libraries
目录下的库函数文件添加到工程中,并查阅库帮助文档来了解 ST
提供的库函数
如我们写
STM32F4
的工程,必须用到其中的四个文件:
core_cm4.h

core_cmFunc.h
、 corecmInstr.h、
core_cmSimd.h
,其它的文件是属于其它内核的,还有几个文件是
DSP
函数库使用的头文件。
 

Include 文件夹;只需把这些文件加进我们的工程文件即可,有兴趣的朋友可以深究

Device
文件夹下的是具体芯片直接相关的文件,包含启动文件、芯片外设寄存器定义、系统时钟初始化功能的一些文件。
 
 
system_stm32f4xx.c
文件:包含了 STM32
芯片上电后初始化系统时钟、扩展外部存储器用的函数
启动文件 :如STM32F446 型号使“startup_stm32f446xx.s”
stm32f4xx.h 文件:是一个 STM32 芯片底层相关的文件。
 
 

STM32F10x_StdPeriph_Driver 文件夹: 文件夹下有 inc(include 的缩写)跟 src(source 的简写)这两个文件夹,这里的文件属于 CMSIS 之外的的、芯片片上外设部分。

Project文件夹
 
stm32f4xx_it.c
:
stm32f4xx_it.c:这个文件是专门用来编写中断服务函数的
stm32f4xx_conf.h 文件:使用这个配置文件根据芯片型号增减 ST 库的外设文件。

2、初识库函数

学会查阅库帮助文档是很有必要的。
stm32固件库介绍_STM32固件库使用手册

二、库函数新建工程

stm32固件库介绍_STM32固件库使用手册

 
stm32固件库介绍_STM32固件库使用手册
stm32固件库介绍_STM32固件库使用手册
 

1、新建本地工程文件夹

为了工程目录更加清晰,我们在本地电脑上新建一个“工程模板”文件夹,在它之下 再新建 6 个文件夹,具体如下:在本地新建好文件夹后,把准备好的库文件添加到相应的文件夹。

2、新建工程

①选择
CPU
型号
②在线添加库文件
③添加组文件夹:文件从本地建好的工程文件夹下获取,双击组文件夹就会出现添加文件的路径,然后选择文件即可
stm32固件库介绍_STM32固件库使用手册
④先把上面提到的文件从 ST 标准库中复制到工程模版对应文件夹的目录下,然后在新建的工程中添加这些文件,双击组文件夹就会出现添加文件的路径,然后选择文件即可
 
stm32固件库介绍_STM32固件库使用手册

设置文件是否加入编译
stm32固件库介绍_STM32固件库使用手册
 

配置魔术棒选项卡(第一次配置的时候很重要!!!)
⑦下载仿真器配置
 
 

三、GPIO 输出—使用固件库点亮 LED

大致流程:
1. 使能 GPIO
端口时钟;
2. 初始化 GPIO
目标引脚为推挽输出模式;
3. 编写简单测试程序,控制 GPIO
引脚输出高、低电平。

stm32固件库介绍_STM32固件库使用手册

1、LED引脚宏定义

 
  编写应用程序要考虑更改硬件环境的情况,例如
LED 灯的控制引脚与当前的不一样,我们希望程序只需要做最小的修改即可在新的环境正常运行。
若更改了硬件环境,只修改这些硬件相关的宏即可,这些定义一般存储在头文件,即本例子中的“bsp_led.h”文件中
 
1 //引脚定义
2 /*******************************************************/
3 //R 红色灯
4 #define LED1_PIN     GPIO_Pin_10
5 #define LED1_GPIO_PORT     GPIOH
//GPIO_Pin_n可以理解为某端口脚在整个端口的位置。比方某GPIO口的第6管脚位置编码GPIO_Pin_6 被定义为 //((uint16_t)0x0040) 有兴趣的话,可以点击GPIO_Init( )进去看看。
6 #define LED1_GPIO_CLK RCC_AHB1Periph_GPIOH
7 
8 //G 绿色灯
9 #define LED2_PIN     GPIO_Pin_11
10 #define LED2_GPIO_PORT     GPIOH
11 #define LED2_GPIO_CLK     RCC_AHB1Periph_GPIOH
12 
13 //B 蓝色灯
14 #define LED3_PIN     GPIO_Pin_12
15 #define LED3_GPIO_PORT     GPIOH
16 #define LED3_GPIO_CLK     RCC_AHB1Periph_GPIOH
22 /************************************************************/
以上代码分别把控制四盏
LED
灯的
GPIO
端口、
GPIO
引脚号以及
GPIO
端口时钟封装起来了。在实际控制的时候我们就直接用这些宏,以达到应用代码硬件无关的效果。
其中的
GPIO
时钟宏“RCC_AHB1Periph_GPIOH”和“RCC_AHB1Periph_GPIOD”是 STM32 标准库定义的
GPIO
端口时钟相关的宏,它的作用与“GPIO_Pin_x”这类宏类似, 是用于指示寄存器位的,方便库函数使用。它们分别指示 GPIOH

GPIOD
的时钟,下面初始化 GPIO
时钟的时候可以看到它的用法。
(区分GPIO、引脚、端口的概念。遇到宏不清楚的展开查看即可)
 

2、 LED 灯亮灭状态的宏定义

2 /* 直接操作寄存器的方法控制 IO */
3 #define digitalHi(p,i) {p->BSRRL=i;} //设置为高电平 
4 #define digitalLo(p,i) {p->BSRRH=i;} //输出低电平
5 #define digitalToggle(p,i) {p->ODR ^=i;} //输出反转状态,Toggle是按钮
6 /*BSRRH 表示GPIO端口置高电平寄存器,将端口赋给它,即此端口变为高电平*/
/*ODR 表示GPIO端口数据寄存器*/
7 
8 /* 定义控制 IO 的宏 */
9 #define LED1_TOGGLE digitalToggle(LED1_GPIO_PORT,LED1_PIN)
10 #define LED1_OFF digitalHi(LED1_GPIO_PORT,LED1_PIN)
11 #define LED1_ON digitalLo(LED1_GPIO_PORT,LED1_PIN)
12 
13 #define LED2_TOGGLE digitalToggle(LED2_GPIO_PORT,LED2_PIN)
14 #define LED2_OFF digitalHi(LED2_GPIO_PORT,LED2_PIN)
15 #define LED2_ON digitalLo(LED2_GPIO_PORT,LED2_PIN)
16 
17 #define LED3_TOGGLE digitalToggle(LED3_GPIO_PORT,LED3_PIN)
18 #define LED3_OFF digitalHi(LED3_GPIO_PORT,LED3_PIN)
19 #define LED3_ON digitalLo(LED3_GPIO_PORT,LED3_PIN)
2021 /* 基本混色,后面高级用法使用 PWM 可混出全彩颜色,且效果更好 */
2223 //红 24 #define LED_RED \
25 LED1_ON;\
26 LED2_OFF;\
27 LED3_OFF
28
29 //绿
30 #define LED_GREEN \
31 LED1_OFF;\
32 LED2_ON;\
33 LED3_OFF
34
35 //蓝
36 #define LED_BLUE \
37 LED1_OFF;\
38 LED2_OFF;\
39 LED3_ON
40
41
42 //黄(红+绿)
43 #define LED_YELLOW \
44 LED1_ON;\
45 LED2_ON;\
46 LED3_OFF
这部分宏控制
LED
亮灭的操作是直接向
BSRR
寄存器写入控制指令来实现的,对 BSRRL 写
1
输出高电平,对
BSRRH

1
输出低电平,对
ODR
寄存器某位进行异或操作 可反转位的状态。

3、LED GPIO 初始化函数

1 /**
2 * @brief 初始化控制 LED 的 IO
3 * @param 无
4 * @retval 无
5 */
6 void LED_GPIO_Config(void)
7 {
8 /*定义一个 GPIO_InitTypeDef 类型的结构体*/
9 GPIO_InitTypeDef GPIO_InitStructure;
10 
11 /*开启 LED 相关的 GPIO 外设时钟*/
12 RCC_AHB1PeriphClockCmd ( LED1_GPIO_CLK|
13 LED2_GPIO_CLK|
14 LED3_GPIO_CLK|
15 LED4_GPIO_CLK,
16 ENABLE);
17 
18 /*选择要控制的 GPIO 引脚*/
19 GPIO_InitStructure.GPIO_Pin = LED1_PIN;
20 
21 /*设置引脚模式为输出模式*/
22 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
23 
24 /*设置引脚的输出类型为推挽输出*/
25 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
26 
27 /*设置引脚为上拉模式*/
28 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
29 
30 /*设置引脚速率为 2MHz */
31 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
32 
33 /*调用库函数,使用上面配置的 GPIO_InitStructure 初始化 GPIO*/
34 GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);
35 
36 /*选择要控制的 GPIO 引脚*/
37 GPIO_InitStructure.GPIO_Pin = LED2_PIN;
38 GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
39 
40 /*选择要控制的 GPIO 引脚*/
41 GPIO_InitStructure.GPIO_Pin = LED3_PIN;
42 GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);
43 
44 /*选择要控制的 GPIO 引脚*/
45 GPIO_InitStructure.GPIO_Pin = LED4_PIN;
46 GPIO_Init(LED4_GPIO_PORT, &GPIO_InitStructure);
47 
48 /*关闭 RGB 灯*/
49 LED_RGBOFF;
50 }

推挽模式跟开漏模式的区别:
置推挽模式,只能是输出模式,而输出高低电平的驱动电流都很大;
而开漏模式,即可作为输出,也可作为输入。

上拉就是把电位拉高,比如拉到Vcc;下拉就是把电压拉低,比如拉到GND;浮空输入,相当于该引脚接了高电平,引脚不建议悬空,易受干扰。

(1)
使用
GPIO_InitTypeDef
定义
GPIO
初始化结构体变量,以便下面用于存储
GPIO
配置。
(2)
调用库函数
RCC_AHB1PeriphClockCmd
来使能
LED
灯的
GPIO
端口时钟
(3)

GPIO 初始化结构体赋值,把引脚初始化成推挽输出模式,其中的 GPIO_Pin 使用宏“LEDx_PIN”来赋值,使函数的实现方便移植。

(4)使用以上初始化结构体的配置,调用 GPIO_Init
函数向寄存器写入参数,完成
GPIO
的 初始化
(5)
使用同样的初始化结构体,只修改控制的引脚和端口,初始化其它
LED
灯使用的 GPIO 引脚
(6)
使用宏控制
RGB
灯默认关闭,
LED4
指示灯默认开启。
 

 

4、主函数

1 #include "stm32f4xx.h"
2 #include "./led/bsp_led.h"
3 
4 void Delay(__IO u32 nCount);
5 
6 /**
7 * @brief 主函数
8 * @param 无
9 * @retval 无
10 */
11 int main(void)
12 {
13 /* LED 端口初始化 */
14 LED_GPIO_Config();
15 
16 /* 控制 LED 灯 */
17 while (1) {
18 LED1( ON ); // 亮
19 Delay(0xFFFFFF);
20 LED1( OFF ); // 灭
21 
22 LED2( ON ); // 亮
23 Delay(0xFFFFFF);
24 LED2( OFF ); // 灭
25
26 LED3( ON ); // 亮
27 Delay(0xFFFFFF);
28 LED3( OFF ); // 灭
29 
30 /*轮流显示 红绿蓝黄紫青白 颜色*/
31 LED_RED;
32 Delay(0xFFFFFF);
33 
34 LED_GREEN;
35 Delay(0xFFFFFF);
36 
37 LED_BLUE;
38 Delay(0xFFFFFF);
39 
40 LED_YELLOW;
41 Delay(0xFFFFFF);
42 
43 LED_PURPLE;
44 Delay(0xFFFFFF);
45 
46 LED_CYAN;
47 Delay(0xFFFFFF);
48 
49 LED_WHITE;
50 Delay(0xFFFFFF);
51 
52 LED_RGBOFF;
53 Delay(0xFFFFFF);
54 }
55 }
56 
57 void Delay(__IO uint32_t nCount) //简单的延时函数
58 {
59 for (; nCount != 0; nCount--);
60 }

main
函数中,调用我们前面定义的
LED_GPIO_Config
初始化好
LED
的控制引脚, 然后直接调用各种控制 LED
灯亮灭的宏来实现
LED
灯的控制。
以上,就是一个使用 STM32 标准软件库开发应用的流程。

 

 

 

附加          

#ifndef __LED_H
#define    __LED_H

//是为了避免重复定义头文件 

 

自定义的头文件需要添加到路径里

stm32固件库介绍_STM32固件库使用手册

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197655.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 南京大学LAMDA面经汇总

    南京大学LAMDA面经汇总节选自 https://www.jianshu.com/p/7640174a15561.南大计算机网址:南京大学计算机系2016“本科生开放日”申请流程时间:5月13日-5月15日入营条件:985院校的话,绩点排名前5%基本可以入营吃住补助:LAMDA实验室报销车票,住宿费,但是南大不报销车票,但管吃管住,住的很高级的宾馆,条件特别好。参营记录:南大的夏令营是开的最早的一个计算机夏令营,正因为开…

    2022年6月9日
    127
  • ucinet网络分析实例(网络分析app)

    ucinet介绍UCINET为菜单驱动的Windows程序,可能是最知名和最经常被使用的处理社会网络数据和其他相似性数据的综合性分析程序。与UCINET捆绑在一起的还有Pajek、Mage和NetDraw等三个软件。UCINET能够处理的原始数据为矩阵格式,提供了大量数据管理和转化工具。该程序本身不包含网络可视化的图形程序,但可将数据和处理结果输出至NetDraw、Pajek、Mage和Kr…

    2022年4月16日
    71
  • 一分钟解决Chrome浏览器主页被hao123、360和2345篡改简单有效方法[通俗易懂]

    一分钟解决Chrome浏览器主页被hao123、360和2345篡改简单有效方法[通俗易懂]当你打开浏览器看到各种首页跳转的页面,对于强迫症的我是不能接受的!各种情况都碰到了,现在给出解决方法。按照下面的方式去排查就可以一定能解决你的问题,如果不行的话你来打我呀–!。如果问题解决了希望你能推荐给其他人。方式一   查看chrom浏览器的快捷方式后面是否有小尾巴,去掉就可以。如下:方式二   查找到源程序位置,修改源文件的文件名。然后删除旧的快捷方式,重新将改名后

    2022年7月26日
    17
  • 国外迅雷下载太慢怎么办_迅雷下载宝还能用吗

    国外迅雷下载太慢怎么办_迅雷下载宝还能用吗复制下载链接,用百度网盘离线下载到网盘内,然后从网盘直接下载,速度相当给力

    2022年9月7日
    0
  • python简单代码编写_python编码规范

    python简单代码编写_python编码规范本书以Python3.7为编程工具,共分8个单元,从易到难,从基础应用到综合实战,详细讲解Python创意编程的方法和思维。本书通过丰富有趣的实例,帮助学生学习编程思维方式,掌握Python编程基础知识,包括Python环境的搭建、Python的认识、顺序结构、选择结构、循环结构、列表、元组与字典、函数、字符串及算法。本书适合对Python编程感兴趣的初高中学生阅读,也适合作为家长和老师指导中学…

    2022年10月25日
    0
  • python安装jieba库教程_pygame库

    python安装jieba库教程_pygame库方法一:使用pycharm里的检索项(此方法适用于需要使用pycharm的小伙伴)1、打开pycharm,在File下打开Settings。2、在ProjectInterpret菜单栏下,点击”+”号。3、在上方的检索框中输入需要下载的库的库名,点击下方InstallPackage。4、如出现:package”jieba”installsuccessfully的字样,库安装成功。方法二:自行下载第三方库通过指令安装1、…

    2022年9月21日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号