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

发布者:温馨的家庭最新更新时间:2024-05-08 来源: elecfans关键字:STM32  库函数  寄存器 手机看文章 扫描二维码
随时随地手机看文章

**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外部中部需要注重知识点EXTI与 NVIC ,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


指示灯


按键


关键字:STM32  库函数  寄存器 引用地址:STM32库函数与寄存器开发区别

上一篇:企业级操作之STM32项目版本管理方法
下一篇:使用LLVM-embedded-toolchain-for-Arm-17.0.1开发STM32

推荐阅读最新更新时间:2024-11-08 09:56

STM32的定时器中断
实验目的: 让蜂鸣器每隔一秒响一次; 实验步骤: 实验程序: /************************led.c***********************/ #include stm32f4xx.h //在SYSTEM目录下可以找到 #include sys.h void LED_Init(void){ RCC- AHB1ENR |= 1 5; //使能GPIO端口的F时钟 GPIO_Set(GPIOF,PIN9|PIN10,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_25M,GPIO_PUPD_PU);
[单片机]
STM32的中断系统理解
STM32中的中断分为异常和中断,STM32 目前支持的中断共为 84 个(16 个内核+68 个外部), 16 级可编程中断优先级的设置(仅使用中断优先级设置 8bit 中的高 4 位)和16个抢占优先级(因为抢占优先级最多可以有四位数)。 但我 们 一 般 建 议 从 启 动 文 件startup_stm32f10x_hd.s 中查找的,因为不同型号的 STM32 芯片,中断向量表稍微有点区别,在启动文件中,已经有相应芯片可用的全部中断向量。而且在编写中断服务函数时, 需要从启动文件中定义的中断向量表查找中断服务函数名。STM32 的中断如此之多,配置起来并不容易,因此我们需要一个强大而方便的中断控制器 NVI
[单片机]
<font color='red'>STM32</font>的中断系统理解
STM32基础入门(一)——STM32概览
1. STM32那些事儿 STM32系列专为要求高性能、低成本、低功耗的嵌入式应用设计的ARM Cortex®-M0,M0+,M3, M4和M7内核,按内核架构分为不同产品:主流产品(STM32F0、STM32F1、STM32F3)、超低功耗产品(STM32L0、STM32L1、STM32L4、STM32L4+)、高性能产品(STM32F2、STM32F4、STM32F7、STM32H7)。 命名规则: STM32型号的说明:以STM32F103RBT6这个型号的芯片为例,该型号的组成为7个部分,其命名规则如下: 以上参考自百度百科 STM32词条 概括一下我没有摘录的部分,就是STM32有着各种优势,是从事嵌入式行业
[单片机]
<font color='red'>STM32</font>基础入门(一)——<font color='red'>STM32</font>概览
stm32中“拔掉jlink”程序无法正确运行
Q:在调试stm32程序时,从电脑USB口拔掉jlink后开发板上程序为什么无法正确运行?断点复位后也不行。 A:首先,要拔了jlink与开发板的连接(而不仅仅是其与PC的连接),因为jlink本省内部也有电路,对开发板上的程序运行有所影响; 其次,检查stm32的boot 的配置,将BOOT0配置为0才能从复位后Flash启动。BOOT的具体配置如下: BOOT1 BOOT0 启动模式 说明 X 0 Flash 复位后选择主闪存启动 0 1
[单片机]
浅析STM32的五大嵌入式操作系统的特点及不足
基于STM平台且满足实时控制要求操作系统,有以下5种可供移植选择。分别为μClinux、μC/OS-II、eCos、FreeRTOS和都江堰操作系统(djyos)。下面分别介绍这五种嵌入式操作系统的特点及不足。 1、μClinux μClinux是一种优秀的嵌入式Linux版本,其全称为micro-control Linux,从字面意思看是指微控制Linux。同标准的Linux相比,μClinux的内核非常小,但是它仍然继承了Linux操作系统的主要特性,包括良好的稳定性和移植性、强大的网络功能、出色的文件系统支持、标准丰富的API,以及TCP/IP网络协议等。因为没有MMU内存管理单元,所以其多任务的实现需要一定技巧。 μC
[单片机]
基于STM32芯片特定外设复位的功能
我们知道,STM32芯片里有很多系统级的复位,比方上电复位、欠压复位、看门狗复位、软件复位、复位脚电平触发复位等等。这些系统级的复位往往都是针对整个芯片或芯片的绝大部分区域。 其实,我们在实际应用中有时候可能并不需要、甚至不接受总是对整个芯片做大面积的复位。正因为如此,STM32的芯片里除了具备那些系统级复位功能外,还针对各个外设设计了复位功能,即我们可以只需针对某特定外设或特定区域做复位而不影响其它。特定区域一般是指某一块总线驱动的外设集,比方挂在APB1总线的所有外设。 或许有人不了解、或者说没有使用过针对特定外设复位的功能,这里就简单介绍下,抛砖引玉。在STM32各个系列的参考手册里的RCC章节,有关于对外设或局部外
[单片机]
基于<font color='red'>STM32</font>芯片特定外设复位的功能
STM32使用HAL库实现串口通讯——理论原理详细讲解
一、中断模式 1.中断接收。 1.1先看中断接收的流程(以 USART2 为例) 在启动文件中找到中断向量 USART2_IRQHandler 找到USART2_IRQHandler的函数定义 可以看到这里又转到另一个函数里去了,再找下去: 该函数的源码: /** * @brief This function handles UART interrupt request. * @param huart: pointer to a UART_HandleTypeDef structure that contains * the configuration informat
[单片机]
<font color='red'>STM32</font>使用HAL库实现串口通讯——理论原理详细讲解
STM32—进入STOP模式后功耗下不去问题
背景: 最近调试板子进入STOP模式后发现电流为mA级别,功耗降不下去,最终发现是ADC开启后,忘记关闭了,导致有1.45mA的电流消耗。 内容: 利用HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI)函数使板子进入STOP模式后,电流一直降不下去。之后调了好久,才发现调用ADC采集后,忘记把ADC关掉了,真是蛋疼啊。代码如下: HAL_ADC_Start(&hadc); //开启ADC HAL_ADC_PollForConversion(&hadc,10);//进行ADC 转换,然后对转换后数据进行换算。关键的一步
[单片机]
<font color='red'>STM32</font>—进入STOP模式后功耗下不去问题
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved