1、第章时钟与设计第第8章章 STM32时钟与时钟与GPIO设计设计F8.1 8.1 时钟设置与开启外设时钟时钟设置与开启外设时钟 F8.2 GPIO8.2 GPIO简介简介F8.3 GPIO8.3 GPIO端口配置存放器端口配置存放器F8.4 stm32f10 x.h8.4 stm32f10 x.h库中库中GPIOGPIO代码剖析代码剖析F8.6 GPIO8.6 GPIO控制控制LEDLED灯实验灯实验8.1 系统时钟配置与外设时钟开启F在在startup_stm32f10 x_hd.sstartup_stm32f10 x_hd.s启动文件中,调用启动文件中,调用_main_main函数之前函数
2、之前先调用了先调用了SystemInit()SystemInit()初始化函数,其中系统时钟初始化函数,其中系统时钟SYSCLKSYSCLK设置:设置:时钟源、倍频、分频等控制参数。时钟源、倍频、分频等控制参数。FSystemInit()SystemInit()定义在定义在system_stm32f10 x.csystem_stm32f10 x.c文件中,其他的配文件中,其他的配置主要在置主要在stm32f10 x_rcc.cstm32f10 x_rcc.c中。中。F使用外设时,配置初始化后,必须也要开启外设时钟。使用外设时,配置初始化后,必须也要开启外设时钟。时钟设置解析F系统时钟系统时钟S
3、YSCLKSYSCLK是是SystemInit()SystemInit()先将配置时钟相关的存放器都复先将配置时钟相关的存放器都复位为默认值,再调用位为默认值,再调用SetSysClock()SetSysClock()选择使用频率,而具体设置是选择使用频率,而具体设置是通过宏定义设置的。通过宏定义设置的。F函数调用顺序:函数调用顺序:启动文件启动文件 SystemInit()SystemInit()SetSysClockSetSysClock()()SetSysClockTo72()SetSysClockTo72()。1、SystemInit()FSTM32STM32时钟系统的时钟系统的Sys
4、temInit()SystemInit()中设置:中设置:FSYSCLKSYSCLK系统时钟系统时钟=72MHz=72MHzFAHBAHB总线时钟总线时钟(使用使用SYSCLK)=72MHzSYSCLK)=72MHzFAPB1APB1总线时钟总线时钟(PCLK1)=36MHz(PCLK1)=36MHzFAPB2APB2总线时钟总线时钟(PCLK2)=72MHz(PCLK2)=72MHzFPLLPLL时钟时钟=72MHz=72MHzF用到的用到的RCCRCC存放器复位值:存放器复位值:FRCC_CR =0 x0000 xx83;RCC_CR =0 x0000 xx83;FRCC_CFGR =0
5、x0000 0000RCC_CFGR =0 x0000 0000;FRCC_CIR =0 x0000 0000;RCC_CIR =0 x0000 0000;FRCC_CFGR2=0 x0000 0000;RCC_CFGR2=0 x0000 0000;F F这些这些RCCRCC时钟存放器组名的宏定义与其他外设存放器名定义都在时钟存放器组名的宏定义与其他外设存放器名定义都在stm32f10 x.hstm32f10 x.h文件中。文件中。RCC时钟存放器组在stm32f10 x.h中的定义typedef structtypedef struct _IO uint32_t CR;_IO uint32_
6、t CR;_IO uint32_t CFGR;_IO uint32_t CFGR;_IO uint32_t CIR;_IO uint32_t CIR;_IO uint32_t APB2RSTR;_IO uint32_t APB2RSTR;_IO uint32_t APB1RSTR;_IO uint32_t APB1RSTR;_IO uint32_t AHBENR;_IO uint32_t AHBENR;_IO uint32_t APB2ENR;_IO uint32_t APB2ENR;_IO uint32_t APB1ENR;_IO uint32_t APB1ENR;_IO uint32_t
7、BDCR;_IO uint32_t BDCR;_IO uint32_t CSR;_IO uint32_t CSR;#ifdef STM32F10X_CL#ifdef STM32F10X_CL _IO uint32_t AHBRSTR;_IO uint32_t AHBRSTR;_IO uint32_t CFGR2;_IO uint32_t CFGR2;#endif/#endif/*STM32F10X_CL STM32F10X_CL*/#if defined#if defined(STM32F10X_LD_VL)|defined(STM32F10X_MD_VL)|defined(STM32F10X
8、_HD_VL)(STM32F10X_LD_VL)|defined(STM32F10X_MD_VL)|defined(STM32F10X_HD_VL)uint32_t RESERVED0;uint32_t RESERVED0;_IO uint32_t CFGR2;_IO uint32_t CFGR2;#endif/#endif/*STM32F10X_LD_VL|STM32F10X_MD_VL|STM32F10X_HD_VL STM32F10X_LD_VL|STM32F10X_MD_VL|STM32F10X_HD_VL*/RCC_TypeDef;RCC_TypeDef;F_IO _IO 宏定义宏定
9、义core_cm3.hcore_cm3.h中:中:F#define#define_IO_IOvolatilevolatile;Fvolatile,volatile,易变的易变的,用变量时需到原地用变量时需到原地址重新存取。址重新存取。F uint32_t uint32_t定义在定义在stdin.hstdin.h里。里。F typedef unsigned int uint32_t;typedef unsigned int uint32_t;F知道了结构体首地址就确定知道了结构体首地址就确定RCCRCC存放器存放器组所有组所有3232位存放器的地址,位存放器的地址,0 x040 x04正好正好是
10、地址偏移量,所以把连续的存放器是地址偏移量,所以把连续的存放器组定义为结构。组定义为结构。2、SetSysClock()函数如下此函数中选择调用确定使用频率的函数。此函数中选择调用确定使用频率的函数。Fstatic void SetSysClock(void)static void SetSysClock(void)#ifdef SYSCLK_FREQ_HSE#ifdef SYSCLK_FREQ_HSE SetSysClockToHSE();SetSysClockToHSE();#elif defined SYSCLK_FREQ_24MHz#elif defined SYSCLK_FREQ_2
11、4MHz SetSysClockTo24();SetSysClockTo24();#elif defined SYSCLK_FREQ_36MHz#elif defined SYSCLK_FREQ_36MHz SetSysClockTo36();SetSysClockTo36();#elif defined SYSCLK_FREQ_48MHz#elif defined SYSCLK_FREQ_48MHz SetSysClockTo48();SetSysClockTo48();#elif defined SYSCLK_FREQ_56MHz#elif defined SYSCLK_FREQ_56MH
12、z SetSysClockTo56();SetSysClockTo56();#elif defined SYSCLK_FREQ_72MHz/#elif defined SYSCLK_FREQ_72MHz/使用此项使用此项 SetSysClockTo72();SetSysClockTo72();#endif#endif3、SetSysClockTo72()函数函数F各个各个SetSysClockToXX(void)SetSysClockToXX(void)函数,配置了具体的系统时钟函数,配置了具体的系统时钟,PLL,PLL倍频倍频以及分频系数。采用存放器直接配置方式,如:以及分频系数。采用存放器
13、直接配置方式,如:Fstatic void SetSysClockTo72(void)static void SetSysClockTo72(void)F _IO uint32_t StartUpCounter=0,HSEStatus=0;_IO uint32_t StartUpCounter=0,HSEStatus=0;F /*SYSCLK,HCLK,PCLK2 and PCLK1 configuration SYSCLK,HCLK,PCLK2 and PCLK1 configuration*/F /*Enable HSE Enable HSE*/F RCC-CR|=(uint32_t)RC
14、C_CR_HSEON);RCC-CR|=(uint32_t)RCC_CR_HSEON);F do doF F HSEStatus=RCC-CR&RCC_CR_HSERDY;HSEStatus=RCC-CR&RCC_CR_HSERDY;F StartUpCounter+;StartUpCounter+;F while(HSEStatus=0)&(StartUpCounter!=while(HSEStatus=0)&(StartUpCounter!=HSE_STARTUP_TIMEOUT);HSE_STARTUP_TIMEOUT);F F欲深入分析时钟配置,就仔细阅读这些最底层的库函数!欲深入分析
15、时钟配置,就仔细阅读这些最底层的库函数!开启关闭外设时钟F外设都是挂在外设都是挂在AHBAHB、APB1APB1、APB2APB2总线上,要想使用某个外设,必总线上,要想使用某个外设,必须初始化外设后,再开启使用开启外设的时钟,不用时再关闭外设须初始化外设后,再开启使用开启外设的时钟,不用时再关闭外设时钟时钟,从而降低从而降低STM32STM32的整体功耗。的整体功耗。Fstm32f10 x_rcc.cstm32f10 x_rcc.c文件中有开启和关闭外设时钟的库函数,文件中有开启和关闭外设时钟的库函数,如下:如下:FRCC_AHBPeriphClockCmdRCC_AHBPeriphCloc
16、kCmd(外设名,外设名,ENABLEENABLE|DISABLEDISABLE)挂在挂在AHBAHB总线外设的开启与关闭函数,总线外设的开启与关闭函数,ENABLEENABLE开启,开启,DISABLEDISABLE关闭外设时钟;关闭外设时钟;FRCC_APB1PeriphClockCmdRCC_APB1PeriphClockCmd(外设名,外设名,ENABLEENABLE|DISABLEDISABLE)挂在挂在APB1APB1总线外设的开启与关闭函数;总线外设的开启与关闭函数;FRCC_APB2PeriphClockCmdRCC_APB2PeriphClockCmd(外设名,外设名,ENA
17、BLEENABLE|DISABLEDISABLE)挂在挂在APB2APB2总线外设的开启与关闭函数;总线外设的开启与关闭函数;挂载在AHB的外设名Fstm32f10 x_rcc.hstm32f10 x_rcc.h中对外设名进行了宏定义中对外设名进行了宏定义,看名即知设备。看名即知设备。F#define RCC_AHBPeriph_DMA1 (uint32_t)0 x00000001)#define RCC_AHBPeriph_DMA1 (uint32_t)0 x00000001)F#define RCC_AHBPeriph_DMA2 (uint32_t)0 x00000002)#define
18、RCC_AHBPeriph_DMA2 (uint32_t)0 x00000002)F#define RCC_AHBPeriph_SRAM (uint32_t)0 x00000004)#define RCC_AHBPeriph_SRAM (uint32_t)0 x00000004)F#define RCC_AHBPeriph_FLITF (uint32_t)0 x00000010)#define RCC_AHBPeriph_FLITF (uint32_t)0 x00000010)F#define RCC_AHBPeriph_CRC (uint32_t)0 x00000040)#define RC
19、C_AHBPeriph_CRC (uint32_t)0 x00000040)F#define RCC_AHBPeriph_FSMC (uint32_t)0 x00000100)#define RCC_AHBPeriph_FSMC (uint32_t)0 x00000100)F#define RCC_AHBPeriph_SDIO (uint32_t)0 x00000400)#define RCC_AHBPeriph_SDIO (uint32_t)0 x00000400)F#define RCC_AHBPeriph_OTG_FS (uint32_t)0 x00001000)#define RCC_
20、AHBPeriph_OTG_FS (uint32_t)0 x00001000)F#define RCC_AHBPeriph_ETH_MAC (uint32_t)0 x00004000)#define RCC_AHBPeriph_ETH_MAC (uint32_t)0 x00004000)F#define RCC_AHBPeriph_ETH_MAC_Tx (uint32_t)0 x00008000)#define RCC_AHBPeriph_ETH_MAC_Tx (uint32_t)0 x00008000)F#define RCC_AHBPeriph_ETH_MAC_Rx (uint32_t)0
21、 x00010000)#define RCC_AHBPeriph_ETH_MAC_Rx (uint32_t)0 x00010000)挂载在APB2上的外设名F#define RCC_APB2Periph_AFIO (uint32_t)0 x00000001)#define RCC_APB2Periph_AFIO (uint32_t)0 x00000001)F#define RCC_APB2Periph_GPIO#define RCC_APB2Periph_GPIOA A (uint32_t)0 x00000004)(uint32_t)0 x00000004)F#define RCC_APB2P
22、eriph_GPIO#define RCC_APB2Periph_GPIOB B (uint32_t)0 x00000008)(uint32_t)0 x00000008)F F#define RCC_APB2Periph_GPIO#define RCC_APB2Periph_GPIOG G (uint32_t)0 x00000100)(uint32_t)0 x00000100)F#define RCC_APB2Periph_ADC1 (uint32_t)0 x00000200)#define RCC_APB2Periph_ADC1 (uint32_t)0 x00000200)F#define
23、RCC_APB2Periph_ADC2 (uint32_t)0 x00000400)#define RCC_APB2Periph_ADC2 (uint32_t)0 x00000400)F#define RCC_APB2Periph_TIM1 (uint32_t)0 x00000800)#define RCC_APB2Periph_TIM1 (uint32_t)0 x00000800)F#define RCC_APB2Periph_SPI1 (uint32_t)0 x00001000)#define RCC_APB2Periph_SPI1 (uint32_t)0 x00001000)F#defi
24、ne RCC_APB2Periph_TIM8 (uint32_t)0 x00002000)#define RCC_APB2Periph_TIM8 (uint32_t)0 x00002000)F#define RCC_APB2Periph_USART1 (uint32_t)0 x00004000)#define RCC_APB2Periph_USART1 (uint32_t)0 x00004000)F#define RCC_APB2Periph_ADC3 (uint32_t)0 x00008000)#define RCC_APB2Periph_ADC3 (uint32_t)0 x00008000
25、)F#define RCC_APB2Periph_TIM15 (uint32_t)0 x00010000)#define RCC_APB2Periph_TIM15 (uint32_t)0 x00010000)F#define RCC_APB2Periph_TIM16 (uint32_t)0 x00020000)#define RCC_APB2Periph_TIM16 (uint32_t)0 x00020000)F#define RCC_APB2Periph_TIM17 (uint32_t)0 x00040000)#define RCC_APB2Periph_TIM17 (uint32_t)0
26、x00040000)F#define RCC_APB2Periph_TIM9 (uint32_t)0 x00080000)#define RCC_APB2Periph_TIM9 (uint32_t)0 x00080000)F#define RCC_APB2Periph_TIM10 (uint32_t)0 x00100000)#define RCC_APB2Periph_TIM10 (uint32_t)0 x00100000)F#define RCC_APB2Periph_TIM11 (uint32_t)0 x00200000)#define RCC_APB2Periph_TIM11 (uint
27、32_t)0 x00200000)挂载在APB1上的外设名F#define RCC_APB1Periph_TIM#define RCC_APB1Periph_TIM2 2 (uint32_t)0 x00000001)(uint32_t)0 x00000001)F#define RCC_APB1Periph_TIM#define RCC_APB1Periph_TIM3 3 (uint32_t)0 x00000002)(uint32_t)0 x00000002)F F#define RCC_APB1Periph_TIM#define RCC_APB1Periph_TIM14 14 (uint32_
28、t)0 x00000100)(uint32_t)0 x00000100)F#define RCC_APB1Periph_WWDG (uint32_t)0 x00000800)#define RCC_APB1Periph_WWDG (uint32_t)0 x00000800)F#define RCC_APB1Periph_SPI2 (uint32_t)0 x00004000)#define RCC_APB1Periph_SPI2 (uint32_t)0 x00004000)F#define RCC_APB1Periph_SPI3 (uint32_t)0 x00008000)#define RCC
29、_APB1Periph_SPI3 (uint32_t)0 x00008000)F#define RCC_APB1Periph_USART2 (uint32_t)0 x00020000)#define RCC_APB1Periph_USART2 (uint32_t)0 x00020000)F#define RCC_APB1Periph_USART3 (uint32_t)0 x00040000)#define RCC_APB1Periph_USART3 (uint32_t)0 x00040000)F#define RCC_APB1Periph_UART4 (uint32_t)0 x00080000
30、)#define RCC_APB1Periph_UART4 (uint32_t)0 x00080000)F#define RCC_APB1Periph_UART5 (uint32_t)0 x00100000)#define RCC_APB1Periph_UART5 (uint32_t)0 x00100000)F#define RCC_APB1Periph_I2C1 (uint32_t)0 x00200000)#define RCC_APB1Periph_I2C1 (uint32_t)0 x00200000)F#define RCC_APB1Periph_I2C2 (uint32_t)0 x00
31、400000)#define RCC_APB1Periph_I2C2 (uint32_t)0 x00400000)F#define RCC_APB1Periph_USB (uint32_t)0 x00800000)#define RCC_APB1Periph_USB (uint32_t)0 x00800000)F#define RCC_APB1Periph_CAN1 (uint32_t)0 x02000000)#define RCC_APB1Periph_CAN1 (uint32_t)0 x02000000)F#define RCC_APB1Periph_CAN2 (uint32_t)0 x0
32、4000000)#define RCC_APB1Periph_CAN2 (uint32_t)0 x04000000)F#define RCC_APB1Periph_BKP (uint32_t)0 x08000000)#define RCC_APB1Periph_BKP (uint32_t)0 x08000000)F#define RCC_APB1Periph_PWR (uint32_t)0 x10000000)#define RCC_APB1Periph_PWR (uint32_t)0 x10000000)F#define RCC_APB1Periph_DAC (uint32_t)0 x200
33、00000)#define RCC_APB1Periph_DAC (uint32_t)0 x20000000)F#define RCC_APB1Periph_CEC (uint32_t)0 x40000000)#define RCC_APB1Periph_CEC (uint32_t)0 x40000000)开启外设时钟举例:FGPIOGPIO的的C C口挂在口挂在APB2APB2总线,所用的时钟总线,所用的时钟PCLK2PCLK2为为72MHz72MHz。开启。开启GPIOCGPIOC外设时钟:外设时钟:F RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC
34、,ENABLE)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE)F如用到如用到I/OI/O引脚复用功能,还要开启其复用功能时钟。如引脚复用功能,还要开启其复用功能时钟。如GPIOCGPIOC的的Pin4Pin4还可作为还可作为ADC1ADC1的输入引脚,把它作为的输入引脚,把它作为ADC1ADC1来用,除开启来用,除开启GPIOCGPIOC时钟,还要开启时钟,还要开启ADC1ADC1时钟:时钟:F RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE)RCC_APB2PeriphClockCm
35、d(RCC_APB2Periph_GPIOC,ENABLE)F RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE)RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE)F开启关闭外设时钟的三个函数,内部对外设时钟的使能存放器开启关闭外设时钟的三个函数,内部对外设时钟的使能存放器操作,到达开启和关闭的目的。操作,到达开启和关闭的目的。8.2 GPIO简介FGPIOGeneralPurposeI/O通用型输入通用型输入/输出,主要用于需输出,主要用于需要用到数字量输入要用到数字量输入/输出的场合。输出的
36、场合。F如:如:F继电器、继电器、LED、蜂鸣器等的控制;、蜂鸣器等的控制;F传感器状态、上下电平等信息的输入等。传感器状态、上下电平等信息的输入等。F管脚可承受最大管脚可承受最大5V的输入电压,电流为的输入电压,电流为4mA,短时间极限值,短时间极限值40mA;F。GPIO简介FGPIOGPIO引脚又被分为引脚又被分为GPIOAGPIOA、GPIOBGPIOGGPIOBGPIOG不同的组,每组端不同的组,每组端口分为口分为015015,共,共1616个引脚,不同芯片的端口组数不同。个引脚,不同芯片的端口组数不同。GPIOGPIO结构图:结构图:端口配置存放器GPIO简介FI/OI/O引脚可通
37、过端口配置存放器设置成不同的功能。引脚可通过端口配置存放器设置成不同的功能。F四种输入模式图上半局部:四种输入模式图上半局部:F上拉输入与下拉输入:与上拉输入与下拉输入:与VDDVDD相连的为上拉电阻,与相连的为上拉电阻,与VSSVSS相连的为相连的为下拉电阻。再经施密特触发器就把信号转化为下拉电阻。再经施密特触发器就把信号转化为0 0、1 1存储在输入数存储在输入数据存放器。据存放器。F浮空输入:不接上拉与下拉电阻,直接由触发器输入,由于浮空输入:不接上拉与下拉电阻,直接由触发器输入,由于其输入阻抗较大,一般把这种模式用于标准的通讯协议如其输入阻抗较大,一般把这种模式用于标准的通讯协议如I2
38、CI2C、USARTUSART的接收端。的接收端。F模拟输入:把电压信号直接传送到片上外设模块,如模拟输入:把电压信号直接传送到片上外设模块,如ADCADCGPIO简介F推挽输出模式:输出推挽输出模式:输出1 1时时P-MOSP-MOS导通输出高电平导通输出高电平1 1,0 0时时N-MOSN-MOS管导管导通输出低电平通输出低电平0 0。F开漏输出模式:开漏输出模式:只有只有N-MOSN-MOS管管,外部需接上拉电阻,输出,外部需接上拉电阻,输出0 0时导时导通,为低电平通,为低电平0 0;输出;输出1 1时截止,为高阻状态。时截止,为高阻状态。F复用功能的推挽式输出模式。复用功能的推挽式输
39、出模式。F复用功能的开漏输出模式。复用功能的开漏输出模式。一只三极管放大信号正半周,另一只放大负半周,故称推挽放大器四种输出模式(图下半局部):GPIO简介 STM32P0.xP2.xF GPIOGPIO都可配置为中断功能,并可设置为上升沿、下降沿或都可配置为中断功能,并可设置为上升沿、下降沿或边沿触发。边沿触发。上升沿中断下降沿中断 边沿中断 GPIO中断还具有掉电唤醒功能8.3 GPIO端口配置存放器F1 1、端口配置低存放器、端口配置低存放器GPIOx_CRL(GPIOx_CRL(配置配置0707引脚引脚)Fx=AGx=AG,芯片的,芯片的GPIOGPIO端口。端口。FPIOx_CRLP
40、IOx_CRL地址偏移量:地址偏移量:0 x00h0 x00h,复位值:,复位值:0 x4444 44440 x4444 4444F第第y y个引脚的模式由存放器的个引脚的模式由存放器的4 4个位控制,个位控制,MODEy1:0MODEy1:0引脚模式位引脚模式位,CNFy1:0CNFy1:0引脚配置位。可配置为引脚配置位。可配置为4 4种输入、种输入、4 4种输出模式。种输出模式。RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE)DLL Parameter:-pSTM32F103VE#define RCC_APB1Periph_CEC (u
41、int32_t)0 x40000000)4、端口输出数据存放器GPIOx_ODR1、GPIO_InitTypeDef结构,引脚初始化的结构#define RCC_AHBPeriph_ETH_MAC_Rx (uint32_t)0 x00010000)G),读该存放器可看某个IO口的输入状态。如GPIOC的Pin4还可作为ADC1的输入引脚,把它作为ADC1来用,除开启GPIOC时钟,还要开启ADC1时钟:#define GPIOC_BASE(APB2PERIPH_BASE+0 x1000)4 stm32f10 x.LED实验中用到了RCC跟GPIO这两个外设。_IO uint32_t BSRR;
42、GPIO_Mode_AF_PP=0 x18 /复用功能推挽输出答:那么把x端口第15个引脚的模式配置成了:输出的最大速度为50MHz的 通用推挽输出模式。欲深入分析时钟配置,就仔细阅读这些最底层的库函数!#define RCC_APB1Periph_BKP (uint32_t)0 x08000000)IDRy15:0(y=015)每个位对应I/O口的输入状态。GPIO端口配置存放器FCNFy1:0CNFy1:0:端口:端口y y配置位配置位F输入模式输入模式(MODE1:0=00)(MODE1:0=00):F0000:模拟输入:模拟输入F0101:浮空输入:浮空输入(复位默认值复位默认值)F1
43、010:上拉:上拉/下拉输入下拉输入F1111:保存:保存F输出模式输出模式(MODE1:000)(MODE1:000):F0000:通用推挽输出:通用推挽输出F0101:通用开漏输出:通用开漏输出F1010:复用功能推挽输出:复用功能推挽输出F1111:复用功能开漏输出:复用功能开漏输出FMODEy1:0MODEy1:0:端口:端口y y模式位模式位F输入模式输入模式 0000:复位默认值:复位默认值F输出模式输出模式 0101:最大速度:最大速度10MHz10MHz 1010:最大速度:最大速度2MHz2MHz 1111:最大速度:最大速度50MHz50MHzPIOx_CRL复位值4444
44、 4444h,即CNFy1:001、MODEy1:000,复位后端口配置为什么口?2、端口配置高存放器GPIOx_CRHFGPIOx_CRH(GPIOx_CRH(配置配置815815引脚引脚)与端口配置低存放器类似。与端口配置低存放器类似。F地址偏移量:地址偏移量:0 x04h0 x04h,复位值:,复位值:0 x4444 44440 x4444 4444F例例1 1:GPIOx_CRHGPIOx_CRH存放器的第存放器的第2828至至2929位设置为位设置为1111,并在第,并在第3030至至3131位设置为位设置为0000:F 答:那么把答:那么把x x端口第端口第1515个引脚的模式配置
45、成了:输出的最大速度个引脚的模式配置成了:输出的最大速度为为50MHz50MHz的的 通用推挽输出模式。通用推挽输出模式。F例例2 2:上题反过来。:上题反过来。3、端口输入数据存放器GPIOx_IDRF端口输入数据存放器端口输入数据存放器(GPIOx_IDR)(x=A.G)(GPIOx_IDR)(x=A.G),读该存放器可,读该存放器可看某个看某个IOIO口的输入状态。口的输入状态。F地址偏移量:地址偏移量:0 x08h0 x08h,复位值:,复位值:0 x0000 XXXX0 x0000 XXXXF高位高位31:1631:16保存,始终读为保存,始终读为0 0。FIDRy15:0(y=01
46、5)IDRy15:0(y=015)每个位对应每个位对应I/OI/O口的输入状态。口的输入状态。FGPIOx_IDRGPIOx_IDR为只读并只能以字的形式读出。为只读并只能以字的形式读出。4、端口输出数据存放器GPIOx_ODRFGPIOx_ODR(x=A.E)GPIOx_ODR(x=A.E)位。写该存放器可控制某个位。写该存放器可控制某个IOIO口的输出电口的输出电平,读该存放器可以判断平,读该存放器可以判断IOIO口的输出状态。口的输出状态。F地址偏移量:地址偏移量:0 x0Ch0 x0Ch,复位值:,复位值:0 x0000 00000 x0000 0000F高位高位31:1631:16保
47、存,始终为保存,始终为0 0。FODRy15:0ODRy15:0:端口输出数据:端口输出数据(y=015)(y=015)F这些位可读可写并只能以字的形式操作。这些位可读可写并只能以字的形式操作。F通过通过GPIOx_BSRR(x=AG)GPIOx_BSRR(x=AG),可以分别地对各个,可以分别地对各个ODRODR位进行独位进行独立的置位立的置位/清零。清零。5、端口位置位/清零存放器GPIOx_BSRRFGPIOx_BSRR(x=A.G)GPIOx_BSRR(x=A.G),对,对GPIOxGPIOx的端口置位的端口置位/清零。清零。F地址偏移量:地址偏移量:0 x100 x10,复位值:,复
48、位值:0 x0000 00000 x0000 0000F位位31:1631:16为为BRy(y=015)BRy(y=015),清零,只能以字写入:,清零,只能以字写入:0 0:对应的:对应的ODRxODRx位不产生影响;位不产生影响;1 1:对应的:对应的ODRxODRx位清零;位清零;F位位15:015:0为为BSy(y=015)BSy(y=015),置位,只能以字写入:,置位,只能以字写入:0 0:对对应的:对对应的ODRxODRx位不产生影响;位不产生影响;1 1:对应的:对应的ODRxODRx位置位;位置位;F注:如果同时设置注:如果同时设置BSyBSy和和BRyBRy的对应位,的对应
49、位,BSxBSx位起作用。位起作用。6、端口位清零存放器(GPIOx_BRR)FGPIOx_BRR(x=A.G)GPIOx_BRR(x=A.G)对对GPIOxGPIOx的端口清零。的端口清零。F注意:相当于注意:相当于GPIOx_BSRRGPIOx_BSRR存放器的清零功能。存放器的清零功能。F地址偏移量:地址偏移量:0 x140 x14,复位值:,复位值:0 x0000 00000 x0000 0000FBits 31:16 ReservedBits 31:16 ReservedF位位15:015:0为为BRy(y=015):BRy(y=015):只能以字写入:只能以字写入:0 0:对应的:
50、对应的ODRxODRx位不产生影响;位不产生影响;1 1:对应的:对应的ODRxODRx位清零;位清零;7、端口配置锁定存放器GPIOx_LCKRF端口配置锁定存放器端口配置锁定存放器(GPIOx_LCKR)(x=A.G)(GPIOx_LCKR)(x=A.G)F地址偏移量:地址偏移量:0 x180 x18,复位值:,复位值:0 x0000 00000 x0000 0000F位位16(LCKK)16(LCKK):当执行正确的写序入列写:当执行正确的写序入列写1-1-写写0-0-写写1-1-写写0-0-写写1 1,置,置1 1下次系统复位前该存放器被锁住。下次系统复位前该存放器被锁住。F位位15: