版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验3——GPIO与流水灯卓越工程师培养系列本书获深圳大学教材出版资助STM32F1开发标准教程01实验内容实验内容以及GPIO功能框图、寄存器和固件库函数,基于STM32核心板设计一个流水灯程序,使得STM32核心板上的两个LED(LED1和LED2)交替闪烁,每个LED的点亮时间和熄灭时间均为500ms。通过学习LED电路原理图、STM32系统架构与存储器组织02实验原理1.LED电路原理图GPIO与流水灯实验涉及的硬件包括两个位于STM32核心板上的LED(LED1和LED2)以及分别与LED1和LED2串联的限流电阻R20和R21,LED1通过3302电阻连接到STM32F103RCT6芯片的PC4引脚,LED2通过3302电阻连接到STM32F103RCT6芯片的PC5引脚,如图4-1所示。PC4为高电平时,LED1点亮,PC4为低电平时,LEDI熄灭;同样,PC5为高电平时,LED2点亮,PC5为低电平时,LED2熄灭。2.STM32系统架构与存储器组织STM32由4个驱动单元和4个被动单元组成4个驱动单元分别是Cortex-M3内核DCode总线、System总线和通用DMA1/DMA2,4个被动单元分别是内部Flash内部SRAM、FSMC和AHB到APB的桥(AHB2APBx。STM32系统框图如图4-2所示。1.STM32系统架构2.STM32系统架构与存储器组织Cortex-M3只有一个单一固定的存储器映射,这一点极大地方便了软件在各种以Cortex-M3为内核的微控制器间的移植。举一个简单的例子,各款基于Cortex-M3内核的微控制器的NVIC和MPU都在相同的位置布设寄存器。尽管如此,Cortex-M3的存储器规定依然是粗线条的,它允许芯片制造商灵活地分配存储器空间,以制造出各具特色的微控制器产品。Cortex-M3的地址空间是4GB,由代码区、片上SRAM区、片上外设区、片外RAM区、片外外设区、内部私有外设总线区、外部私有外设总线区和芯片供应商定义区组成,如图4-3所示。2.STM32存储器映射2.STM32系统架构与存储器组织Cortex-M3代码区的大小是512MB,主要用于存放程序,这个区通过指令总线来访问。STM32的代码区的起始地址为0x08000000,该地址实际上就是内部Flash主存储块的起始地址,STM32核心板上的STM32F103RCT6芯片的内部Flash容量为256KB。Cortex-M3片上SRAM区的大小也是512MB,是用于让芯片制造商映射到片上SRAM的,这个区通过系统总线来访问。STM32片上SRAM区的起始地址为0x20000000,STM32核心板上的STM32F103RCT6芯片的内部SRAM容量为48KB。2.STM32存储器映射2.STM32系统架构与存储器组织Cortex-M3片上外设区的大小同样是512MBSTM32的片上外设地址范围为0x40000000~0x5003FFFF,该片区对应着STM32片上外设寄存器。Cortex-M3片外RAM区和片外外设区的大小都为1GB。如果片内SRAM不够用,就需要在片外增加RAM,这个新增的RAM地址必须在0x60000000~0x9FFFFFFF区间,同样片外外设的地址也必须在0xA0000000~0XDFFFFFFF区间。Cortex-M3私有外设总线分为内部私有外设总线(也称为AHB私有外设总线)和外部私有外设总线(也称为APB私有外设总线),其中,AHB私有外设包括NVIC、FPB、DWT和ITM,APB私有外设包括ROM表、外部PPB、ETM和TPIU。2.STM32存储器映射2.STM32系统架构与存储器组织STM32片上外设包括ADC1、ADC2、USART1、USART2、USART3、UART4、UART5SPI1、SPI2/I2S、SPI3/2S、GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF、GPIOG、TIM1、TIM2、TIM3、TIM4、TIM5、TIM6、TIM7、TIM8、EXTI、AFIO、DAC、PWR、BKP、CAN1CAN2、I2C1、I2C2、IWDG、WWDG和RTC。然而,本书涉及的外设仅有ADC1、USART1、USART2、GPIOA、GPIOB、GPIOC、TIM2、TIM3、TIM4、TIM5、EXTI、AFIO、DAC和IWDG,因此,表4-1仅列出本书涉及的片上外设寄存器组起始地址。3STM32部分片上外设寄存器组起始地址3.GPIO功能框图如输入或输出,所以又被称为GPIO(GeneralPurposeInputOutput,通用输入/输出)而GPIO又被分为GPIOA、GPIOBGPIOC、GPIODGPIOE、GPIOF和GPIOG共7组,每组端口又分为0~15共计16个不同的引脚。对于不同型号的STM32芯片,端口的组数和引脚数不尽相同,读者可以参考相应芯片的数据手册。可以通过GPIO寄存器将STM32的GPIO配置成8种模式这8种模式又分为4种输入模式和4种输出模式。4种输入模式分别为输入浮空、输入上拉、输入下拉和模拟输入,4种输出模式分别为开漏输出、推挽式输出、推挽式复用功能和开漏复用功能。STM32的I/0引脚可以通过寄存器配置为各种不同的功能3.GPIO功能框图图4-4所示的GPIO功能框图是为了便于分析GPIO与流水灯实验。在本实验中,两个LED引脚对应的GPIO配置为推挽输出模式,因此,下面依次介绍输出相关寄存器、输出驱动器和I/0引脚及保护二极管。3.GPIO功能框图输出相关数据寄存器包括端口位设置/清除寄存器(GPIOxBSRR)和端口输出数据寄器(GPIOxODR)。可以通过更改GPIOxODR中的值,达到更改GPIO引脚电平的目的。然而,写GPIOxODR是一次性更改16个引脚的电平,这样就很容易把一些不需要更改的引脚电平更改为非预期值。为了准确修改某一个或某几个引脚的电平,比如要将GPIOXODR0更改为1,将GPIOxODR[14]更改为0可以先读GPIOXODR的值到一个临时变量地址(temp),然后再将temp[0]更改为1,将temp[14]更改为0最后将temp写入GPIOxODR如图4-5所示。1.输出相关寄存器3.GPIO功能框图然而,这种“读-改-写”方式不仅效率低,而且操作繁杂,为了简化操作,提升效率,STM32新增了端口位设置/清除寄存器(GPIOx_BSRR)该存器由16位端口清除位(对应16个引脚,向某一位写入1即可设置GPIOx_ODR对应位为0向某一位写入0GPIOx_ODR对应位不受影响)和16位端口设置位(对应16个引脚向某一位写入1即可设置GPIOX_ODR对应位为1,向某一位写入0,GPIOX_ODR对应位不受影响)组成。同样是将GPIOX_ODR的值由1110001010100010更改为1010001010100011,实际上是将GPIO_ODRO]从0更改为1将GPIOxODRI141从1改为0了GPIOx_BSRR,就只需要GPIOx_BSRR写入01000000000000000000000000000001即可。GPIOxBSRR30为1表示将GPIOx_ODRT14]从1更改为0,GPIOx_BSRR[0]为1表示将GPIOX_ODR0从0更改为1GPIOx_BSRR的其他位为0表示不需要更改其他GPIOx_ODR对应位的值。1.输出相关寄存器3.GPIO功能框图通过GPIOx_BSRR修改GPIOX_ODR的过程如图4-6所示。1.输出相关寄存器3.GPIO功能框图输出驱动器既可以配置为推挽模式,也可以配置为开漏模式。本实验的两个LED均配置为推挽模式,下面对推挽模式的工作机理进行讲解。当输出驱动器的输出控制端为高电平时,经过反向,上方的P-MOS管导通,下方的N-MOS管关闭,I/0引脚对外输出高电平,当输出驱动器的输出控制端为低电平时,经过反向,上方的P-MOS管关闭,下方的N-MOS管导通I/0引脚对外输出低电平。当I/0引脚高、低电平切换时,两个MOS管轮流导通,P-MOS管负责灌电流,N-MOS管负责拉电流使其负载能力和开关速度均比普通方式有较大的提高。推挽输出的低电平大约为0V,高电平大约为3.3V。2.输出驱动器3.GPIO功能框图与I/O引脚相连接的两个二极管称为保护二极管,用于防止引脚过高或过低的外部电压输入。当引脚的外部电压高于VDD时,上方的二极管导通,当引脚电压低于VSS时,下方的二极管导通,从而可以防止不正常的电压引入芯片导致芯片烧毁。3.I/0引脚及保护二极管4.GPIO部分寄存器STM32的GPIO寄存器地址映射和复位值如表4-2所示每个GPIO端口有7个存器,本实验涉及的GPIO寄存器包括2个32位端口配置存器(GPIOx_CRL,GPIOx_CRH)1个32位端口输出数据寄存器(GPIOx_ODR)、1个32位端口位设置/清除寄存器(GPIOx_BSRR)1个32位端口位清除寄存器(GPIOx_BRR)。4.GPIO部分寄存器4.23节已经介绍了STM32的GPIO可以通过存器配置成8种模式每个GPIO端口具体是通过CNFT1:01和MODEF1:01配置为8种模式中的一种的,如表4-3所示。1.端口配置寄存器(GPIOXCRL和GPIOXCRH)4.GPIO部分寄存器STM32的每组GPIO端口有16个引脚,比如GPIOA有GPIOA0~15共16个引脚而每个引脚都需要4bit(分别是CNF[1:01和MODE[1:01)进行输入/输出模式及输出速率的配置因此,每组GPIO端口就需要有64bit。作为32位微控制器,STM32安排了两组寄存器,分别是端口配置低寄存(GPIOxCRL)和端口配置高存器(GPIOxCRH)分别如图4-7和图4-8所示。GPIOxCRL常常简称为CRL,GPIOXCRH常常简称为CRH。1.端口配置寄存器(GPIOXCRL和GPIOXCRH)4.GPIO部分寄存器大家可能会问:为什么图4-7和图4-8只标注了偏移地址,而没有标注绝对地址?因为STM32最多有7组GPIO端口,即GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF和GPIOG(又称PA、PB、PC、PD、PE、PF和PG)。如果标注绝对地址,就需要将每组端口的CRL和CRH全部罗列出来,既没有意义,也没有必要。通过偏移地址计算绝对地址也非常简单,比如,要计算GPIOC端口CRH的绝对地址。可以先查看GPIOC的起始地址,从图4-9可以确定GPIOC的起始地址为0x40011000,CRH的偏移地址为0x04,因此GPIOC的CRH的绝对地址通过计算,即0x40011000+0x04,就可以得出为0x40011004。1.端口配置寄存器(GPIOXCRL和GPIOXCRH)4.GPIO部分寄存器又比如要计算GPIOD端口ODR的绝对地址可以先查看GPIOD的起始地址从图4-9可以确定GPIOD的起始地址为0x40011400,ODR的偏移地址为0x0C,因此,GPIOD的ODR的绝对地址通过计算,即0x40011400+0x0C,就可以得出为0x4001140C。1.端口配置寄存器(GPIOXCRL和GPIOXCRH)4.GPIO部分寄存器CRL和CRH用于控制GPIO端口的输入/输出模式及输出速度CRL用于控制GPIO端口(A~G)低8位的输入/输出模式及输出速度,CRH用于控制GPIO端口(A~G)高8位的输入/输出模式及输出速度每个GPIO端口的引脚占用CRL或CRH的4位高两位为CNF[1:0],低两位为MODET1:01CNFT1:01和MODET1:0的解释说明如表4-4所示。从图4-7和图4-8可以看到,这两个寄存器的复位值均为0x44444444,即CNF[1:0]为01,MODET1:01为00,从表4-4可以得出这样的结论,即STM32复位后所有引脚配置为浮空输入模式。2.端口输出数据寄存器(GPIOxODR)4.GPIO部分寄存器GPIOx_BSRR用于设置GPIO端口的输出位为0或1该寄存器和ODR有着类似的功能都可以用来设置GPIO端口的输出位为0或1GPIOx_BSRR的结构、偏移地址和复位值以及各个位的解释说明如图4-11和表4-6所示。GPIOx_BSRR也常常简称为BSRR。3.端口位设置/清除寄存器(GPIOXBSRR)4.GPIO部分寄存器既可以通过BSRR将GPIO端口的输出位设置为0或1,也可以通过ODR将GPIO端口的输出位设置为0或1。那这两种寄存器到底有什么区别?下面以4个实例进行说明。3.端口位设置/清除寄存器(GPIOXBSRR)4.GPIO部分寄存器GPIOxBRR用于设置GPIO端口的输出位为0GPIOxBRR的结构偏移地址和复位值,以及部分位的解释说明如图4-12和表-7所示。GPIOxBRR也常常简称为BRR。4.端口位清除寄存器(GPIOXBRR)5.GPIO部分固件库函数GPIO_Init函数的功能是设定A、B、C、DEFG端口的任一个引脚的输入/输出的配置信息,通过向GPIOx→CRL或GPIOX→CRH写入参数来实现,同时,该函数还可以按需要初始化STM32的0口状态,通过向GPIOx→BRR或GPIO→BSRR写入参数来实现具体描述如表4-8所示。1.GPI_OInit5.GPIO部分固件库函数GPIO_InitTypeDef结构体定义在stm32f10x_gpio.h文件中,内容如下:1.GPI_OInit5.GPIO部分固件库函数(1)参数GPIO_Pin用于选择待设置的GPIO引脚号可取值如表4-9所示还可以使用“|”操作符选择多个引脚,如GPIO_Pn0|GPIO_Pin1。1.GPI_OInit5.GPIO部分固件库函数(2)参数GPIO_Speed用于设置选中引脚的速度,可取值如表4-10所示。1.GPI_OInit5.GPIO部分固件库函数(3)参数GPIO_Mode用于设置选中引脚的工作状态,可取值如表4-11所示。1.GPI_OInit5.GPIO部分固件库函数GPIO_WriteBit函数的功能是设置或清除所选定端口的特定位通过向GPIOx→BSRR或GPIOx→BRR写入参数来实现。具体描述如表4-12所示。2.GPIO_WriteBit5.GPIO部分固件库函数GPIO_ReadOutputDataBit函数的功能是读取指定外设端口的指定引脚的输出值,通过读GPIOx→ODR来实现。具体描述如表4-13所示。3.GPIO_ReadOutputDataBit6.RCC部分寄存器本实验涉及的RCC寄存器只有APB2外设时钟使能存器(RCCAPB2ENR),该寄存器的结构、偏移地址和复位值如图4-13所示,部分位的解释说明如表4-14所示。本章只对该寄存器进行简单介绍,第9章将对RCC进行详细讲解。7.RCC部分固件库函数本实验涉及的RCC固件库函数包括RCC_APB2PeriphClockCmd。该函数在stm32f10x_rcch文件中声明,在stm32f10x_rcc.c文件中实现。RCC_APB2PeriphClockCmd函数的功能是打开或关闭APB2上相应外设的时钟,通过向RCC→APB2ENR写入参数来实现。具体描述如表4-15所示。7.RCC部分固件库函数参数RCC_APB2Periph为被控的APB2外设时钟可取值如表4-16所示还可以使用“|”操作符使能多个APB2外设时钟,如RCC_APB2Periph_GPIOA|JRCC_APB2Periph_GPIOC。03实验步骤步骤1:首先,将“D:STM32KeilTest\Material\03.GPIO与流水灯实验”文件夹复制到“D:STM32KeilTestProduct”文件夹中。然后,双击运行“D:STM32KeilTestProduct\03.GPIO与流水灯实验Project”文件夹中的STM32KeilPrjuvprojx,单击工具栏中的圈按钮。当BuildOutput栏出现FromELF:creatinghexfile时表示已经成功生成hex文件出现0Error(s),0Warning(s)表示编译成功。最后,将axf文件下载到STM32的内部Flash,打开串口助手,观察是否每秒输出一次ThisisthefirstSTM32F103Project,byZhangsan。本实验实现的是两个LED交替闪烁功能,因此,Material提供的“03.GPIO与流水灯实验”工程中的LED模块是空白的,STM32核心板上不会出现两个LED交替闪烁的现象。如果串口正常输出字符串,表示原始工程是正确的,接着就可以进入下一步操作。复制并编译原始工程步骤2:首先,将“D:\STM32KeilTestProduct03GPIO与流水灯实验AppLED”文件夹中的LEDc添加到App分组具体操作可参见2.3节步骤8。然后将D:STM32KeilTestProduct03.GPIO与流水灯实验AppLED”路径添加到IncludePaths栏,具体操作可参见2.3节步11。添加LED文件对步骤3:完成LED文件对添加之后,就可以在LED.c文件中添加包含LED.h头文件的代码了,如图4-14所示。完善LED.h文件步骤3:具体做法:①在Project面板中,双击打开LED.c文件;②根据实际情况完善模块信息;③在LED.c文件的“包含头文件”区,添加代码#include"LED.h";④单击按钮进行编译;⑤编译结束后,BuildOutput栏出现0Errors)0Warming(s)表示编译成功;⑥LED.c目录下会出现LED.h,表示成功包含LED.h头文件。建议每次进行代码更新或修改之后,都进行一次编译,这样可以及时定位到问题。完善LED.h文件步骤3:完成在LED.c文件中添加代码#include“LED.h"之后,就可以添加防止重编译处理代码了,如图4-15所示。完善LED.h文件步骤3:具体做法:①在Project面板中,展开LED.c;②双击LEDc下的LEDh;③根据实际情况完善模块信息;④在打开的LED文件中,添加防止重编译处理代码;⑤添加完防止重编译处理代码之后,单击工具栏中的西按钮进行编译;⑥编译结束后,BuildOutput栏出现0Error(s),0Warning(s)表示编译成功。。完善LED.h文件步骤3:在LEDh文件的“包含头文件”区,添加代码#include"DataTypeh"。LEDc包含了LEDh,而LED.h又包含了DataType.h,因此,相当于LEDc也包含了DataType.h,在LED.c中使用DataType.h中的宏定义等,就不需要再重复包含头文件DataType.h了。DataType.h文件主要是一些宏定义,如程序清单4-1所示。第一部分是一些常用数据类型的缩写替换,比如unsignedchar用u8替换这样在进行代码编写时,就不用输入unsignedchar,而是直接使用u8,可以提高代码输入效率。第二部分是字节、半字和字的组合以及拆分操作,这些操作在代码编写过程中使用非常频繁,比如求一个半字的高字节,正常操作是(BYTE)(((WORD)(hw)>8)&0xFF)),而使用HBYTE(w)就显得既简洁又明了。完善LED.h文件步骤3:第三部分是一些布尔数据、空数据以及无效数据定义,比如TRUE实际上是1,FALSE实际上是0而无效数据INVALIDDATA实际上是-100。完善LED.h文件步骤3:在LEDh文件的“API函数声明”区,添加如序清单4-2所示的API函数声明代码。InitLED函数主要是初始化LED模块。每个模块都有模块初始化函数,而且,在使用前,要先在Mainc的InitHardware或InitSoftware函数中通过调用模块初始化函数的代码进行模块初始化,硬件相关的模块在IitHardware函数中初始化,软件相关的模块在IitSoftware函数中初始化。LEDFlicker函数实现的是STM32核心板上的LEDI和LED2的电平翻转。完善LED.h文件步骤4:在LED.c文件的“包含头文件”区的最后,添加代码#include"stm32f10x_gpio.h”。stm32f10x_gpio为STM32的GPIO的固件库头文件,LED块主要是对GPIO相关的寄存器进行操作,包含了stm32f10x_gpioh,就可以使用GPIO的固件库函数对GPIO相关的寄存器进行间接操作了。stm32f10xconfh中包含了各种固件库头文件,当然,也包含了stm32f10x_gpio.h,因此也可以在LEDc文件的“包含头文件”区的最后,添加代码#include"stm32f10x_conf.h"。完善LED.c文件步骤4:在LED.c文件的“内部函数声明”区,添加内部函数的声明代码,如程序清单4-3所示本书规定,所有的内部函数都必须在“内部函数声明”区声明,且无论是内部函数的声明还是实现,都必须加static关键字,表示该函数只能在其所在文件的内部调用。完善LED.c文件步骤4:在LED.c文件的“内部函数实现”区,添加ConfigLEDGPIO函数的实现代码,如程序清单4-4所示。下面按照顺序对ConfgLEDGPIO函数中的语句进行解释说明。(1)STM32核心板的LED1和LED2分别与STM32F103RCT6芯片的PC4和PC5相连接,因此需要通过RCCAPB2PeriphClockCmd函数使能GPIOC时钟该函数涉及APB2ENR的IOPCEN,IOPCEN用于使能GPIOC的时钟,可参见图4-13和表4-14。(2)通过GPIOIit函数将PC4和PC5配置为推挽输出模式,并将两个IO的最大输出速度配置为50MHz。该函数涉及GPIOxCRL、GPIOxBSRR
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026事业单位工勤技能-浙江-浙江水利机械运行维护工五级(初级工)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-河北-河北保健按摩师二级(技师)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-山东-山东无损探伤工五级(初级工)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-云南-云南环境监测工五级(初级工)历年参考题库含答案详解3套试卷
- 2026年10月重阳节知识课堂 重阳节文化课堂
- 2026年秋季开学消防安全知识宣讲课件
- 2026年秋季开学初三告别拖延学法指导课件
- 2025年河北省沙河市《行测》考试笔试题库带答案详解(培优)
- 2025年山东省寿光市《行测》考试备考题库(B卷)附答案详解
- (2026)三级医院评审筹备与标准化建设专项工作总结(3篇)
- 2026学年湖北省武汉市四年级数学期末深度自测重点试卷(详细参考解析)详细答案和解析
- 2026年甘肃金麟锂电新材料有限公司招聘78人笔试备考题库及答案详解
- 公司车辆使用管理制度文档模板
- 2026年全国导游基础知识真题卷及答案(共二十套)
- 2026年中央安全生产考核巡查组问题通报(2026年更新)
- 航天禁(限)用工艺目录(2021版)-发文稿(公开)
- 医学影像学-头颈部
- GB/T 41819-2022信息安全技术人脸识别数据安全要求
- 中医学课件气血津液
- 宝钢高炉炼铁工艺介绍201607
- 《车辆工程专业导论》全套教学课件
评论
0/150
提交评论