0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32库函数与寄存器开发区别

冬至子 来源:Qt历险记 作者:诺苏编程 2023-10-31 16:04 次阅读

**1.1 **寄存器

寄存器开发优点

直接操作寄存器,运行效率高。

寄存器开发缺点

1、开发难度大,开发周期长

2、代码可阅读性差,可移植差

3、后期维护难度高

1.2****库函数

库函数开优点

1、开发难度较小,开发周期短

2、代码可阅读性强,可移植高

3、后期维护难度低

库函数开缺点

相对于寄存器开发,运行效率略低

注意:库函数其实是ST公司对寄存器的进一步封装。

图片

一、 库函数开发LED

库函数开发LED要添加的库函数文件:stm32f4xx_gpio.c

图片

1、理解led灯原理图

LED0连接在PF9

PF9输出低电平(0),灯亮;PF9输出高电平(0),灯灭;

图片

2、打开GPIOF组时钟

在STM32芯片中,所有的外设时钟是不打开,为了降低功耗

//打开GPIOF组时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);

3、设置PF9灯为输出模式 输出推挽 上拉 速度(50MHZ)

GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_9;    //引脚
GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_OUT;  //输出模式
GPIO_InitStruct.GPIO_OType  = GPIO_OType_PP;  //输出推挽
GPIO_InitStruct.GPIO_Speed  = GPIO_Speed_50MHz;  //速度50MHZ
GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;    //上拉
GPIO_Init(GPIOF, &GPIO_InitStruct);

4、通过下面控制LED灯亮与灭

GPIO_SetBits()   引脚置1
GPIO_ResetBits() 引脚置0

官方参考案例

路径:D:GZFX2103STM32STM32上课资料STM32F4xx固件库stm32f4_dsp_stdperiph_libSTM32F4xx_DSP_StdPeriph_Lib_V1.4.0stm32f4xx_dsp_stdperiph_lib_um.chm官方参考案例

图片

三、 按键库函数开发

库函数开发按键要添加的库函数文件:stm32f4xx_gpio.c

1、理解按键控制原理

KEY0连接在PA0

按键未按下,PA0为高电平

按键 按下,PA0为低电平

图片

2、打开GPIOA组时钟

//打开GPIOA组时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

3、设置引脚为输入,上拉。

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
  GPIO_InitTypeDef  GPIO_InitStruct;


  GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_0;        //引脚0
  GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_IN;        //输入模式
  GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;        //上拉
  GPIO_Init(GPIOA, &GPIO_InitStruct);

4、通过下面函数获取引脚电平

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

一、 中断

中断概念

中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行(面试题)。

图片

图片

STM32外部中部需要注重知识点EXTINVIC ,STM32所有引脚均可以做为外部中断。

4.1、外部中断 / **事件控制器 ** (EXTI)

EXTI 控制器的主要特性如下:
● 每个中断/事件线上都具有独立的触发和屏蔽
● 每个中断线都具有专用的状态位
● 支持多达 23 个软件事件/中断请求
检测脉冲宽度低于 APB2 时钟宽度的外部信号。有关此参数的详细信息,请参见
STM32F4xx 数据手册的电气特性部分。

引脚中断线

图片

上升沿:数字电路中,数字电平从低电平(数字“0”)变为高电平(数字“1”)的那一瞬间(时刻)叫作上升沿。

下降沿:数字电路中,数字电平从高电平(数字“1”)变为低电平(数字“0”)的那一瞬间叫作下降沿。

图片

4.2 NVIC

嵌套向量中断控制器 (NVIC)

**NVIC **特性
嵌套向量中断控制器 NVIC 包含以下特性:
● STM32F405xx/07xx 和 STM32F415xx/17xx 具有 82 个可屏蔽中断通道, STM32F42xxx
和 STM32F43xxx 具有多达 86 个可屏蔽中断通道(不包括 Cortex™-M4F 的 16 根中
断线)
● 16 个可编程优先级(使用了 4 位中断优先级)
● 低延迟异常和中断处理
电源管理控制
● 系统控制寄存器的实现
嵌套向量中断控制器 (NVIC) 和处理器内核接口紧密配合,可以实现低延迟的中断处理和晚
到中断的高效处理。

NVIC优先级分为抢占优先级与响应优先级。

数字越小,优先级别越高

优先级分组

图片

抢占优先级 & 响应优先级区别: 抢占优先级 > 响应优先级

高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。

抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。

抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。

如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;

例:

假定设置中断优先级组为2,然后设置中断3(RTC中断)的抢占优先级为2,响应优先级为1。中断6(外部中断0)的抢占优先级为3,响应优先级为0。中断7(外部中断1)的抢占优先级为2,响应优先级为0。

中断7>中断3>中断6。

4.3****外部中断配置流程

外部中断配置流程要添加的库函数:stm32f4xx_exti.c和stm32f4xx_syscfg.c

图片

参考库函数案例

图片

1、理解按键原理

KEY0 连接PA0,选择下降沿触发

图片

1、设置NVIC分组

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);

3、使能SYSCFG及GPIOA****时钟:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

4、 初始化IO口为输入。

GPIO_Init();

5、设置IO口与中断线的映射关系。

void SYSCFG_EXTILineConfig();

6、初始化线上中断,设置触发条件等。

EXTI_Init();

7、配置中断分组(NVIC),并使能中断。

NVIC_Init();

8、 编写中断服务函数。

EXTIx_IRQHandler();

9、清除中断标志位

EXTI_ClearITPendingBit();

五、函数说明

void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)

函数功能:使能AHB1外设时钟

返回值:无

uint32_t RCC_AHB1Periph:哪个外设

FunctionalState NewState:ENABLE or DISABLE


void GPIO_Init(GPIO_TypeDef GPIOx, GPIO_InitTypeDef GPIO_InitStruct)**

函数功能:GPIO初始化

返回值:无

GPIO_TypeDef* GPIOx:哪个GPIO组

GPIO_InitTypeDef* GPIO_InitStruct:GPIO结构

typedef struct

{

uint32_t GPIO_Pin;              //哪个引脚

GPIOMode_TypeDef GPIO_Mode;     //模式

GPIOSpeed_TypeDef GPIO_Speed;   //速度

GPIOOType_TypeDef GPIO_OType;   //输出类型

GPIOPuPd_TypeDef GPIO_PuPd;     //上下拉

}GPIO_InitTypeDef;


void GPIO_SetBits(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin) *

函数说明:引脚置位

函数返回值:无

GPIO_TypeDef* GPIOx:哪个组IO

uint16_t GPIO_Pin:哪个引脚


void GPIO_ResetBits(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin) *

函数说明:引脚复位

函数返回值:无

GPIO_TypeDef* GPIOx:哪个组IO

uint16_t GPIO_Pin:哪个引脚

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin) * ;

函数说明:读某个引脚输入状态

函数返回值:

Bit_RESET = 0 (低电平)

Bit_SET = 1 (高电平)

GPIO_TypeDef* GPIOx:哪个组IO

uint16_t GPIO_Pin:哪个引脚

void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex)

函数说明:设置IO口与中断线的映射

函数返回值:无

uint8_t EXTI_PortSourceGPIOx:哪个组IO

uint8_t EXTI_PinSourcex:哪个引脚

void EXTI_Init(EXTI_InitTypeDef EXTI_InitStruct) *

函数说明:外部中断控制器初始化

返回值:无

typedef struct

{

uint32_t EXTI_Line;                //中断线

EXTIMode_TypeDef EXTI_Mode;       //模式

EXTITrigger_TypeDef EXTI_Trigger; //触发条件

FunctionalState EXTI_LineCmd;     //中断线命令

}EXTI_InitTypeDef;

void NVIC_Init(NVIC_InitTypeDef NVIC_InitStruct) *

函数说明:NVIC初始化

返回值:无

NVIC_InitTypeDef* NVIC_InitStruct:NVIC结构体

typedef struct

{

uint8_t NVIC_IRQChannel;                    //中断通道,可在stm32f4xx.h文件当中查找

uint8_t NVIC_IRQChannelPreemptionPriority;  //抢占优先级

uint8_t NVIC_IRQChannelSubPriority;         //响应优先级

FunctionalState NVIC_IRQChannelCmd;         //中断通道使能

} NVIC_InitTypeDef;

ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);

函数说明:判断中断线标志位

返回值:SET或RESET

uint32_t EXTI_Line:哪个中断线

void EXTI_ClearITPendingBit(uint32_t EXTI_Line);

函数说明:清空中断线标志位

返回值:无

uint32_t EXTI_Line:哪个中断线

六、应用产品

1、LED

家用LED

指示灯

按键

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led灯
    +关注

    关注

    22

    文章

    1592

    浏览量

    107728
  • 寄存器
    +关注

    关注

    31

    文章

    5290

    浏览量

    119786
  • STM32
    +关注

    关注

    2264

    文章

    10854

    浏览量

    354217
  • GPIO
    +关注

    关注

    16

    文章

    1188

    浏览量

    51823
  • STM32F4
    +关注

    关注

    3

    文章

    194

    浏览量

    27970
收藏 人收藏

    评论

    相关推荐

    库函数寄存器区别

    0. 库函数寄存器区别本质上是一样的。可以在库函数模板里面,直接操作寄存器,因为官方库相关头文件有
    发表于 08-10 06:23

    库函数寄存器开发区别

    库函数寄存器开发区别寄存器寄存器开发优点直接操作寄存器,运行效率高。
    发表于 08-16 06:56

    库函数寄存器开发区别是什么?

    库函数寄存器开发区别是什么?
    发表于 11-17 07:21

    STM32库函数/寄存器/位是什么

    STM32库函数/寄存器/位是什么
    发表于 11-29 07:07

    库函数寄存器操作的区别

    库函数寄存器操作的区别可能和 C 语言与汇编语言的区别差不多吧,都是跟效率有关,但有时候效率并不是唯一指标。我们都知道 C 语言的效率要比汇编低,但是现在绝大多数嵌入式
    发表于 11-29 06:32

    STM32库函数寄存器区别是什么

    库函数版和寄存器版的系统时钟设置的区别:**1.**库函数的目的是让用户应用的,而寄存器更加原始库函数
    发表于 01-05 07:30

    寄存器库函数和HAL库这些都是什么区别

    STM32F1精英版(芯片型号:STM32F103ZET6)常见问题解答:1.正点原子里标准例程分为寄存器库函数和HAL库,这些都是什么区别
    发表于 02-28 06:34

    STM32库函数寄存器应该如何操作

    从开始接触51单片机,到现在开始转型学习功能更加强大的STM32f407系列,学习过程中引入了库函数及相应操作,当时赶着进度做点东西出来,有点不求甚解。现在返回来求索:相比于原来51单片机的寄存器
    发表于 09-10 17:26 3次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>库函数</b>和<b class='flag-5'>寄存器</b>应该如何操作

    stm32是如何将寄存器值通过标准库写入寄存器的?

    stm32是如何将配置从库函数调用一步一步到寄存器的?0. 前言1.综述1.1 流程2.正式开始2.1 LED库函数初始化2.2 GPIO_TypeDef2.3 GPIOA的访问方法2
    发表于 12-16 16:58 18次下载
    <b class='flag-5'>stm32</b>是如何将<b class='flag-5'>寄存器</b>值通过标准库写入<b class='flag-5'>寄存器</b>的?

    基于标准库函数与基于HAL库函数stm32编程方式对比

    一、基于标准库函数stm32编程方式二、基于HAL库函数stm32编程方式差异上面也提到了,STM32有非常多的
    发表于 12-28 19:09 30次下载
    基于标准<b class='flag-5'>库函数</b>与基于HAL<b class='flag-5'>库函数</b>的<b class='flag-5'>stm32</b>编程方式对比

    2021-04-17 STM32串口寄存器库函数配置

    STM32串口寄存器库函数配置方法STM32常用寄存器库函数串口配置一般步骤(串口实例)常用的
    发表于 12-28 19:13 7次下载
    2021-04-17  <b class='flag-5'>STM32</b>串口<b class='flag-5'>寄存器</b><b class='flag-5'>库函数</b>配置

    STM32寄存器操作

    STM32寄存器操作在使用STM32单片机编程时一般都用ST给的库函数编程,库函数编程的底层就是对单片机
    发表于 01-13 15:43 19次下载
    <b class='flag-5'>STM32</b>的<b class='flag-5'>寄存器</b>操作

    STM32库函数开发-GPIO

    2021-01-11 学习日志STM32f1库函数开发学习实战一 · I/O口1. 文件夹结构2. 配置细节 · 从寄存器库函数3. 跑马
    发表于 01-13 16:17 14次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>库函数</b><b class='flag-5'>开发</b>-GPIO

    STM32F103使用(3.5)库函数新建工程

    意法半导体的STM32系列都支持库函数编程,库函数比常规的寄存器方式编程更加好移植,特别是项目需要在几个系列芯片上移植,使用库函数编程,底层
    的头像 发表于 05-28 14:00 3449次阅读
    <b class='flag-5'>STM32</b>F103使用(3.5)<b class='flag-5'>库函数</b>新建工程

    基于STM32F407库函数开发按键控制LED灯

    STM32库函数实际是ST公司对寄存器开发封装。
    的头像 发表于 05-19 15:09 2299次阅读
    基于<b class='flag-5'>STM32</b>F407<b class='flag-5'>库函数</b><b class='flag-5'>开发</b>按键控制LED灯