第2章STM32单片机IO端口编程PPT课件_第1页
第2章STM32单片机IO端口编程PPT课件_第2页
第2章STM32单片机IO端口编程PPT课件_第3页
第2章STM32单片机IO端口编程PPT课件_第4页
第2章STM32单片机IO端口编程PPT课件_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 STM32单片机管脚 STM32系列单片机命名规则 2.1 STM322.1 STM32单片机管脚和命名规则第1页/共73页PA口 16脚PB口16脚PC口3脚PD口2脚STM32F103CBT6 共有37个I/O管脚: PA口 16脚+ PB口16脚+ PC口3脚+ PD口2脚。 STM32单片机管脚:以STM32F103Cx为例,采用的封装形式LQFP48第2页/共73页一般而言,嵌入式系统在工作前,都要进行初始化工作,其中包括调用RCC_Configuration(复位和时钟设置)函数。用于系统复位和初始化STM32系列微控制器的时钟。2.2 STM322.2 STM32单片机时钟配置

2、2.2.1 STM322.2.1 STM32时钟系统2.2.2 2.2.2 RCC_ConfigurationRCC_Configuration(复位和时钟设置)函数第3页/共73页STM32系列微控制器中,有5个时钟源:HSI (High Speed Internal) :高速内部时钟、HSE (High Speed External):高速外部时钟、LSI (Low Speed Internal) :低速内部时钟、LSE(Low Speed External) :低速外部时钟、 PLL(Phase Locked Loop) :锁相环倍频输出。其中的HSI、HSE、 或PLL可被用来驱动系统

3、时钟。 其中的LSI、LSE作为二级时钟源。STM32时钟系统结构图(P56)2.2.1 STM322.2.1 STM32时钟系统第4页/共73页其中的HSI、HSE、 或PLL可被用来驱动系统时钟。实际PLL是来自于HSI、HSE第5页/共73页 外设总线:包括APB1(Advanced Peripheral Bus 1) 和APB2(Advanced Peripheral Bus 2)APB2:用于高速外设APB1:用于低速外设 AMBA片上总线:已成为一种流行的工业片上总线标准。它包括AHB(Advanced High performance Bus)和APB(Advanced Peri

4、pheral Bus ),前者作为系统总线,后者作为外设总线。第6页/共73页STM32系统结构图连接在APB1(低速外设)上的设备:有连接在APB2(高速外设)上的设备:有连接在AHB(Advanced High performance Bus)上的设备:有第7页/共73页1 1、使能、使能 挂接在挂接在APB1APB1总线总线上的外设上的外设 对应的时钟对应的时钟 命令:命令:RCC_APB1PeriphClockCmd( ) 函数 例如,使能TIM2对应的时钟:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); RCC_APB2Peri

5、phClockCmd( )函数2 2、使能、使能 挂接在挂接在APB2APB2总线总线上的外设上的外设 对应的时钟对应的时钟 命令:命令:例如,使能GPIO端口对应的时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOE,ENABLE); 第8页/共73页3 3、使能、使能 挂接在挂接在AHBAHB总线总线上的外设上的外设 对应的时钟对应的时钟 命令:命令:RCC_AHBPeriphClockCmd( ) 函数 例如,使能DMA对应的时钟:RCC_AHBPeriphClockCmd(RCC_AHBPeriph_D

6、MA,ENABLE); 第9页/共73页使用操作符“|”可以一次选中上表中的一个或多个取值的组合作为该参数的值。第10页/共73页复位和时钟控制(RCC) 第11页/共73页STM32F103xx增强型模块框图第12页/共73页基于ARM Cortex内核的MCU 和 普通的8/16位单片机 在系统结构上 最大区别:普通的8/16位单片机:只有1个系统时钟频率,而基于ARM Cortex内核的MCU:具有多个时钟频率,分别供给内核 和 不同外设模块使用。本课程的学习难点之一:就是ARM时钟 比 单片机时钟 复杂得多。为什么ARM时钟这么复杂?第13页/共73页原因二:时钟分开有助于实现原因二:

7、时钟分开有助于实现低功耗低功耗。原因一:原因一:高速时钟高速时钟供供中央处理器中央处理器等等高速高速设备使用,设备使用, 低速时钟低速时钟供供外设外设等等低速低速设备使用。设备使用。第14页/共73页时钟输出使能 STM32处理器因为低功耗的需要,各模块需要分别独立开启时钟。 当需要使用某个外设模块时,记得一定要先使能对应的时钟。否则,这个外设不能工作。第15页/共73页2.2.2 2.2.2 R RC CC C_Configuration_Configuration( )函数1、RCC复位和时钟配置寄存器组2、枚举类型ErrorStatus 3、RCC_Configuration ( ):(

8、复位和时钟设置)函数( Reset and Clock Configuration( ), 复位和时钟设置 函数 )第16页/共73页STM32STM32单片机的复位和时钟设置 : :共包括1010个设置寄存器一个32位的时钟控制寄存器(RCC_CR)一个32位的时钟配置寄存器(RCC_CFGR)一个32位的时钟中断寄存器 (RCC_CIR)一个32位的APB2外设复位寄存器 (RCC_APB2RSTR)一个32位的APB1外设复位寄存器 (RCC_APB1RSTR) 一个32位的AHB外设时钟使能寄存器 (RCC_AHBENR) 一个32位的APB2外设时钟使能寄存器(RCC_APB2ENR

9、) 一个32位的APB1外设时钟使能寄存器(RCC_APB1ENR) 一个32位的备份域控制寄存器 (RCC_BDCR) 一个32位的控制/状态寄存器 (RCC_CSR) Backup domain control register (RCC_BDCR)详见参考手册 V10_1 第P60第17页/共73页编程时,时钟的具体配置是从RCC(Reset and Clock Configuration,复位和时钟配置)寄存器组开始。在固件库中,用结构体RCC_TypeDef 定义 RCC寄存器组:在文件“stm32f10 x_map.h”中,定义如下:/*- Real-Time Clock -*/t

10、ypedef struct vu32 CR; vu32 CFGR; vu32 CIR; vu32 APB2RSTR; vu32 APB1RSTR; vu32 AHBENR; vu32 APB2ENR; vu32 APB1ENR; vu32 BDCR; vu32 CSR; RCC_TypeDef;1、RCC复位和时钟配置寄存器组第18页/共73页/* Peripheral base address in the bit-band region */#define PERIPH_BASE (u32)0 x40000000)/* Peripheral memory map */#define APB

11、1PERIPH_BASE PERIPH_BASE#define APB2PERIPH_BASE (PERIPH_BASE + 0 x1 0000)#define AHBPERIPH_BASE (PERIPH_BASE + 0 x2 0000)#define RCC_BASE (AHBPERIPH_BASE + 0 x1000)#ifdef _RCC #define RCC (RCC_TypeDef *) RCC_BASE)#endif /*_RCC */该宏定义的功能:在程序中,所有写RCC的地方,编译器的预处理程序,都将它替换为:(RCC_TypeDef *) 0 x40021000)第19

12、页/共73页2、枚举类型ErrorStatus 在文件“stm32f10 x_type.h”中,包含typedef enum ERROR=0, SUCCESS=! ERROR ErrorStatus; 该语句,定义了新枚举类型名ErrorStatus,代表左侧定义的枚举类型。第20页/共73页3、RCC_Configuration(复位和时钟设置)函数:在“HelloRobot.h”中ErrorStatus HSEStartUpStatus;void RCC_Configuration(void) /*将外设RCC寄存器组重新设置为默认值,即复位 。 RCC system reset*/ RC

13、C_DeInit(); /*打开外部高速时钟晶振HSE ,Enable HSE */ RCC_HSEConfig(RCC_HSE_ON); /*等待HSE外部高速时钟晶振稳定,或者在超时的情况下退出,Wait till HSE is ready */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus = SUCCESS) / SUCCESS: HSE晶振稳定就绪 /*设置AHB时钟= SYSCLK= 48 MHz , HCLK(即 AHB时钟) = SYSCLK */ RCC_HCLKConfig(RCC_SYSCL

14、K_Div1); /*设置高速PCLK2时钟(即APB2 clock)= = AHB时钟/2 = 24 MHz,PCLK2 = HCLK/2 */ RCC_PCLK2Config(RCC_HCLK_Div2); /*设置低速PCLK1时钟(即APB1 clock)= AHB时钟/4=12 MHz ,PCLK1 = HCLK/4 */ RCC_PCLK1Config(RCC_HCLK_Div4); /RCC_HCLK_Div4: APB1 clock = HCLK/4=12MHz,此处不同于鸥鹏公司的程序(=36MHz) /*设置Flash 延时时钟周期数:为2 */ FLASH_SetLate

15、ncy(FLASH_Latency_2); /* Enable Flash Prefetch Buffer预取指令指令缓冲区,这2句与RCC没有关系 */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* 利用锁相环将HSE外部8MHz晶振6倍频到48 MHz。PLLCLK = 8MHz * 6 = 48 MHz */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6); /此处不同于鸥鹏公司的程序:PLLCLK = 8MHz * 6 = 48 MHz /* Enable PLL

16、 */ RCC_PLLCmd(ENABLE); /* Wait till PLL is ready,等待 锁相环 输出稳定 */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) = RESET) /* Select PLL as system clock source */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /选择PLLCLK作为SYSCLK,所以SYSCLK为48 MHz /* Wait till PLL is used as system clock source */ while(RCC_GetSYSC

17、LKSource() != 0 x08) /* Enable peripheral clocks -*/ /* GPIOA, GPIOB and SPI1 clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_SPI1, ENABLE); /* Enable GPIOC, GPIOD clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC| RCC_APB2Periph_GPIOD, ENABLE);

18、枚举类型变量第21页/共73页/*设置低速PCLK1时钟(即APB1 clock)= AHB时钟/4=12 MHz ,PCLK1 = HCLK/4 */ RCC_PCLK1Config(RCC_HCLK_Div4); /RCC_HCLK_Div4: APB1 clock = HCLK/4=12MHz,此处不同于鸥鹏公司的程序(=36MHz) /*设置Flash 延时时钟周期数:为2 */ FLASH_SetLatency(FLASH_Latency_2); /* Enable Flash Prefetch Buffer预取指令指令缓冲区,这2句与RCC没有关系 */ FLASH_Prefetc

19、hBufferCmd(FLASH_PrefetchBuffer_Enable); /* 利用锁相环将HSE外部8MHz晶振6倍频到48 MHz,作为PLLCLK。 PLLCLK = 8MHz * 6 = 48 MHz */ RCC_PLLConfig ( RCC_PLLSource_HSE_Div1, RCC_PLLMul_6); /此处不同于鸥鹏公司的程序:PLLCLK = 8MHz * 6 = 48 MHz /* Enable PLL */ RCC_PLLCmd(ENABLE); 第22页/共73页 /* Wait till PLL is ready,等待 锁相环 输出稳定 */ whil

20、e(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) = RESET) /* Select PLL as system clock source */ /选择PLLCLK作为SYSCLK,所以SYSCLK为48 MHz RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /*Wait till PLL is used as system clock source */ while(RCC_GetSYSCLKSource() != 0 x08) /* Enable peripheral clocks -*/ /* GPIOA, GPIOB a

21、nd SPI1 clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_SPI1, ENABLE); /* Enable GPIOC, GPIOD clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC| RCC_APB2Periph_GPIOD, ENABLE);第23页/共73页以上所见的固件库函数:详见“中文版:STM32F10 xxx_固件库函数 V2.pdf P193”固件库函数的具体实现:见

22、文件“stm32f10 x_rcc.h”第24页/共73页其中RCC_DeInit();/* Function Name : RCC_DeInit* Description : Resets the RCC clock configuration to the default reset state.* Input : None* Output : None* Return : None*/void RCC_DeInit(void) /* Set HSION bit */ RCC-CR |= (u32)0 x00000001; /* Reset SW1:0, HPRE3:0, PPRE12:0

23、, PPRE22:0, ADCPRE1:0 and MCO2:0 bits */ RCC-CFGR &= (u32)0 xF8FF0000; /* Reset HSEON, CSSON and PLLON bits */ RCC-CR &= (u32)0 xFEF6FFFF; /* Reset HSEBYP bit */ RCC-CR &= (u32)0 xFFFBFFFF; /* Reset PLLSRC, PLLXTPRE, PLLMUL3:0 and USBPRE bits */ RCC-CFGR &= (u32)0 xFF80FFFF; /* Disab

24、le all interrupts */ RCC-CIR = 0 x00000000;第25页/共73页第26页/共73页2.3 STM322.3 STM32单片机I/OI/O端口配置 2.32.3.1.1 STM32单片机的 I/OI/O端口和管脚 2.32.3.2.2 STM32单片机的 I/OI/O端口配置第27页/共73页 2.32.3.1.1 STM32单片机的 I/OI/O端口和管脚 STM32单片机 最多有7个16位的并行 I/OI/O端口:PA、PB、PC、PD、PE、PF、PG。 STM32F103Cx单片机 只有4个16位的并行 I/OI/O端口:PA、PB、PC、PD。第

25、28页/共73页PA口 16脚PB口16脚PC口3脚PD口2脚STM32F103CBT6 包含4个端口: PA口 、PB口、PC口、PD口,共有37个I/O管脚: PA口 16脚+ PB口16脚+ PC口3脚+ PD口2脚。 STM32单片机的I/OI/O端口和管脚:以STM32F103Cx为例第29页/共73页每个GPIOx端口: :共有7 7个设置寄存器两个32位的配置寄存器(GPIOx_CRL, GPIOx_CRH)(GPIOx_CRL) (x=A.G): GPIOx configuration register low, GPIOx端口低配置寄存器,用于配置GPIOx端口的第0位第7位

26、。两个32位的数据寄存器(GPIOx_IDR,GPIOx_ODR)(GPIOx_IDR) (x=A.G): GPIOx input data register 一个32位的置位/复位寄存器 (GPIOx_BSRR) (GPIOx_BSRR) (x=A.G): GPIOx bit set/reset register一个16位的复位寄存器(GPIOx_BRR)一个32位的锁定寄存器(GPIOx_LCKR)(GPIOx_LCKR) (x=A.G): GPIOx configuration lock register 第30页/共73页在MCS-51MCS-51单片机中,每个IO端口: :只有1 1

27、个设置寄存器P0P0端口:P0P0端口寄存器-P0,-P0,P1P1端口:P1P1端口寄存器-P1,-P1,P2P2端口:P2P2端口寄存器-P2,-P2,P3P3端口:P3P3端口寄存器-P3-P3。对应STM32STM32单片机的数据寄存器两个32位的数据寄存器(GPIOx_IDR,GPIOx_ODR)(GPIOx_IDR) (x=A.G): GPIOx input data register MCS-51MCS-51单片机I0I0端口的输入、输出数据寄存器共用1 1个寄存器PxPx,而STM32STM32单片机的输入、输出数据寄存器是分开的。第31页/共73页MCS-51单片机的特殊功能

28、寄存器第32页/共73页在固件函数库的 “stm32f10 x_map.h”文件中,对应的定义:/*- General Purpose IO -*/typedef struct vu32 CRL;/configuration register low(GPIOx_CRL)(x=AE) vu32 CRH; vu32 IDR; vu32 ODR; vu32 BSRR; vu32 BRR; vu32 LCKR; GPIO_TypeDef; /用结构体GPIO_TypeDef定义GPIOx端口,(即定义 GPIOx端口的7个设置寄存器)第33页/共73页 2.32.3.2.2 STM32单片机的 I/

29、OI/O端口配置5、在使用GPIOGPIO端口时,首先要使能该外设对应的时钟1、GPIOx 端口 定义 2、GPIO_Pin_x 管脚 定义 3、GPIO_InitTypeDef 初始化端口参数 定义4、GPIO_Init 初始化端口 定义6、GPIO编程 步骤第34页/共73页1、编程时,GPIOx端口的具体配置是从GPIOA、 GPIOB、GPIOC、 GPIOD、 或 GPIOE寄存器组开始。首先,在固件库中,用结构体GPIO_TypeDef定义GPIOx端口,(即定义 GPIOx端口的7个设置寄存器):在文件“stm32f10 x_map.h”中,定义如下:/*- General Pu

30、rpose IO -*/typedef struct vu32 CRL;/configuration register low32(GPIOx_CRL)(x=AE) vu32 CRH; vu32 IDR; vu32 ODR; vu32 BSRR; vu32 BRR; vu32 LCKR; GPIO_TypeDef; /用结构体GPIO_TypeDef定义 GPIOx端口 /或称用结构体GPIO_TypeDef定义 GPIOx寄存器组GPIOx端口的7个设置寄存器第35页/共73页端口配置低寄存器(GPIOx_CRL) (x=A.E) :第36页/共73页表3.11:端口位配置表配置模式配置模式

31、CNF1CNF0MODE1:0PxODR寄存寄存器器通用输出通用输出推挽推挽00011011参照参照表表3.120或或1开漏开漏10或或1复用功能复用功能输出输出推挽推挽10任意任意开漏开漏1任意任意输入输入模拟输入模拟输入0000任意任意输入浮空输入浮空1任意任意输入下拉输入下拉100输入上拉输入上拉1表3.12:输出模式位MODE1:0含义含义00保留保留01最大输出速率最大输出速率10MHz10最大输出速率最大输出速率2MHz11最大输出速率最大输出速率50MHz第37页/共73页#define GPIOA_BASE (APB2PERIPH_BASE + 0 x0800)#define

32、GPIOB_BASE (APB2PERIPH_BASE + 0 x0C00)#define GPIOC_BASE (APB2PERIPH_BASE + 0 x1000)#define GPIOD_BASE (APB2PERIPH_BASE + 0 x1400)#define GPIOE_BASE (APB2PERIPH_BASE + 0 x1800)#define GPIOF_BASE (APB2PERIPH_BASE + 0 x1C00)#define GPIOG_BASE (APB2PERIPH_BASE + 0 x2000)GPIOA、 GPIOB、GPIOC、 GPIOD、 或 GPI

33、OE寄存器组 的首地址:/* Peripheral base address in the bit-band region */#define PERIPH_BASE (u32)0 x40000000)/* Peripheral memory map */#define APB1PERIPH_BASE PERIPH_BASE#define APB2PERIPH_BASE (PERIPH_BASE + 0 x10000)#define AHBPERIPH_BASE (PERIPH_BASE + 0 x20000)0 x400110000 x400108000 x40010C000 x400114

34、000 x400118000 x40011C000 x40012000第38页/共73页#ifdef _GPIOA #define GPIOA (GPIO_TypeDef *) GPIOA_BASE)#endif /*_GPIOA */#ifdef _GPIOB #define GPIOB (GPIO_TypeDef *) GPIOB_BASE)#endif /*_GPIOB */#ifdef _GPIOC #define GPIOC (GPIO_TypeDef *) GPIOC_BASE)#endif /*_GPIOC */#ifdef _GPIOD #define GPIOD (GPIO_

35、TypeDef *) GPIOD_BASE)#endif /*_GPIOD */#ifdef _GPIOE #define GPIOE (GPIO_TypeDef *) GPIOE_BASE)#endif /*_GPIOE */#ifdef _GPIOF #define GPIOF (GPIO_TypeDef *) GPIOF_BASE)#endif /*_GPIOF */#ifdef _GPIOG #define GPIOG (GPIO_TypeDef *) GPIOG_BASE)#endif /*_GPIOG */第39页/共73页在文件“stm32f10 x_gpio.h”中,定义2、

36、GPIO_Pin_x 管脚 定义: /* Exported constants -*/* GPIO pins define -*/#define GPIO_Pin_0 (u16)0 x0001) /* Pin 0 selected */#define GPIO_Pin_1 (u16)0 x0002) /* Pin 1 selected */#define GPIO_Pin_2 (u16)0 x0004) /* Pin 2 selected */#define GPIO_Pin_3 (u16)0 x0008) /* Pin 3 selected */#define GPIO_Pin_4 (u16

37、)0 x0010) /* Pin 4 selected */#define GPIO_Pin_5 (u16)0 x0020) /* Pin 5 selected */#define GPIO_Pin_6 (u16)0 x0040) /* Pin 6 selected */#define GPIO_Pin_7 (u16)0 x0080) /* Pin 7 selected */#define GPIO_Pin_8 (u16)0 x0100) /* Pin 8 selected */#define GPIO_Pin_9 (u16)0 x0200) /* Pin 9 selected */#defi

38、ne GPIO_Pin_10 (u16)0 x0400) /* Pin 10 selected */#define GPIO_Pin_11 (u16)0 x0800) /* Pin 11 selected */#define GPIO_Pin_12 (u16)0 x1000) /* Pin 12 selected */#define GPIO_Pin_13 (u16)0 x2000) /* Pin 13 selected */#define GPIO_Pin_14 (u16)0 x4000) /* Pin 14 selected */#define GPIO_Pin_15 (u16)0 x80

39、00) /* Pin 15 selected */#define GPIO_Pin_All (u16)0 xFFFF) /* All pins selected */第40页/共73页使用按位或运算符“|”可以一次选中多个管脚。可以使用上表中的任意组合。第41页/共73页3、GPIO_InitTypeDef 初始化端口参数 定义(1) 枚举类型GPIOSpeed_TypeDef:用于定义GPIO管脚 的 响应速度 (2) 枚举类型GPIOMode_TypeDef: 用于定义GPIO管脚 的 工作模式(3) 结构体GPIO_InitTypeDef: 用于初始化端口参数 难点第42页/共73页在文

40、件“stm32f10 x_gpio.h”中,定义:typedef enum GPIO_Speed_10MHz = 1, GPIO_Speed_2MHz, GPIO_Speed_50MHzGPIOSpeed_TypeDef; /定义GPIO管脚 的 响应速度 (1) 枚举类型GPIOSpeed_TypeDef:用于定义GPIO管脚 的 响应速度 第43页/共73页typedef enum GPIO_Mode_AIN = 0 x0, GPIO_Mode_IN_FLOATING = 0 x04, GPIO_Mode_IPD = 0 x28, GPIO_Mode_IPU = 0 x48, GPIO_M

41、ode_Out_OD = 0 x14, GPIO_Mode_Out_PP = 0 x10, GPIO_Mode_AF_OD = 0 x1C, GPIO_Mode_AF_PP = 0 x18GPIOMode_TypeDef; /定义GPIO管脚 的 工作模式(2) 枚举类型GPIOMode_TypeDef: 用于定义GPIO管脚 的 工作模式第44页/共73页第45页/共73页STM32单片机的每一个输入/输出引脚(即GPIO端口的每一位)可以配置成以下8种模式(4输入+2输出+2复用输出): STM32单片机的GPIO端口模式: p输入浮空:IN_FLOATINGp输入上拉:IPU(In Pu

42、sh-Up)p输入下拉: : IPD(In Push-Down)p模拟输入: : AIN (Analog In) p开漏输出:Out_OD (Open Drain Output)p推挽式输出: :Out_PP (Push-Pull Output)p推挽式复用功能: :AF_PP (Push-Pull Output Alternate-Function)p开漏复用功能: :AF_OD (Open Drain Output Alternate-Function)输 入输 出复用输 出第46页/共73页/* Configuration Mode enumeration -*/typedef enum

43、 GPIO_Mode_AIN = 0 x0, GPIO_Mode_IN_FLOATING = 0 x04, GPIO_Mode_IPD = 0 x28, GPIO_Mode_IPU = 0 x48, GPIO_Mode_Out_OD = 0 x14, GPIO_Mode_Out_PP = 0 x10, GPIO_Mode_AF_OD = 0 x1C, GPIO_Mode_AF_PP = 0 x18GPIOMode_TypeDef; /定义GPIO管脚 的 工作模式工作模式:用低4位 区分。输 入输 出输入、输出: 高4位为1-输出,否则为输入。第47页/共73页I/OI/O端口位的基本结构 输

44、入数据寄存器输出数据寄存器位置位/ 复位寄存器第48页/共73页I/O端口位的输入电路I/O端口位的输出电路第49页/共73页I/O端口位的输入电路 I/O端口位的浮空/上拉/下拉输入电路 I/O端口位的高阻抗模拟 输入电路第50页/共73页图3.11:I/O端口位的输入浮空/上拉/下拉配置激活施密特触发输入输出缓冲器被禁止根据输入配置(上拉,下拉或浮空)的不同,弱上拉和下拉电阻被连接在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器第51页/共73页-参见“!STM32F10 x_中文版_参考手册 V10_1( 2010年1月10日) .pdf” P108第52页/共73页

45、图3.14: I/O端口位的高阻抗模拟输入配置输出缓冲器被禁止禁止施密特触发输入。施密特触发输出值被强置为0弱上拉和下拉电阻被禁止读取输入数据寄存器时数值为0第53页/共73页第54页/共73页I/O端口位的输出电路 I/O端口位的开漏输出电路 I/O端口位的推挽输出电路 I/O端口位的复用功能的推挽输出电路和开漏输出电路第55页/共73页图3.12 I/O端口位的开漏输出配置开漏模式: P-MOS从不被激活,仅N-MOS工作。开漏模式:输出寄存器上的0激活N-MOS,输出低电平;而输出寄存器上的1将端口置于高阻状态(P-MOS从不被激活)。激活施密特触发输入在每个APB2时钟周期,出现在I/

46、O脚上的数据被采样到输入数据寄存器第56页/共73页图3.12 I/O端口位的推挽输出配置推挽模式:输出寄存器上的0激活N-MOS,而输出寄存器上的1将激活P-MOS。激活施密特触发输入弱上拉和下拉电阻被禁止在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器第57页/共73页第58页/共73页图3.13: I/O端口位的复用功能配置激活施密特触发输入弱上拉和下拉电阻被禁止在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器复用功能Input到片上外设自片上外设第59页/共73页l 如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接

47、。 第60页/共73页图3.13: I/O端口位的复用功能配置l 仅有输出,才有复用功能。复用功能Input到片上外设自片上外设l开漏输出、推挽输出 和 复用功能的开漏输出、推挽输出 不同之处:引脚和输出寄存器断开,并和片上外设的输出信号连接。 增加了复用功能Input第61页/共73页第62页/共73页/* GPIO Init structure definition */typedef struct u16 GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed; GPIOMode_TypeDef GPIO_Mode;GPIO_InitTypeDef; /用于初始化用

48、于初始化GPIOxGPIOx端口的参数(包括管端口的参数(包括管脚号、管脚响应速度、管脚工作模式)脚号、管脚响应速度、管脚工作模式)(3) 结构体GPIO_InitTypeDef: 用于初始化端口参数 第63页/共73页比较 结构体GPIO_TypeDef 和GPIO_InitTypeDef:第64页/共73页第65页/共73页4、GPIO_Init 初始化端口 定义功能:根据GPIO_InitTypeDef中指定的参数,初始化外设GPIOx端口例如,GPIO_InitTypeDef GPIO_InitStructure;/定义结构体变量GPIO_InitStructure,用于初始化GPIO

49、x端口的参数GPIO_Init(GPIOC, &GPIO_InitStructure); /初始化GPIOC端口第66页/共73页/* Function Name : GPIO_Init* Description : Initializes the GPIOx peripheral according to the specified* parameters in the GPIO_InitStruct.* Input : - GPIOx: where x can be (A.G) to select the GPIO peripheral.* - GPIO_InitStruct: p

50、ointer to a GPIO_InitTypeDef structure that* contains the configuration information for the specified GPIO* peripheral.* Output : None* Return : None*/void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) u32 currentmode = 0 x00, currentpin = 0 x00, pinpos = 0 x00, pos = 0 x00; u32

51、tmpreg = 0 x00, pinmask = 0 x00; /* Check the parameters */ assert_param(IS_GPIO_ALL_PERIPH(GPIOx); assert_param(IS_GPIO_MODE(GPIO_InitStruct-GPIO_Mode); assert_param(IS_GPIO_PIN(GPIO_InitStruct-GPIO_Pin); /*- GPIO Mode Configuration -*/ currentmode = (u32)GPIO_InitStruct-GPIO_Mode) & (u32)0 x0F); if (u32)GPIO_InitStruct-GPIO_Mode) & (u32)0 x10) != 0 x00) /所有的输出模式(开漏输出0 x14,推挽输出0 x10等),与0 x10相与,都为0 x10。 本句功能:当为输出模式时,把MODEy1:0-端口x的模式位(y = 07)设置为非

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论