收藏 分销(赏)

第7章CMSIS架构与STM32库开发方式6Hppt.ppt

上传人:精*** 文档编号:2309373 上传时间:2024-05-27 格式:PPT 页数:61 大小:2.41MB
下载 相关 举报
第7章CMSIS架构与STM32库开发方式6Hppt.ppt_第1页
第1页 / 共61页
第7章CMSIS架构与STM32库开发方式6Hppt.ppt_第2页
第2页 / 共61页
点击查看更多>>
资源描述
Embedded System Development聊城大学聊城大学 理工学院理工学院曹银杰曹银杰 嵌入式系统与应用嵌入式系统与应用 第第7章章 CMSIS架构与架构与STM32库开发方式库开发方式F7.1 STM32库简介介F7.2 STM32结构及构及库层次关系次关系F7.3 库文件及使用文件及使用简介介F7.4 GPIOF7.5 stm32f10 x.hstm32f10 x.h中中GPIO代代码剖析剖析F7.6 GPIO控制控制LEDLED灯实验灯实验F7.7 时钟设置与开启外置与开启外设时钟 7.1 STM32库简介FSTM32STM32外设资源丰富,寄存器的数量多、设置复杂度高,外设资源丰富,寄存器的数量多、设置复杂度高,直接配置寄存器方式开发程序效率低。直接配置寄存器方式开发程序效率低。FSTM32STM32库是由库是由STST公司针对公司针对STM32STM32提供的函数接口,即提供的函数接口,即API API(Application Program Interface)(Application Program Interface),F库是架设在寄存器与用户驱动层之间的代码,向下处理库是架设在寄存器与用户驱动层之间的代码,向下处理与寄存器直接相关的配置,向上为用户提供配置寄存器与寄存器直接相关的配置,向上为用户提供配置寄存器的接口。的接口。STM32库简介F开发者可调用这些函数接口来配置开发者可调用这些函数接口来配置STM32STM32的寄存器,开的寄存器,开发快速,易于阅读,维护成本低等优点。发快速,易于阅读,维护成本低等优点。F事实上,库函数的底层实现恰恰是直接配置寄存器方式事实上,库函数的底层实现恰恰是直接配置寄存器方式的最佳例子,想深入了解芯片是如何工作的话,只要追的最佳例子,想深入了解芯片是如何工作的话,只要追踪到库的最底层实现就能理解。踪到库的最底层实现就能理解。F想修炼想修炼C C语言,就从语言,就从STST的库开始。的库开始。7.2 STM32结构及库层次关系F解决不同的芯片厂商生产的解决不同的芯片厂商生产的CortexCortex微控制器软件的兼容微控制器软件的兼容性问题,性问题,ARMARM与芯片厂商建立了一个软件抽象层。与芯片厂商建立了一个软件抽象层。CMSISCMSIS标准:标准:Cortex MicroController Software Interface Cortex MicroController Software Interface StandardStandard。CMSIS架构STM32结构及库层次关系FCMSISCMSIS标准中最主要的为标准中最主要的为CMSISCMSIS核心层,它包括了:核心层,它包括了:F 内核函数层:其中包含用于访问内核寄存器的名称、内核函数层:其中包含用于访问内核寄存器的名称、地址定义,主要由地址定义,主要由ARMARM公司提供。公司提供。F 设备外设访问层:提供了片上的核外外设的地址和设备外设访问层:提供了片上的核外外设的地址和中断定义,主要由芯片生产商提供中断定义,主要由芯片生产商提供F可见可见CMSISCMSIS层位于硬件层与操作系统或用户层之间,提层位于硬件层与操作系统或用户层之间,提供了与芯片生产商无关的硬件抽象层,可以为接口外设、供了与芯片生产商无关的硬件抽象层,可以为接口外设、实时操作系统提供简单的处理器软件接口,屏蔽了硬件实时操作系统提供简单的处理器软件接口,屏蔽了硬件差异,这对软件的移植是有极大的好处的。差异,这对软件的移植是有极大的好处的。FSTM32STM32的库,就是按照的库,就是按照CMSISCMSIS标准建立的。标准建立的。7.3 库文件及使用简介F新建工程新建工程-选择芯片后芯片后F选择运行运行环境、用的境、用的库、驱动文件、文件、RTX等等编译时自自动添加其他用的添加其他用的库文件文件库文件及使用简介FARMARM公司提供的:如公司提供的:如F core_cm3.h core_cm3.h、及、及core_core_前缀的头文件,核内设备函数层,前缀的头文件,核内设备函数层,进入进入M3M3内核的接口。内核的接口。F stdin.h stdin.h 头文件,这是一个头文件,这是一个ANSI C ANSI C 文件,是独立于处文件,是独立于处理器之外的,就像我们熟知的理器之外的,就像我们熟知的C C语言头文件语言头文件 stdio.h stdio.h 文文件一样。件一样。F misc.h misc.h和和misc.cmisc.c是和是和CM3内核有关的内核有关的NVIC和和SysTick的的驱动代代码。自行添加到工程。自行添加到工程。FSTST公司提供的:公司提供的:F stm32f10 x.h stm32f10 x.h 重要文件,定义寄存器地址、寄存器数重要文件,定义寄存器地址、寄存器数据结构、中断向量表。据结构、中断向量表。F stm32f10 x_adc.c stm32f10 x_adc.c、stm32f10 x_adc.hstm32f10 x_adc.h,针对模数转换,针对模数转换(ADC)(ADC)外设,还有很多其他设备外设的驱动程序。外设,还有很多其他设备外设的驱动程序。F 每个外设对应一个每个外设对应一个 .c.c 和和 .h.h 后缀的文件。后缀的文件。库文件及使用简介Fstartup_stm32f10 x_xx.sstartup_stm32f10 x_xx.s 启动文件启动文件,作用是:作用是:F 1.1.初始化堆栈指针初始化堆栈指针SP;SP;F 2.2.初始化程序计数器指针初始化程序计数器指针PC;PC;F 3.3.设置堆、栈的大小设置堆、栈的大小;F 4.4.设置异常向量表的入口地址设置异常向量表的入口地址;F 5.5.配置外部配置外部SRAMSRAM作为数据存储器(这个由用户配置,一作为数据存储器(这个由用户配置,一般的开发板可没有外部般的开发板可没有外部SRAMSRAM);F 6.6.设置设置C C库的分支入口库的分支入口_main_main(最终调用(最终调用mainmain函数)函数);F 7.7.启动文件还调用了在启动文件还调用了在system_stm32f10 x.csystem_stm32f10 x.c文件中的文件中的SystemIni()SystemIni()函数配置系统时钟。函数配置系统时钟。Fsystem_stm32f10 x.csystem_stm32f10 x.c文件提供了两个函数和一个全局文件提供了两个函数和一个全局变量量库文件及使用简介Fstm32f10 x.hstm32f10 x.h头文件中重要的内容就是把头文件中重要的内容就是把STM32STM32的所有寄的所有寄存器进行地址映射。存器进行地址映射。F如同如同5151单片机的单片机的头文件一样,头文件一样,stm32f10 x.hstm32f10 x.h像像一个大表格,我们在使用的时候就是通过宏定义进行类一个大表格,我们在使用的时候就是通过宏定义进行类似查表的操作。似查表的操作。F没有这个文件的话没有这个文件的话,怎样,怎样访问访问STM32STM32的的寄存器,有寄存器,有什么什么缺点?缺点?-1 1、需要查手册来确定哪个地址对应哪个寄存器。、需要查手册来确定哪个地址对应哪个寄存器。-2 2、地址易写错、可读性差、易出错、开发效率低。、地址易写错、可读性差、易出错、开发效率低。库文件及使用简介F库函数,就是库函数,就是STM32STM32的库文件中为我们编写好的函数接的库文件中为我们编写好的函数接口,调用这些库函数,就可以对口,调用这些库函数,就可以对STM32STM32进行配置。我们进行配置。我们可以不知道库函数是如何实现的,但必须要知道函数的可以不知道库函数是如何实现的,但必须要知道函数的功能、可传入的参数及其意义、和函数的返回值。功能、可传入的参数及其意义、和函数的返回值。F库函数很多,学会查阅库帮助文档就行!库函数很多,学会查阅库帮助文档就行!F库帮助文档:库帮助文档:stm32f10 x_stdperiph_lib_um.chmstm32f10 x_stdperiph_lib_um.chm层层打开文档的目录标签即可层层打开文档的目录标签即可。在用库函数的地方,直接从库帮助文档复制即可。在用库函数的地方,直接从库帮助文档复制即可。思考题:F1 1、没有、没有stm32f10 x.hstm32f10 x.h头文件的话,怎样访问头文件的话,怎样访问STM32STM32的寄的寄存器,有什么缺点?存器,有什么缺点?F2 2、从、从STM32STM32库的实现原理上解答库的实现原理上解答 库到底是什么?为什库到底是什么?为什么要用库?用库函数与直接配置寄存器的区别等问题。么要用库?用库函数与直接配置寄存器的区别等问题。7.4 GPIOFGPIO(General Purpose I/O)通用型输入)通用型输入/输出,主输出,主要用于需要用到要用于需要用到数字量输入数字量输入/输出输出的场合。的场合。F如:如:继电器、继电器、LED、蜂鸣器等的控制;、蜂鸣器等的控制;传感器状态、高低电平等信息的输入等。传感器状态、高低电平等信息的输入等。1、GPIO简介F大部分大部分GPIOGPIO为推挽输出,具为推挽输出,具有完整有完整I I2 2C C功能的是开漏结构;功能的是开漏结构;F正常拉出灌入电流为正常拉出灌入电流为4mA4mA,短,短时间极限值时间极限值40mA40mA;F管脚可承受最大管脚可承受最大5V5V的输入电的输入电压。压。FGPIOGPIO寄存器位于寄存器位于AHBAHB总线上,总线上,可以进行高性能的可以进行高性能的 CPUCPU快速快速访问,支持访问,支持Cortex-M3Cortex-M3位带操位带操作。作。FGPIOGPIO允许进行允许进行DMADMA数据操作。数据操作。GPIO简介FGPIOGPIO引脚又被分为引脚又被分为GPIOAGPIOA、GPIOBGPIOBGPIOGGPIOG不同的组,每不同的组,每组端口分为组端口分为015015,共,共1616个不同的引脚,不同芯片的端口个不同的引脚,不同芯片的端口组数不同。组数不同。GPIOGPIO结构图:结构图:端口配置寄存器GPIO简介FI/OI/O引脚可通过引脚可通过端口配置寄存器端口配置寄存器设置设置成不同的功能。成不同的功能。四种四种输入模式(结构图上半部分):输入模式(结构图上半部分):F上拉输入与下拉输入:与上拉输入与下拉输入:与VDDVDD相连的为上拉电阻相连的为上拉电阻,与,与VSSVSS相连的为下拉电阻。相连的为下拉电阻。再经施密特触发器再经施密特触发器就就把信号把信号转化为转化为0 0、1 1存储存储在输入数据在输入数据寄存器。寄存器。F浮空输入:不接上拉与下拉电阻,直接由触发器输入,浮空输入:不接上拉与下拉电阻,直接由触发器输入,由于其输入阻抗较大,一般把这种模式用于标准的通讯由于其输入阻抗较大,一般把这种模式用于标准的通讯协议如协议如I2CI2C、USARTUSART的接收的接收端。端。F模拟输入:模拟输入:把电压把电压信号直接传送信号直接传送到片上外设到片上外设模块,如模块,如ADCADC。GPIO简介F结构图下半部分为输出模式结构:结构图下半部分为输出模式结构:F推挽输出模式:在输出高电平时,推挽输出模式:在输出高电平时,P-MOSP-MOS导通,低电平导通,低电平时,时,N-MOSN-MOS管导通。管导通。F开漏输出模式:输出开漏输出模式:输出0 0时为低电平,时为低电平,1 1为高阻状态。为高阻状态。F在使用任何一种开漏模式,都需要接上拉电阻。在使用任何一种开漏模式,都需要接上拉电阻。GPIO简介 STM32P0.xP2.xFGPIOGPIO都可配置为中断功能,并可设置为上升沿、下降沿都可配置为中断功能,并可设置为上升沿、下降沿或边沿触发。或边沿触发。上升沿中断下降沿中断 边沿中断 GPIO中断还具有掉电唤醒功能2、GPIO端口配置寄存器F端口配置低寄存器端口配置低寄存器GPIOx_CRL(配置配置0707引脚引脚),端口,端口配置高寄存器配置高寄存器GPIOx_CRH(GPIOx_CRH(配置配置815815引脚引脚)(x=A(x=AG)G)。F可将可将I/OI/O口配置为输入、输出或模拟模式;口配置为输入、输出或模拟模式;PIOx_CRL复位值:复位值:4444 4444h4444 4444h,偏移地址:,偏移地址:00h00h。F每个引脚的模式由寄存器的每个引脚的模式由寄存器的4 4个位控制,又分引脚配置个位控制,又分引脚配置(CNFy1:0)(CNFy1:0),引脚的模式,引脚的模式(MODEy1:0)(MODEy1:0),其中,其中y y表示第表示第y y个引脚。个引脚。GPIOx_CRLGPIO端口配置寄存器例:CRH高寄存器的配置FPIOx_CRHF复位值:复位值:4444 4444h4444 4444h,偏移地址:,偏移地址:04h04h。F例:例:GPIOx_CRHGPIOx_CRH寄存器的第寄存器的第2828至至2929位设置为位设置为1111,并在第,并在第3030至至3131位设置为位设置为0000F答:则把答:则把x x端口第端口第1515个引脚的模式配置成了:输出的最个引脚的模式配置成了:输出的最大速度为大速度为50MHz50MHz的的 通用推挽输出模式。通用推挽输出模式。3、端口输入数据寄存器GPIOx_IDRF端口输入数据寄存器端口输入数据寄存器(GPIOx_IDR)(x=A.E)(GPIOx_IDR)(x=A.E)F复位值:复位值:4444 4444h 4444 4444h,地址偏移:,地址偏移:08h08hF高位高位31:1631:16保留,始终读为保留,始终读为0 0。FIDRx15:0IDRx15:0:端口输入数据:端口输入数据(x=0(x=015)15)F这些位为只读并只能以字的形式读出。读出的值为对应这些位为只读并只能以字的形式读出。读出的值为对应I/OI/O口的状态。口的状态。4、端口输出数据寄存器GPIOx_ODRF端口输出数据寄存器端口输出数据寄存器(GPIOx_ODR)(x=A.E)(GPIOx_ODR)(x=A.E)设置设置I/OI/O口口的方向输入还是输出。的方向输入还是输出。F复位值:复位值:4444 4444h 4444 4444h,地址偏移:,地址偏移:0Ch0ChF高位高位31:1631:16保留,始终为保留,始终为0 0。FODRx15:0ODRx15:0:端口输出数据方向:端口输出数据方向(x=0(x=015)15)F这些位可读可写并只能以字的形式操作。这些位可读可写并只能以字的形式操作。F通过通过GPIOx_BSRR(x=AGPIOx_BSRR(x=AE)E),可以分别地对各个,可以分别地对各个ODRODR位位进行独立的置位进行独立的置位/清零。清零。5、端口置位/清零寄存器GPIOx_BSRRF端口置位端口置位/清零寄存器清零寄存器(GPIOx_BSRR)(x=A.E)(GPIOx_BSRR)(x=A.E)F复位值:复位值:4444 4444h 4444 4444h,地址偏移:,地址偏移:10h10h6、端口位复位寄存器(GPIOx_BRR)F端口位复位寄存器端口位复位寄存器(GPIOx_BRR)(x=A.E)(GPIOx_BRR)(x=A.E)F复位值:复位值:4444 4444h 4444 4444h,地址偏移:,地址偏移:14h14h7、端口配置锁定寄存器GPIOx_LCKRF端口配置锁定寄存器端口配置锁定寄存器(GPIOx_LCKR)(x=A.E)(GPIOx_LCKR)(x=A.E)F复位值:复位值:4444 4444h 4444 4444h,地址偏移:,地址偏移:14h14hF当执行正确的写序列设置了位当执行正确的写序列设置了位16(LCKK)16(LCKK)时,该寄存器用时,该寄存器用来锁定端口位的配置。来锁定端口位的配置。F位位15:015:0用于锁定用于锁定GPIOGPIO端口的配置。在规定的写入操作端口的配置。在规定的写入操作期间,不能改变期间,不能改变LCKP15:0LCKP15:0。F当对相应的端口位执行了当对相应的端口位执行了LOCKLOCK序列后,在下次系统复位序列后,在下次系统复位之前将不能再更改端口位的配置。之前将不能再更改端口位的配置。F每个锁定位锁定控制寄存器每个锁定位锁定控制寄存器(CRL,CRH)(CRL,CRH)中相应的中相应的4 4个位。个位。例:F要控制引脚电平高低,需要对寄存器进行什么操作?要控制引脚电平高低,需要对寄存器进行什么操作?F一个引脚一个引脚y y的输出数据由的输出数据由GPIOx_BSRRGPIOx_BSRR寄存器位的寄存器位的2 2个位来个位来控制分别为控制分别为BRy(Bit Reset y)BRy(Bit Reset y)和和BSy(Bit Set y)BSy(Bit Set y),BRyBRy位用于写位用于写1 1清零,使引脚输出低电平;清零,使引脚输出低电平;BSyBSy位用来写位用来写1 1置置1 1,使引脚输出高电平。,使引脚输出高电平。8、GPIO输入输出演示GPIOx_IDRGPIOx_IDR10BRy 写1Bsy 写1INOUT10GPIOx_ODRGPIOx_ODRGPIOx_PUPDRGPIOx_PUPDRvccGPIOGPIOx_CRLGPIOx_CRL 设置引脚为GPIO功能 1 配置引脚模式 2 设置GPIO的方向 3 设置GPIO输出电平 4 GPIO输入 GPIO输出1高电平高电平1输出操作流程输出操作流程输入操作流程输入操作流程1 读取GPIO引脚电平 4 GPIOx_BSRR7.5 stm32f10 x.hstm32f10 x.h库中库中GPIO代码剖析代码剖析F以外设以外设GPIOCGPIOC为例,文件中包含如下宏定义:为例,文件中包含如下宏定义:#define GPIOC_BASE(APB2PERIPH_BASE+0 x1000)#define GPIOC_BASE(APB2PERIPH_BASE+0 x1000)#define APB2PERIPH_BASE(PERIPH_BASE+0 x10000)#define APB2PERIPH_BASE(PERIPH_BASE+0 x10000)#define PERIPH_BASE(uint32_t)0 x40000000)#define PERIPH_BASE(uint32_t)0 x40000000)F首先看外设基地址首先看外设基地址 PERIPH_BASEPERIPH_BASE这个宏,宏展开为这个宏,宏展开为0 x4000 0000,0 x4000 0000,并把它强制转换为并把它强制转换为uint32_tuint32_t类型数据;类型数据;F总线基地址宏总线基地址宏APB2PERIPH_BASEAPB2PERIPH_BASE指向地址指向地址0 x4001 00000 x4001 0000;F最后到了宏最后到了宏GPIOC_BASEGPIOC_BASE为为APB2PERIPH_BASEAPB2PERIPH_BASE加上偏移量加上偏移量0 x10000 x1000得到了得到了GPIOCGPIOC端口的寄存器组的基地址。端口的寄存器组的基地址。stm32f10 x.h中GPIO代码剖析Fstm32f10 x.hstm32f10 x.h文件,还可以发现以下类似的宏:文件,还可以发现以下类似的宏:F#define GPIOA_BASE(APB2PERIPH_BASE+0 x0800)#define GPIOA_BASE(APB2PERIPH_BASE+0 x0800)F#define GPIOB_BASE(APB2PERIPH_BASE+0 x0C00)#define GPIOB_BASE(APB2PERIPH_BASE+0 x0C00)F#define GPIOC_BASE(APB2PERIPH_BASE+0 x1000)#define GPIOC_BASE(APB2PERIPH_BASE+0 x1000)F#define GPIOD_BASE(APB2PERIPH_BASE+0 x1400)#define GPIOD_BASE(APB2PERIPH_BASE+0 x1400)FGPIOAGPIOA、GPIOBGPIOB、GPIOCGPIOC、GPIODGPIOD寄存器组的起始地址,都寄存器组的起始地址,都对应着独立的一组寄存器。对应着独立的一组寄存器。typedef struct _IO uint32_t CRL;_IO uint32_t CRH;_IO uint32_t IDR;_IO uint32_t ODR;_IO uint32_t BSRR;_IO uint32_t BRR;_IO uint32_t LCKR;GPIO_TypeDef;F#define GPIOA(#define GPIOA(GPIO_TypeDefGPIO_TypeDef*)GPIOA_BASE)*)GPIOA_BASE)F#define GPIOB(#define GPIOB(GPIO_TypeDefGPIO_TypeDef*)GPIOB_BASE)*)GPIOB_BASE)F F(GPIO_TypeDefGPIO_TypeDef*)*)把把GPIOA_BASE GPIOA_BASE 地址转换为地址转换为GPIO_TypeDefGPIO_TypeDef 结构体指针结构体指针类型。类型。对每个对每个GPIOxGPIOx是用是用结构结构封装了寄存器组封装了寄存器组,stm32f10 x.h,stm32f10 x.h中代码:中代码:GPIO_TypeDef GPIO_TypeDef,这个结构,这个结构体的首地址(变量体的首地址(变量CRLCRL的地的地址)若为址)若为0 x4001 10000 x4001 1000,那那么结构体中第二个变量么结构体中第二个变量(CRHCRH)地址为)地址为0 x4001 1000 0 x4001 1000+0 x04,+0 x04,加上的这个加上的这个0 x04 0 x04,正是正是4 4字节地址偏移量。字节地址偏移量。stm32f10 x.h中GPIO代码剖析F有了这样的宏,就可用以下方式来修改有了这样的宏,就可用以下方式来修改GPIOGPIO寄存器:寄存器:FGPIO_TypeDef*GPIOx;GPIO_TypeDef*GPIOx;/定义一个定义一个GPIO_TypeDefGPIO_TypeDef型结构体指针型结构体指针GPIOx GPIOx FGPIOx=GPIOA;GPIOx=GPIOA;/把指针地址设置为宏把指针地址设置为宏GPIOAGPIOA地址地址 FGPIOx-CRL=0 xffffffff;GPIOx-CRL=0 xffffffff;/通过指针访问并修改通过指针访问并修改GPIOA_CRLGPIOA_CRL寄存器寄存器 F通过类似的方式,我们就可以给具体的寄存器写上适当通过类似的方式,我们就可以给具体的寄存器写上适当的参数,控制的参数,控制STM32STM32了。了。F这只是库开发的皮毛,库提供了更简单的开发方式。这只是库开发的皮毛,库提供了更简单的开发方式。GPIOF1.1.配置寄存器:选定配置寄存器:选定GPIOGPIO的特定功能,最基本的如:的特定功能,最基本的如:选择作为输入还是输出端口。选择作为输入还是输出端口。F2.2.数据寄存器:保存了数据寄存器:保存了GPIOGPIO的输入电平的输入电平 或或 将要输出将要输出的电平。的电平。F3.3.位控制寄存器:设置某引脚的数据位控制寄存器:设置某引脚的数据 为为1 1或或0 0,控制输,控制输出的电平。出的电平。F4.4.锁定寄存器:设置某锁定引脚后,就不能修改其配锁定寄存器:设置某锁定引脚后,就不能修改其配置。置。C语言程序举例:TESTc.C#define uint32#define uint32 unsigned intunsigned int#define N#define N 1010uint32 sum;uint32 sum;/使用加法运算来计算使用加法运算来计算1+2+3+.+(N-1)+N1+2+3+.+(N-1)+N的值。的值。(N0)(N0)int main(void)int main(void)uint32 i;uint32 i;sum=0;sum=0;for(i=0;i=N;i+)for(i=0;i-就要选定需要控制的特定引脚就要选定需要控制的特定引脚 F2.GPIO2.GPIO功能如此丰富功能如此丰富 -配置需要的特定功能配置需要的特定功能 F3.3.控制控制LEDLED的亮和灭的亮和灭 -设置设置GPIOGPIO输出电压的高低输出电压的高低 F与与GPIOGPIO相关的寄存器了,可以通过相关的寄存器了,可以通过STM32STM32参考手册参考手册来查看来查看LED流水灯实验FLEDLED实验中用到了实验中用到了RCCRCC跟跟GPIOGPIO这这两个外设。环境配置如图:两个外设。环境配置如图:Fmain.cmain.cFled.cled.cFled.hled.hLed流水灯主程序:main.c#include led.hvoid Delay(_IO uint32_t nCount)/简单延延时函数函数for(;nCount!=0;nCount-);int main(void)LED_GPIO_Config();while(1)LED1(ON);Delay(0 x0FFFFF);LED1(OFF);LED2(ON);Delay(0 x0FFFFF);LED2(OFF);LED3(ON);Delay(0 x0FFFFF);LED3(OFF);初始化LED函数 led.c#include led.h#include stm32f10 x_gpio.h#include stm32f10 x_rcc.hvoid LED_GPIO_Config(void)/*利用库定定义一个一个GPIO_InitTypeDef类型的型的结构体构体*/GPIO_InitTypeDef GPIO_InitStructure;/*开启开启GPIOC的外的外设时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);/*选择要控制的要控制的GPIOC引脚引脚 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;/*设置引脚模式置引脚模式为通用推挽通用推挽输出出*/GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;初始化LED函数 led.c/*/*设置引脚速率为设置引脚速率为50MHz*/50MHz*/GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHzGPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;/*/*调用库函数,初始化调用库函数,初始化GPIOC*/GPIOC*/GPIO_Init(GPIOC,&GPIO_InitStructure);GPIO_Init(GPIOC,&GPIO_InitStructure);/关闭关闭ledled灯灯GPIO_SetBits(GPIOC,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);GPIO_SetBits(GPIOC,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);F个函数个函数LED_GPIO_Config()LED_GPIO_Config()实现了所有为点亮实现了所有为点亮ledled的配置的配置led.h#ifndef _LED_H#define _LED_H#include stm32f10 x.h/*the macro definition to trigger the led on or off *1-off *0-on */#define ON 0#define OFF 1/*带参宏,可像内参宏,可像内联函数一函数一样使用使用*/#define LED1(a)if(a)GPIO_SetBits(GPIOC,GPIO_Pin_3);else GPIO_ResetBits(GPIOC,GPIO_Pin_3)led.h续#define LED2(a)if(a)GPIO_SetBits(GPIOC,GPIO_Pin_4);else GPIO_ResetBits(GPIOC,GPIO_Pin_4)#define LED3(a)if(a)GPIO_SetBits(GPIOC,GPIO_Pin_5);else GPIO_ResetBits(GPIOC,GPIO_Pin_5)void LED_GPIO_Config(void);#endif/*_LED_H*/F在编译过程,编译器会把带参宏展开,在相应的位置替换为在编译过程,编译器会把带参宏展开,在相应的位置替换为宏展开代码。宏展开代码。F其中的反斜杠符号其中的反斜杠符号“”叫做续行符叫做续行符,后面,后面不能有空格、注不能有空格、注释等释等ledled用到用到stm32f10 x_gpio.hstm32f10 x_gpio.h库的结构、宏定义库的结构、宏定义F1、GPIO_InitTypeDef结构,引脚初始化的构,引脚初始化的结构构F2 2、GPIO_Pin_x GPIO_Pin_x 引脚为引脚为uint16_tuint16_t类型,宏定义:类型,宏定义:1.#define GPIO_Pin_0(uint16_t)0 x0001)/*!Pin 0 selected*/1.#define GPIO_Pin_0(uint16_t)0 x0001)/*!Pin 0 selected*/2.#define GPIO_Pin_1(uint16_t)0 x0002)/*!Pin 1 selected*/2.#define GPIO_Pin_1(uint16_t)0 x0002)/*!Pin 1 selected*/3.#define GPIO_Pin_2(uint16_t)0 x0004)/*!Pin 2 selected*/3.#define GPIO_Pin_2(uint16_t)0 x0004)/*!Pin 2 selected*/4.#define GPIO_Pin_3(uint16_t)0 x0008)/*!Pin 3 selected*/4.#define GPIO_Pin_3(uint16_t)0 x0008)/*!Pin 3 selected*/F例:例:GPIO_Pin_0 GPIO_Pin_0(0000 0000 0000 00010000 0000 0000 0001)B BF GPIO_Pin_1 GPIO_Pin_1(0000 0000 0000 00100000 0000 0000 0010)B B ledled用到用到stm32f10 x_gpio.hstm32f10 x_gpio.h库的结构、宏定义库的结构、宏定义F3 3、GPIOSpeed_TypeDefGPIOSpeed_TypeDef定义定义GPIOGPIO的输出速率:的输出速率:typedeftypedef enumenum GPIO_Speed_10MHz GPIO_Speed_10MHz=1=1,/,/枚举枚举常量值常量值1 1,对应,对应10MHz 10MHz GPIO_Speed_2MHzGPIO_Speed_2MHz,/,/常量值为常量值为2 2,对应,对应2MHz 2MHz GPIO_Speed_50MHz GPIO_Speed_50MHz /常量值为常量值为3 3,对应,对应50MHz50MHz GPIOSpeed_TypeDefGPIOSpeed_TypeDef;FGPIO_Speed_10MHz 对应(0001)B FGPIO_Speed_2MHz 对应(0010)B FGPIO_Speed_50MHz 对应(0011)BFSpeed控制参数,它的宏展开低控制参数,它的宏展开低2位的位的值,正好符合,正好符合寄存寄存器器MODEy中中2位的控制位的控制值。F直接直接把把这个参数写入个参数写入CRL、CRH配置寄存器的配置寄存器的MODEy位,位,其中其中y由由GPIO_Pin参数参数确定第几引脚。确定第几引脚。ledled用到用到stm32f10 x_gpio.hstm32f10 x_gpio.h库的结构、宏定义库的结构、宏定义4 4、GPIOMode_TypeDefGPIOMode_TypeDef结构定义结构定义GPIOGPIO引脚的功能:引脚的功能:typedef enum typedef enum GPIO_Mode_AIN=0 x0,/GPIO_Mode_AIN=0 x0,/模拟输入模式模拟输入模式 GPIO_Mode_IN_FLOATING=0 x04,/GPIO_Mode_IN_FLOATING=0 x04,/浮空输入模式浮空输入模式 GPIO_Mode_IPD=0 x28,/GPIO_Mode_IPD=0 x28,/下拉输入模式下拉输入模式 GPIO_Mode_IPU=0 x48,/GPIO_Mode_IPU=0 x48,/上拉输入模式上拉输入模式 GPIO_Mode_Out_OD=0 x14,/GPIO_Mode_Out_OD=0 x14,/开漏输出模式开漏输出模式 GPIO_Mode_Out_PP=0 x10,/GPIO_Mode_Out_PP=0 x10,/通用推挽输出模式通用推挽输出模式 GPIO_Mode_AF_OD=0 x1C,/GPIO_Mode_AF_OD=0 x1C,/复用功能开漏输出复用功能开漏输出 GPIO_Mode_AF_PP=0 x18 /GPIO_Mode_AF_PP=0 x18 /复用功能推挽输出复用功能推挽输出 GPIOMode_TypeDef;GPIOMode_TypeDef;用于初始化的库函数用于初始化的库函数GPIO_Init()F通通过查找找库帮助文档帮助文档获得得Error:L6218E:FError:L6218E:Undefined symbol assert_param Error:L6218E:Undefined symbol assert_param(referred from stm32f10 x_gpio.o).(referred from stm32f10 x_gpio.o).F断言机制函数断言机制函数assert_param,STM32STM32的函数:的函数:assert_param(IS_GPIO_ALL_PERIPH(GPIOx);assert_param(IS_GPIO_ALL_PERIPH(GPIOx);F刚开始学习的时候都遇到编译不过去的问题刚开始学习的时候都遇到编译不过去的问题,通过在文通过在文件中添加件中添加USE_STDPERIPH_DRIVERUSE_STDPERIPH_DRIVER来解决的:来解决的:error 65:F创建一个创建一个STM32F103VESTM32F103VE核的项目核的项目Ferror 65:access violation at 0 x40021000:no error 65:access violation at 0 x40021000:no read permissionread permissionF是是DebugDebug里面的设置里面的设置有缺陷,不会自动匹配:有缺陷,不会自动匹配:Dialog DLLDialog DLL:DCM3.DLL ParameterDCM3.DLL Parameter:-pCM3-pC
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服