嵌入式--stm32固件库
- 格式:pptx
- 大小:221.97 KB
- 文档页数:14
STM32固件库使用手册随着嵌入式系统在各个领域的越来越广泛的应用,各种芯片和处理器的类型也逐渐增多。
在这些芯片中,ST公司的STM32系列尤其受到了大量开发者们的追捧,其功能强大、性能优越、可编程性高等优点使得其成为了嵌入式系统设计的首选。
在STM32系列芯片中,固件库是其重要的组成部分,提供了独立的硬件抽象层和应用程序接口。
这些功能丰富的API库可用于快速搭建程序架构,以及简便地实现一些常见的操作。
节省开发人员大量的开发时间。
对于初学者,欲了解STM32芯片开发的话,学习STM32固件库的使用是第一步,因此在这里我将分享一些该库的基础内容。
一、固件库的启用在使用STM32固件库之前,我们需要先了解如何启用它。
首先,在安装Keil或IAR等IDE环境后,我们需要将官方提供的固件库下载到本地,并将其解压。
解压后,将库文件夹中的 inc 和src 文件夹添加至Keil或IAR的相关项目目录中,从而ermöglichen 制定了。
接下来,在IDE环境中选择对应的芯片,我们需要设置相关的固件库路径。
具体来说,我们打开Keil或IAR的属性管理器,设置 C/C++ -> Directories 中的 Include Paths 为stm32f10x_stdPeriph_driver/inc,设置配置管理器中的包含路径为上述inc文件夹的全路径。
这样就可以启用了 STM32 固件库,开始进行我们的嵌入式系统开发。
二、基础应用程序在信息时代的今天,眼前各种各样的计算机系统和程序都涌现在眼前。
但是无论是最基础的窗口显示,还是复杂的人脸识别技术,都需要一些基本的芯片和系统支持,而 STM32 芯片就是这一系统之一。
其基础应用程序包括了:GPIO 端口配置:GPIO(PIN)模式配置、输出配置、输入配置。
其中GPIO(PIN)模式配置是对GPIO端口输出模式进行设置,包括推挽、开漏等多种模式,GPIO口的作用是用于输入/输出操作。
嵌⼊式系统——基于Keil5的STM32固件库寄存器编程实现流⽔灯//PF9-LED0,PF10-LED1//PF13-LED2,PF14-LED3#define rRCCAHB1CLKEN *((volatile unsigned long *) 0x40023830)#define rGPIOF_MODER *((volatile unsigned long *) 0x40021400)#define rGPIOE_MODER *((volatile unsigned long *) 0x40021000)#define rGPIOF_OTYPER *((volatile unsigned long *) 0x40021404)#define rGPIOE_OTYPER *((volatile unsigned long *) 0x40021004)#define rGPIOF_OSPEEDR *((volatile unsigned long *) 0x40021408)#define rGPIOE_OSPEEDR *((volatile unsigned long *) 0x40021008)#define rGPIOF_PUPDR *((volatile unsigned long *) 0x4002140C)#define rGPIOE_PUPDR *((volatile unsigned long *) 0x4002100C)#define rGPIOF_ODR *((volatile unsigned long *) 0x40021414)#define rGPIOE_ODR *((volatile unsigned long *) 0x40021014)#define time 0x300000#define on 1#define off 0void led_init(){//GPIOE -- rRCCAHB1CLKEN[4] GPIOF -- rRCCAHB1CLKEN[5]rRCCAHB1CLKEN |= (1<<4)|(1<<5);//MODER-OUT--01 PF9,PF10 [21:18]<------- 0101unsigned long r_value;r_value = rGPIOF_MODER;//readr_value &= ~(0xf << 18);//clearr_value |= (1 << 18)|(1 << 20);rGPIOF_MODER = r_value;//write//MODER-OUT--01 PF13,PF14 [29:26]<------- 0101r_value = rGPIOE_MODER;//readr_value &= ~(0xf << 26);//clearr_value |= (1 << 26)|(1 << 28);rGPIOE_MODER = r_value;//write//OTYPER-PP--0 PF9,PF10 [10:9]<--------00r_value = rGPIOF_OTYPER;//readr_value &= ~(0x3 << 9);//clearrGPIOF_OTYPER = r_value;//write//OTYPER-PP--0 PF13,PF14 [14:13]<--------00r_value = rGPIOE_OTYPER;//readr_value &= ~(0x3 << 13);//clearrGPIOE_OTYPER = r_value;//write//OSPEEDR- PF9,PF10 [21:18]<-------1010r_value = rGPIOF_OSPEEDR;//readr_value &= ~(0xf << 18);//clearr_value |= (1 << 19)|(1 << 21);rGPIOF_OSPEEDR = r_value;//write//OSPEEDR- PF13,PF14 [29:26]<-------1010r_value = rGPIOE_OSPEEDR;//readr_value &= ~(0xf << 26);//clearr_value |= (1 << 27)|(1 << 29);rGPIOE_OSPEEDR = r_value;//write//PUPDR PF9,PF10 [21:18]<--------0000 r_value = rGPIOF_PUPDR;//readr_value &= ~(0xf << 18);//clearrGPIOF_PUPDR = r_value;//write//PUPDR PF13,PF14 [29:26]<--------0000 r_value = rGPIOE_PUPDR;//readr_value &= ~(0xf << 26);//clearrGPIOE_PUPDR = r_value;//write//ODR PF9,PF10 [10:9]<-------11r_value = rGPIOF_ODR;//readr_value |= (1<<9)|(1<<10);//clearrGPIOF_ODR = r_value;//write//ODR PF13,PF14 [14:13]<-------11r_value = rGPIOE_ODR;//readr_value |= (1<<13)|(1<<14);//clearrGPIOE_ODR = r_value;//write}void led0_ctr(int is_on){unsigned long r_value;r_value = rGPIOF_ODR;r_value |= (1<<9);//clearif(is_on) r_value &= ~(1<<9);rGPIOF_ODR = r_value;}void led1_ctr(int is_on){unsigned long r_value;r_value = rGPIOF_ODR;r_value |= (1<<10);//clearif(is_on) r_value &= ~(1<<10);rGPIOF_ODR = r_value;}void led2_ctr(int is_on){unsigned long r_value;r_value = rGPIOE_ODR;r_value |= (1<<13);//clearif(is_on) r_value &= ~(1<<13);rGPIOE_ODR = r_value;}void led3_ctr(int is_on){unsigned long r_value;r_value = rGPIOE_ODR;r_value |= (1<<14);//clearif(is_on) r_value &= ~(1<<14);rGPIOE_ODR = r_value;}void ledAll_ctr1(int flag){unsigned long r_value;if(flag == 0){//LED0 off, LED1 off, LED2 off, LED3 offled0_ctr(off);led1_ctr(off);led2_ctr(off);led3_ctr(off);}if(flag == 1){//LED0 on, LED1 off, LED2 off, LED3 offled0_ctr(on);led1_ctr(off);led2_ctr(off);led3_ctr(off);}else if(flag == 2){//LED0 on, LED1 on, LED2 off, LED3 off led0_ctr(on);led1_ctr(on);led2_ctr(off);led3_ctr(off);}else if(flag == 3){//LED0 on, LED1 on, LED2 on, LED3 off led0_ctr(on);led1_ctr(on);led2_ctr(on);led3_ctr(off);}else if(flag == 4){//LED0 on, LED1 on, LED2 on, LED3 on led0_ctr(on);led1_ctr(on);led2_ctr(on);led3_ctr(on);}}void delay(int v){while(v--);}int main(){led_init();unsigned int flag = 0;while(1){for (int i=0;i<5;i++){ledAll_ctr1(i);delay(time);}for (int i=3;i>=0;i--){ledAll_ctr1(i);delay(time);}}}。
2012-03-14 10:40iar for stm32 固件库的学习笔记系统、源程序文件和头文件命名都以“stm32f10x-”作为开头寄存器作为常量处理外设函数的命名以外设的缩写加下划线开头每个单词的开头字母大写每个函数名只有一个下划线分隔外设缩写和函数名的其他部分ppp_Init :::根据PPP_InitTypeDef中指定的参数,初始化外设PPP。
PPP_DeInit::::复位外设PPP的所有寄存器至缺省值PPP_StructInit :::其功能为通过设置PPP_InitTypeDef结构中的各种参数来定义外设的功能PPP_Cmd:::使能或失能外设PPPPPP_ITConfig:::为使能或者失能来自外设PPP某中断源PPP_DMAConfig:::失能或者使能外设PPP的DMA接口用以配置外设功能的函数总是以字符串“Config”结尾PPP_GetFlagStatus:::检查外设PPP某标志位被设置与否PPP_ClearFlag:::清楚外设PPP标志位PPP_GetITStatus:::判断来自外设PPP的中断发生与否PPP_ClearITPendingBit:::清除外设PPP中断待处理标志位typedef signed long s32;typedef signed short s16;typedef signed char s8;typedef signed long const sc32; /* Read Only */typedef signed short const sc16; /* Read Only */typedef signed char const sc8; /* Read Only */typedef volatile signed long vs32;typedef volatile signed short vs16;typedef volatile signed char vs8;typedef volatile signed long const vsc32; /* Read Only */ typedef volatile signed short const vsc16; /* Read Only */ typedef volatile signed char const vsc8; /* Read Only */ typedef unsigned long u32;typedef unsigned short u16;typedef unsigned char u8;typedef unsigned long const uc32; /* Read Only */typedef unsigned short const uc16; /* Read Only */typedef unsigned char const uc8; /* Read Only */typedef volatile unsigned long vu32;typedef volatile unsigned short vu16;typedef volatile unsigned char vu8;typedef volatile unsigned long const vuc32; /* Read Only */ typedef volatile unsigned short const vuc16; /* Read Only */ typedef volatile unsigned char const vuc8; /* Read Only */stm32f10x_type.h文件中布尔型变量typedef enum{FALSE = 0,TRUE = !FALSE} bool;标志位状态类型 SET & RESETtypedef enum{RESET = 0,SET = !RESET} FlagStatus;功能状态类型 ENABLE&DISABLEtypedef enum{DISABLE = 0,ENABLE = !DISABLE} FunctionalState;错误状态类型 SUCCESS or ERRORtypedef enum{ERROR = 0,SUCCESS = !ERROR} ErrorStatus;stm32f10x_map.h文件包含了所有外设控制寄存器的结构,下例为SPI寄存器结构的声明:/*------------------ Serial Peripheral Interface ----------------*/ typedef struct{vu16 CR1;u16 RESERVED0;vu16 CR2;u16 RESERVED1;vu16 SR;u16 RESERVED2;vu16 DR;u16 RESERVED3;vu16 CRCPR;u16 RESERVED4;vu16 RXCRCR;u16 RESERVED5;vu16 TXCRCR;u16 RESERVED6;} SPI_TypeDef;RESERVEDi(i为一个整数索引值)表示被保留区域stm32f10x_map.h函数包含了所有的外设声明,下例为spi外设的声明:#ifndef EXT#Define EXT extern#endif...#define PERIPH_BASE ((u32)0x40000000)#define APB1PERIPH_BASE PERIPH_BASE#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000).../* SPI2 Base Address definition*/#define SPI2_BASE (APB1PERIPH_BASE + 0x3800).../* SPI2 peripheral declaration*/#ifndef DEBUG...#ifdef _SPI2#define SPI2 ((SPI_TypeDef *) SPI2_BASE)#endif /*_SPI2 */...#else /* DEBUG */...#ifdef _SPI2EXT SPI_TypeDef *SPI2;#endif /*_SPI2 */...#endif /* DEBUG */如果用户希望使用外设SPI,那么必须在文件STM32f10x_conf.h中定义_SPI标签例如:#define _SPI#define _SPI1#define _SPI2每个外设都有若干寄存器专门分配给标志位。
STM32固件库详解1.1 基于标准外设库的软件开发1.1.2 使用标准外设库开发的优势简单的说,使用标准外设库进行开发最大的优势就在于可以使开发者不用深入了解底层硬件细节就可以灵活规范的使用每一个外设。
标准外设库覆盖了从GPIO到定时器,再到CAN、I2C、SPI、UART和ADC等等的所有标准外设。
对应的C源代码只是用了最基本的C编程的知识,所有代码经过严格测试,易于理解和使用,并且配有完整的文档,非常方便进行二次开发和应用。
1.1.3 STM32F10XXX标准外设库结构与文件描述1. 标准外设库的文件结构在上一小节中已经介绍了使用标准外设库的开发的优势,因此对标准外设库的熟悉程度直接影响到程序的编写,下面让我们来认识一下STM32F10XXX的标准外设库。
STM32F10XXX的标准外设库经历众多的更新目前已经更新到最新的3.5版本,开发环境中自带的标准外设库为2.0.3版本,本书中以比较稳定而且较新的V3.4版本为基础介绍标准外设库的结构。
可以从ST的官方网站下载到各种版本的标准外设库,首先看一下3.4版本标准外设库的文件结构,如图5-3所示。
3.0以上版本的文件结构大致相同,每个版本可能略有调整。
标准外设库的第一部分是CMSIS 和STM32F10x_StdPeriph_Driver,CMSIS 是独立于供应商的Cortex-M 处理器系列硬件抽象层,为芯片厂商和中间件供应商提供了简单的处理器软件接口,简化了软件复用工作,降低了Cortex-M 上操作系统的移植难度,并减少了新入门的微控制器开发者的学习曲线和新产品的上市时间。
STM32F10x_StdPeriph_Driver则包括了分别对应包括了所有外设对应驱动函数,这些驱动函数均使用C语言编写,并提供了统一的易于调用的函数接口,供开发者使用。
Project文件夹中则包括了ST官方的所有例程和基于不同编译器的项目模板,这些例程是学习和使用STM32的重要参考。
嵌入式技术与应用课程设计报告题目STM32I2C固件库分析与应用学院专业班级姓名学号指导教师年月日教师评语:总分:教师签名:目录1 I2C接口1.1介绍1.2主要特点1.3概述1.4功能描述1.4.1I2C从模式1.4.2I2C主模式1.4.3错误条件1.4.4SDA/SCL线控制1.4.5SMBus1.4.6DMA请求1.4.7包错误校验(PEC)1.5 中断请求1.6 内部集成电路(I2C)1.6.1 I2C寄存器结构1.6.2 I2C库函数1.6.2.1 函数I2C_DeInit .1.6.2.2 函数I2C_ Init1.6.2.3 函数I2C_ StructInit1.6.2.4 函数I2C_ Cmd1.6.2.5 函数I2C_ DMACmd1.6.2.6 函数I2C_ DMALastTransferCmd1.6.2.7 函数I2C_ GenerateSTART1.6.2.8 函数I2C_ GenerateSTOP1.6.2.9 函数I2C_ AcknowledgeConfig1.6.2.10 函数I2C_ OwnAddress2Config1.6.2.11 函数I2C_ DualAddressCmd1.6.2.12 函数I2C_ GeneralCallCmd1.6.2.13 函数I2C_ ITConfig1.6.2.14 函数I2C_ SendData1.6.2.15 函数I2C_ ReceiveData1.6.2.16 函数I2C_ Send7bitAddress1.6.2.17 函数I2C_ ReadRegister1.6.2.18 函数I2C_ SoftwareResetCmd1.6.2.19 函数I2C_ SMBusAlertConfig1.6.2.20 函数I2C_ TransmitPEC1.6.2.21 函数I2C_ PECPositionConfig1.6.2.22 函数I2C_ CalculatePEC1.6.2.23 函数I2C_ GetPEC1.6.2.24 函数I2C_ ARPCmd1.6.2.25 函数I2C_ StretchClockCmd1.6.2.26 函数I2C_ FastModeDutyCycleConfig1.6.2.27 函数I2C_ GetLastEvent1.6.2.29 函数I2C_ GetFlagStatus1.6.2.30 函数I2C_ ClearFlag1.6.2.31 函数I2C_ GetITStatus1.6.2.32 函数I2C_ ClearITPendingBi1 2C接口1.1 介绍I2C 总线接口连接微控制器和串行I2C 总线。
MDK中使用STM32官方固件库
首先STM32 官方固件库在Keil 中的位置是:.h 文件在
\Keil\ARM\INC\ST\STM32F10x
.c 文件在\Keil\ARM\RV31\LIB\ST\STM32F10x
要使用官方固件库,首先要在MDK 的工程建立以后将需要用到的相应的.c 文件复制到工程下,例如在工程目录下新建一个FWLib 的文件夹,然后复制到这里。
STM32 官方固件库的结构如下:
在stm32f10x_conf.h 中类似如下的定义:#define _SPI2#define _SPI3
在stm32f10x_map.h 中
#ifdef _SPI2#define SPI2((SPI_TypeDef *) SPI2_BASE)#endif
#ifdef _SPI3#define SPI3((SPI_TypeDef *) SPI3_BASE)#endif
就是说只有在stm32f10x_conf.h 中定义了外设的标签(如_SPI2),才能访问SPI2 的寄存器。
因此用户希望访问某外设,必须在stm32f10x_conf.h 中定义标签。
tips:感谢大家的阅读,本文由我司收集整编。
仅供参阅!。
stm32标准库STM32标准库是针对ST公司推出的STM32系列单片机而设计的一套软件开发工具,它提供了一系列的库函数,方便开发者对STM32单片机进行快速的开发和应用。
本文将对STM32标准库进行详细介绍,包括其特点、使用方法以及应用案例。
STM32标准库的特点。
STM32标准库是ST公司针对其STM32系列单片机提供的一套软件开发工具,其特点主要包括以下几点:1. 全面性,STM32标准库涵盖了STM32系列单片机的各种功能模块,包括GPIO、USART、SPI、I2C、定时器、PWM等,能够满足开发者在各种应用场景下的需求。
2. 易用性,STM32标准库提供了丰富的库函数,开发者可以直接调用这些函数来实现对单片机的控制和应用,无需过多关注底层的硬件细节,大大简化了开发流程。
3. 灵活性,STM32标准库的设计考虑了各种应用场景下的需求,提供了多种配置选项和参数设置接口,能够满足不同开发者的个性化需求。
使用STM32标准库的方法。
使用STM32标准库进行开发主要包括以下几个步骤:1. 环境搭建,首先需要在开发环境中配置好STM32标准库的相关文件和工具,包括库文件、编译工具链等。
2. 库函数调用,在编写应用程序时,开发者可以直接调用STM32标准库中提供的各种库函数,来实现对单片机的控制和应用。
3. 参数配置,在调用库函数时,开发者可以根据具体的应用需求进行参数的配置和设置,以实现个性化的功能实现。
4. 编译下载,在完成应用程序的编写后,需要将程序编译生成可执行文件,并下载到目标单片机中进行调试和运行。
STM32标准库的应用案例。
STM32标准库广泛应用于各种领域的嵌入式系统开发中,例如工业控制、智能家居、汽车电子、医疗设备等。
下面以一个简单的LED闪烁程序为例,介绍STM32标准库的应用方法:```c。
#include "stm32f10x.h"void Delay(__IO uint32_t nCount) {。