stm32的GPIO学习笔记讲课教案
手把手教你STM32笔记解析
STM32F1031、IO口处理IO口包含7个寄存器配置寄存器两个:CRL(32),CRH(32)数据寄存器两个:IDR(32),ODR(32),但是他们只用了16位置位复位寄存器:BSRR(32)复位寄存器:BRR(16)锁存寄存器:LCKR(32)常用的有前面四个:其中前面两个是用来设置的,后面两个是用来操作的。
每个IO口占用四位进行设置(低两位是MODE,高两位是CNF),每组16个,总共需要64个位设置,分别从CRL低位开始,到CRH 的高位结束。
每个IO口四位二进制的常用配置:模拟输入模式(ADC):0x0;推挽输出模式(输出口50MHz):0x3;上/下拉输入模式(输入口用):0x8;复用输出(第二供能):0xB;STM32F407学习笔记1、系统时钟的设置:Stm32_Clock_Init(168,4,2,7);参数分别是:PLLN,PLLM,PLLP,PLLQHSE分频PLLM之后为VCO的输入,一般VCO的输入要求为1~2MHz,一般建议取为2MHz,防止PLL抖动。
VCO输出是输入的PLLN倍频,SYSCLK在去PLL输出时,SYSCLK = PLL=HSE/PLLM*PLLN/PLLP而PLLQ是为48MHz时钟配置用的,CLK48= HSE/PLLM*PLLN/PLLQ所以要设置系统时钟为168MHz时候推荐的参数取值为SYSCLK = PLL=HSE/PLLM*PLLN/PLLP =8/4*168/2=168MHzCLK48= HSE/PLLM*PLLN/PLLQ=8/4*168/7=48MHz2、延时函数设置:delay_init(168);延时函数参数为系统时钟SYSCLK初始化后就可以调用延时函数:delay_ms(ms);参数不能大于65536,因为参数是16位数delay_us(us);参数不能大于7989153、普通IO的使用a.首先是使能时钟RCC->AHB1ENR|=1<<5;在该寄存器相应的位置1即可b.IO口模式设置:GPIO_Set(GPIOF,PIN9|PIN10,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD _PU);参数分别是:GPIOx,PIN9|PIN10(具体对应的口,可以使用与的关系)因为每种占一位#define PIN01<<0#define PIN11<<1#define PIN21<<2#define PIN31<<3#define PIN41<<4#define PIN51<<5#define PIN61<<6#define PIN71<<7#define PIN81<<8#define PIN91<<9#define PIN101<<10#define PIN111<<11#define PIN121<<12#define PIN131<<13#define PIN141<<14#define PIN151<<15Mode:四种,各个模式只能设置一种#define GPIO_MODE_IN 0//普通输入模式#define GPIO_MODE_OUT 1 //普通输出模式#define GPIO_MODE_AF2//AF功能模式#define GPIO_MODE_AIN3//模拟输入模式输出推挽或者开漏选择:#define GPIO_OTYPE_PP0//推挽输出#define GPIO_OTYPE_OD1//开漏输出推挽输出可输出强的高、低电平,用于连接数字器件开漏输出相当于三极管的集电极,电流型驱动,只可以输出强的低电平,高电平需外拉。
(笔记)GPIO基本原理与寄存器配置(STM32篇)
(笔记)GPIO基本原理与寄存器配置(STM32篇)背景:因ST系列MCU在⾏业中应⽤最⼴,故本⽂以ST的MCU的GPIO进⾏详细讲解每⼀种功能应⽤类型的使⽤。
⼀、STM32F10X 引脚说明STM32F103ZET6⼀共有7组IO⼝,每组IO⼝有16个IO,分别为GPIOA~GPIOG,每组分别为PA0到PA16,STM32F103RCT6⼀个有4组IO⼝,分别为GPIOA到GPIOD,不同的是此芯⽚的GPIOD组只有GPIOD0⾄D2 三个IO⼝,并⾮16个。
这就是常⽤F1系列的芯⽚引脚,其⼤部分引脚不仅可以当作GPIO使⽤,还可以复⽤为外设功能引脚,⽐如说串⼝引脚(USART,TIM 等)。
⼆、GPIO的基本结构和⼯作⽅式I/O端⼝位的基本结构IO脚的基本⼯作⽅式:STM32 的 IO ⼝相⽐ 51 ⽽⾔要复杂得多,所以使⽤起来也困难很多。
⾸先 STM32 的 IO ⼝可以由软件配置成如下 8 种模式:(1)GPIO_Mode_IN_FLOATING 输⼊浮空模式(2)GPIO_Mode_IPU 输⼊上拉模式(3)GPIO_Mode_IPD 输⼊下拉模式(4)GPIO_Mode_AIN 模拟输⼊模式(5)GPIO_Mode_Out_OD 开漏输出模式(6)GPIO_Mode_AF_OD 开漏复⽤输出模式(7)GPIO_Mode_Out_PP 推挽输出模式(8)GPIO_Mode_AF_PP 推挽复⽤输出模式三、GPIO的基本⼯作⽅式讲解♣输⼊浮空模式在此状态下,I/O⼝的电平信号进⼊输⼊数据寄存器,此时的I/O电平信号是不确定的,完全由外部输⼊决定,如果在该引脚悬空(在⽆信号输⼊)的情况下,读取该端⼝的电平是不确定的。
且电压具有不确定性。
♣输⼊上拉模式上拉就是将⼀个不确定的信号拉到⼀个固定的值,如上图所⽰,通过I/O⼝来的信号就被上拉电阻拉到了VDD。
所以,和浮空输⼊相⽐来说,当I/O⼝被悬空的状态下,输⼊端的电平可以保持在⾼电平。
stm32自学笔记PPT课件
第三章 键盘
• 下面在分析一下中断子函数:
• void EXTI0_IRQHandler(void)
•{
•
delay_ms(10);//消抖
Hale Waihona Puke •if(KEY2==1)
//按键2
•
{
•
LED0=!LED0;
•
LED1=!LED1;
•
}
•
EXTI->PR=1<<0; //PR,清除LINE0上的中断标志位 ,终端挂起寄存器组。
•
GPIOA->CRH|=0X80800000;
•
GPIOA->ODR|=1<<13; //PA13上拉,PA0默认下拉
•
GPIOA->ODR|=1<<15; //PA15上拉
•
Ex_NVIC_Config(GPIO_A,0,RTIR); //上升沿触发
•
Ex_NVIC_Config(GPIO_A,13,FTIR);//下降沿触发
• 3.建立.h文件,.h文件是用来保存一些宏定义和一些函 数声明的,这样能够使函数看起来更加清晰,所以在这 里一定要把各个.h函数的路径添加到工程里面。
第二章 跑马灯实验
• 主函数:
• int main(void)
•{
•
Stm32_Clock_Init(9); //系统时钟设置,把PLL设置为9,比如说当前的时钟为8Mhz,那
• JTAG_Set(JTAG_SWD_DISABLE);//关闭JTAG和SWD,在原理图上可以看 到PA13和PA15为键盘和JTAG与SWD所共用,而这两种方针接口,他们 和普通的IO口公用,当想使用普通IO口时,必须先把他们关闭。在这 个函数里面设置参数,如果为二进制数00,则代表全部使能,如果是 二进制数01,则是能SWD,如果是10,则表示全部关闭。JTAG是一种 国际标准测试协议,主要用于芯片内部的测试。
ARM stm32特训讲座一——按键串口GPIO
按键小结
注意:以上4个函数为自己编写,需放在stm32f10x_it.c中,demo中已经帮你们 写好,只需在函数中提示“//add code here”后面加上自己的代码即可,比 如您想通过按键4来控制某个LED,则在第四个函数中的“//add code here” 后面加上LED的控制程序就能实现目的。 总结一下:按键的使用总体来说需要分两步走: 第一步通过在system_init.c中调用KEY_Configuration函数初始化按键; 第二步在stm32f10x_it.c中加入相应按键的中断响应函数程序,这样每次按 键按下时就能根据需要执行程序了。
配置的过程就是对STM32的各个外设初始化的过程。 首先分析一个按键正常工作需要用到的资源: GPIO:很明显,每个按键都连到IO口上; EXTI:按键采用中断方式(方便处理); NVIC(嵌套向量中断控制器):配置中断的使能和优 先级
、
GPIO的初始化一 GPIO的初始化一
GPIO的初始化主要有3个参数: GPIO的引脚; GPIO GPIO的模式(8选1); 8 1 GPIO的输出时钟频率(3选1)。 第一参数引脚就是具体使用的IO口,比如按键1的PA8 第二个模式需要根据需要选择,具体可以参考《参考手册》 第三个参数仅在GPIO作输出时设置,有2M、10M,50MHz可选, 速度越低,功耗越小,EMI也越好,所以应尽量选择较低频率。具 体选择时根据需要决定,如果你的IO的数据翻转很快,则就需要设 置较高频率(一般应大于翻转频率的10倍左右)。
外部中断设置
• 112个GPIO口; • 19个外部中断; 初始化的过程主要确定: • 第几个外部中断? • 对应的GPIO是多少? • 中断的模式? • 触发模式? • 打开使能。
STM32开发板例程讲解之二:GPIO的描述和配置,GPIOIOTG例程精讲ch...
#if 0 // 配置所有未使用GPIO引脚为输入模式(浮空输入),这样可以降低功耗,并且提高器件的抗EMI/EMC 的性能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, ENABLE);
//armfly :注释掉的原因是当代码在外部存储器运行时,GPIOD,E,F,G部分IO用于FSMC,因此对这些IO不能重置,否则导致取指异常 // GPIO_Init(GPIOD, &GPIO_InitStructure); // GPIO_Init(GPIOE, &GPIO_InitStructure); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
STM32入门教程--GPIO
STM32 GPIO使用方法一、STM32 GPIO简介GPIO即通用I/O(输入/输出)端口,是STM32可控制的引脚。
STM32芯片的GPIO引脚与外部设备连接起来,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。
以STM32F407为例,其为F4系列是基于Cortex-M4内核,共有7组IO。
分别为GPIOA~GPIOG,每组IO有16个IO口,共有112个IO口通常称为 PAx、PBx、PCx、PDx、PEx、PFx、PGx,其中x为0-15。
STM32 GPIO的复用:STM32 有很多的内置外设,这些外设的外部引脚都是与 GPIO 共用的。
也就是说,一个引脚可以有很多作用,但是默认为IO口,如果想使用一个 GPIO内置外设的功能引脚,就需要GPIO的复用,那么当这个GPIO 作为内置外设使用的时候,就叫做复用。
比如说串口就是GPIO复用为串口。
二、GPIO的工作模式1、4种输入模式(1)GPIO_Mode_IN_FLOATING 浮空输入(2)GPIO_Mode_IPU 上拉输入(3)GPIO_Mode_IPD 下拉输入(4)GPIO_Mode_AIN 模拟输入2、4种输出模式(1)GPIO_Mode_Out_OD 开漏输出(带上拉或者下拉)(2)GPIO_Mode_AF_OD 复用开漏输出(带上拉或者下拉)(3)GPIO_Mode_Out_PP 推挽输出(带上拉或者下拉)(4)GPIO_Mode_AF_PP 复用推挽输出(带上拉或者下拉)3、4种最大输出速度(1)2MHZ (低速)(2)25MHZ (中速)(3)50MHZ (快速)(4)100MHZ (高速)关于它们的定义,都在 stm32f4xx_gpio.h 中,都为结构体形式的定义三、GPIO内部结构a、保护二极管: IO引脚上下两边两个二极管用于防止引脚外部过高、过低的电压输入,当引脚电压高于VDD_FT时,上方的二极管导通,当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁b、上拉、下拉电阻:控制引脚默认状态的电压,开启上拉的时候引脚默认电压为高电平,开启下拉的时候引脚默认电压为低电平c、TTL施密特触发器:基本原理是当输入电压高于正向阈值电压,输出为高;当输入电压低于负向阈值电压,输出为低;IO口信号经过触发器后,模拟信号转化为0和1的数字信号也就是高低电平并且是TTL电平协议这也是为什么STM32是TTL电平协议的原因d、 P-MOS管和N-MOS管:信号由P-MOS管和N-MOS管,依据两个MOS管的工作方式,使得GPIO具有“推挽输出”和“开漏输出”的模式 P-MOS管高电平导通,低电平关闭,下方的N-MOS低电平导通,高电平关闭注:VDD_FT 代表IO口,兼容3.3V和5V,如果没有标注“FT”,就代表着不兼容5V (在芯片数据手册的引脚定义中,会看到有“I/O电平”一列有FT即为支持5V)开漏输出和推挽输出的区别:推挽输出:可以输出强高低电平,连接数字器件,推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止.开漏输出:可以输出强低电平,高电平得靠外部电阻拉高。
STM32 GPIO教程
系统外设
GPIO特性
最大封装(64引脚)上多达55个多功能双向GPIO(GPIO 引脚占有率相比STM32F1系列的80%更增加到86%) 几乎所有GPIO都是5V容忍(ADC引脚除外) GPIO分布在5个端口上:GPIOA[0~15]、GPIOB[0~15]、 GPIOC[0~15]、GPIOD[0~2]、GPIOF[4~7] 使用BSRR和BRR寄存器可以完成对引脚的原子置位和 复位操作 GPIO连在AHB总线,使得最高翻转速度高达12MHz 输出斜率可配置,高达50MHz 端口A和B上的引脚配置可通过LCKR寄存器锁定 55个引脚都可以配置成外部中断(可同时使能16个) 来把MCU从停止模式唤醒
I2C1端口支持1MHz超快速总线【FTf】
PB6/7 (I2C1_SCL/SDA) PB8/9 (I2C1_SCL/SDA)
其余端口都是5V容忍【FT】
10
Quiz
How many I/Os and ports there are in the STM32F0xx microcontroller ? ____________
可编程复用开关使得任意时刻只有一个外设连到 某个具体的GPIO。只有GPIOA和GPIOB有复用开关 某些外设功能还可以重映射到其他引脚,从而使 得能同时使用的外设数量更多
AF0 (SPI1_MISO) AF1 (TIM3_CH1) AF2 (TIM1_BKIN) Pin x (0…7)
AF7 (COMP1_OUT)
Output Driver
VSS
Push-Pull Open Drain
* In output mode, the I/O speed is configurable through OSPEEDR register: 2MHz, 10MHz or 50MHz
STM32学习笔记——GPIO口的使用
一、GPIO口简介1、GPIO口输入输出模式1.1 一般来说STM32的输入输出管脚有以下8种配置方式:输入①浮空输入_IN_FLOATING ——浮空输入,可以做KEY识别②带上拉输入_IPU ——IO内部上拉电阻输入③带下拉输入_IPD ——IO内部下拉电阻输入④模拟输入_AIN ——应用ADC模拟输入,或者低功耗下省电输出⑤开漏输出_OUT_OD ——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。
当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。
可以读IO输入电平变化,实现C51的IO双向功能。
⑥推挽输出_OUT_PP ——IO输出0-接GND,IO输出1 -接VCC,读输入值是未知的。
复用输出⑦复用功能的推挽输出_AF_PP ——片内外设功能(I2C的SCL,SDA)⑧复用功能的开漏输出_AF_OD ——片内外设功能(TX1,MOSI,MISO,SCK,SS)2、输入输出模式详解一般我们平时用的最多的也就是推挽输出、开漏输出、上拉输入,介绍如下:2.1推挽输出:可以输出高,低电平,连接数字器件;推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止。
高低电平由IC的电源低定。
推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。
输出既可以向负载灌电流,也可以从负载抽取电流。
推拉式输出级既提高电路的负载能力,又提高开关速度。
2.2开漏输出:输出端相当于三极管的集电极。
要得到高电平状态需要上拉电阻才行。
适合于做电流型的驱动,其吸收电流的能力相对强(一般20mA以内)开漏形式的电路有以下几个特点:1、利用外部电路的驱动能力,减少IC内部的驱动。
当IC内部MOSFET导通时,驱动电流是从外部的VCC流经R pull-up ,MOSFET到GND。
STM32学习笔记(1):GPIO口的使用
摸索了很久之后终于把ARM开发板上的LED灯点亮了,虽然是很简单的一个IO口操作,但是由于以前从来都没有什么经验,所以浪费了很多时间,也查找了很多资料。
现在可以操作IO口了,证明迈出了学习ARM的第一步。
实验平台清单如下:开发板:奋斗STRIVE V3核心芯片: STM32F103VET6开发环境: RealView MDK-ARM Version:3.50PC操作系统: Windows 7 家庭普通版仿真器: SEGGER J-Link其中,STM32F103VET6芯片是基于ARM Cortex-M3内核的,具体技术参数请参考ST 公司给出的芯片资料(/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/D ATASHEET/CD00191185.pdf)。
关于该芯片的其他资料,可以在/cn/mcu/product/164491.jsp上找到。
如果对RealView MDK不熟悉的话,可以参考ARM RealView系列丛书《ARM开发工具RealView MDK使用入门》,李宁编著,北京航空航天大学出版社出版。
如果对于STM32不熟悉的话,可以参考ARM RealView MDK 系列丛书《基于MDK的STM32处理器开发应用》,李宁编著,北京航空航天大学出版社出版。
当软硬件平台都准备好之后,就可以开始新的工程了。
对于一个初学者来说,新建一个可以运行的工程其实是有难度的,因为根本不知道从何下手。
因此,我将每一步细节都描述出来,以便于即使是初学者也能很好的理解ARM的初级操作。
打开MDK开发平台,在菜单栏中单击“Project - New μVision Project”创建一个新的工程。
然后在弹出的“Select Device for Target 1”对话框中选择合适的芯片。
由于我采用的是STM32F103VET6,所以选择ST – STM32F103VE。
STM32F4学习笔记之GPIO(使用固件库)
1.使能GPIO的AHB时钟,使用函数:RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE);2.配置GPIO工作模式用GPIO_Init()函数数据类型说明typedef struct{uint32_t GPIO_Pin; //引脚配置GPIOMode_TypeDef GPIO_Mode; //GPIO_Mode_IN(输入),GPIO_Mode_OUT(输出),GPIO_Mode_AF (备用),GPIO_Mode_AN(模拟)GPIOSpeed_TypeDef GPIO_Speed;// GPIO_Speed_2MHz,GPIO_Speed_25MHz,GPIO_Speed_50MHz,GPIO_Speed_100MHzGPIOOType_TypeDef GPIO_OType; // GPIO_OType_PP(推挽),GPIO_OType_OD(开漏)GPIOPuPd_TypeDef GPIO_PuPd; GPIO_PuPd_NOPULL(无),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)}GPIO_InitTypeDef;3.备用功能配置(除ADC和DAC外的所有非GPIO功能),使用函数void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)* This GPIO_AF can be one of the following values:* @arg GPIO_AF_RTC_50Hz: Connect RTC_50Hz pin to AF0 (default after reset)* @arg GPIO_AF_MCO: Connect MCO pin (MCO1 and MCO2) to AF0 (default after reset)* @arg GPIO_AF_TAMPER: Connect TAMPER pins (TAMPER_1 and TAMPER_2) to AF0 (default after reset)* @arg GPIO_AF_SWJ: Connect SWJ pins (SWD and JTAG)to AF0 (default after reset)* @arg GPIO_AF_TRACE: Connect TRACE pins to AF0 (default after reset)* @arg GPIO_AF_TIM1: Connect TIM1 pins to AF1* @arg GPIO_AF_TIM2: Connect TIM2 pins to AF1* @arg GPIO_AF_TIM3: Connect TIM3 pins to AF2* @arg GPIO_AF_TIM4: Connect TIM4 pins to AF2* @arg GPIO_AF_TIM5: Connect TIM5 pins to AF2* @arg GPIO_AF_TIM8: Connect TIM8 pins to AF3* @arg GPIO_AF_TIM9: Connect TIM9 pins to AF3* @arg GPIO_AF_TIM10: Connect TIM10 pins to AF3* @arg GPIO_AF_TIM11: Connect TIM11 pins to AF3* @arg GPIO_AF_I2C1: Connect I2C1 pins to AF4* @arg GPIO_AF_I2C2: Connect I2C2 pins to AF4* @arg GPIO_AF_I2C3: Connect I2C3 pins to AF4* @arg GPIO_AF_SPI1: Connect SPI1 pins to AF5* @arg GPIO_AF_SPI2: Connect SPI2/I2S2 pins to AF5* @arg GPIO_AF_SPI3: Connect SPI3/I2S3 pins to AF6* @arg GPIO_AF_I2S3ext: Connect I2S3ext pins to AF7* @arg GPIO_AF_USART1: Connect USART1 pins to AF7* @arg GPIO_AF_USART2: Connect USART2 pins to AF7* @arg GPIO_AF_USART3: Connect USART3 pins to AF7* @arg GPIO_AF_UART4: Connect UART4 pins to AF8* @arg GPIO_AF_UART5: Connect UART5 pins to AF8* @arg GPIO_AF_USART6: Connect USART6 pins to AF8* @arg GPIO_AF_CAN1: Connect CAN1 pins to AF9* @arg GPIO_AF_CAN2: Connect CAN2 pins to AF9* @arg GPIO_AF_TIM12: Connect TIM12 pins to AF9* @arg GPIO_AF_TIM13: Connect TIM13 pins to AF9* @arg GPIO_AF_TIM14: Connect TIM14 pins to AF9* @arg GPIO_AF_OTG_FS: Connect OTG_FS pins to AF10* @arg GPIO_AF_OTG_HS: Connect OTG_HS pins to AF10* @arg GPIO_AF_ETH: Connect ETHERNET pins to AF11* @arg GPIO_AF_FSMC: Connect FSMC pins to AF12* @arg GPIO_AF_OTG_HS_FS: Connect OTG HS (configured in FS) pins to AF12* @arg GPIO_AF_SDIO: Connect SDIO pins to AF12* @arg GPIO_AF_DCMI: Connect DCMI pins to AF13* @arg GPIO_AF_EVENTOUT: Connect EVENTOUT pins to AF154.使用GPIO_ReadInputData(GPIO_TypeDef* GPIOx)和GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)读输入信号5.使用GPIO_SetBits()/GPIO_ResetBits()设置输出引脚6.上电或复位后,引脚备用功能都没启用(JTAG引脚除外),为悬浮输入状态7.LSE引脚OSC32_IN 和OSC32_OUT(PC14 and PC15)的优先级高于GPIO8.HSE引脚OSC_IN/OSC_OUT (PH0 / PH1)的优先级高于GPIO例程:int main(void){GPIO_InitTypeDef GPIO_InitStructure;/* GPIOG Periph clock enable */RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOD, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_SetBits(GPIOD, GPIO_Pin_12);GPIO_ResetBits(GPIOD, GPIO_Pin_13);while (1){if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0){GPIO_SetBits(GPIOD, GPIO_Pin_13);GPIO_ResetBits(GPIOD, GPIO_Pin_12);}else{GPIO_SetBits(GPIOD, GPIO_Pin_12); GPIO_ResetBits(GPIOD, GPIO_Pin_13);}}}。
STM32F4学习笔记之GPIO(使用固件库)
1.使能GPIO的AHB时钟,使用函数:RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE);2.配置GPIO工作模式用GPIO_Init()函数数据类型说明typedef struct{uint32_t GPIO_Pin; //引脚配置GPIOMode_TypeDef GPIO_Mode; //GPIO_Mode_IN(输入),GPIO_Mode_OUT(输出),GPIO_Mode_AF (备用),GPIO_Mode_AN(模拟)GPIOSpeed_TypeDef GPIO_Speed;// GPIO_Speed_2MHz,GPIO_Speed_25MHz,GPIO_Speed_50MHz,GPIO_Speed_100MHzGPIOOType_TypeDef GPIO_OType; // GPIO_OType_PP(推挽),GPIO_OType_OD(开漏)GPIOPuPd_TypeDef GPIO_PuPd; GPIO_PuPd_NOPULL(无),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)}GPIO_InitTypeDef;3.备用功能配置(除ADC和DAC外的所有非GPIO功能),使用函数void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)* This GPIO_AF can be one of the following values:* @arg GPIO_AF_RTC_50Hz: Connect RTC_50Hz pin to AF0 (default after reset)* @arg GPIO_AF_MCO: Connect MCO pin (MCO1 and MCO2) to AF0 (default after reset)* @arg GPIO_AF_TAMPER: Connect TAMPER pins (TAMPER_1 and TAMPER_2) to AF0 (default after reset)* @arg GPIO_AF_SWJ: Connect SWJ pins (SWD and JTAG)to AF0 (default after reset)* @arg GPIO_AF_TRACE: Connect TRACE pins to AF0 (default after reset)* @arg GPIO_AF_TIM1: Connect TIM1 pins to AF1* @arg GPIO_AF_TIM2: Connect TIM2 pins to AF1* @arg GPIO_AF_TIM3: Connect TIM3 pins to AF2* @arg GPIO_AF_TIM4: Connect TIM4 pins to AF2* @arg GPIO_AF_TIM5: Connect TIM5 pins to AF2* @arg GPIO_AF_TIM8: Connect TIM8 pins to AF3* @arg GPIO_AF_TIM9: Connect TIM9 pins to AF3* @arg GPIO_AF_TIM10: Connect TIM10 pins to AF3* @arg GPIO_AF_TIM11: Connect TIM11 pins to AF3* @arg GPIO_AF_I2C1: Connect I2C1 pins to AF4* @arg GPIO_AF_I2C2: Connect I2C2 pins to AF4* @arg GPIO_AF_I2C3: Connect I2C3 pins to AF4* @arg GPIO_AF_SPI1: Connect SPI1 pins to AF5* @arg GPIO_AF_SPI2: Connect SPI2/I2S2 pins to AF5* @arg GPIO_AF_SPI3: Connect SPI3/I2S3 pins to AF6* @arg GPIO_AF_I2S3ext: Connect I2S3ext pins to AF7* @arg GPIO_AF_USART1: Connect USART1 pins to AF7* @arg GPIO_AF_USART2: Connect USART2 pins to AF7* @arg GPIO_AF_USART3: Connect USART3 pins to AF7* @arg GPIO_AF_UART4: Connect UART4 pins to AF8* @arg GPIO_AF_UART5: Connect UART5 pins to AF8* @arg GPIO_AF_USART6: Connect USART6 pins to AF8* @arg GPIO_AF_CAN1: Connect CAN1 pins to AF9* @arg GPIO_AF_CAN2: Connect CAN2 pins to AF9* @arg GPIO_AF_TIM12: Connect TIM12 pins to AF9* @arg GPIO_AF_TIM13: Connect TIM13 pins to AF9* @arg GPIO_AF_TIM14: Connect TIM14 pins to AF9* @arg GPIO_AF_OTG_FS: Connect OTG_FS pins to AF10* @arg GPIO_AF_OTG_HS: Connect OTG_HS pins to AF10* @arg GPIO_AF_ETH: Connect ETHERNET pins to AF11* @arg GPIO_AF_FSMC: Connect FSMC pins to AF12* @arg GPIO_AF_OTG_HS_FS: Connect OTG HS (configured in FS) pins to AF12* @arg GPIO_AF_SDIO: Connect SDIO pins to AF12* @arg GPIO_AF_DCMI: Connect DCMI pins to AF13* @arg GPIO_AF_EVENTOUT: Connect EVENTOUT pins to AF154.使用GPIO_ReadInputData(GPIO_TypeDef* GPIOx)和GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)读输入信号5.使用GPIO_SetBits()/GPIO_ResetBits()设置输出引脚6.上电或复位后,引脚备用功能都没启用(JTAG引脚除外),为悬浮输入状态7.LSE引脚OSC32_IN 和OSC32_OUT(PC14 and PC15)的优先级高于GPIO8.HSE引脚OSC_IN/OSC_OUT (PH0 / PH1)的优先级高于GPIO例程:int main(void){GPIO_InitTypeDef GPIO_InitStructure;/* GPIOG Periph clock enable */RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOD, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_SetBits(GPIOD, GPIO_Pin_12);GPIO_ResetBits(GPIOD, GPIO_Pin_13);while (1){if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0){GPIO_SetBits(GPIOD, GPIO_Pin_13);GPIO_ResetBits(GPIOD, GPIO_Pin_12);}else{GPIO_SetBits(GPIOD, GPIO_Pin_12); GPIO_ResetBits(GPIOD, GPIO_Pin_13);}}}。
stm32的GPIO学习笔记讲课教案
stm32的GPIO学习笔记讲课教案s t m32的G P I O学习笔记I/O口工作模式:1.高阻输入输入模式的结构比较简单,就是一个带有施密特触发输入(Schmitt-triggered input)的三态缓冲器(U1),并具有很高的阻抗。
施密特触发输入的作用是能将缓慢变化的或者是畸变的输入脉冲信号整形成比较理想的矩形脉冲信号。
执行GPIO管脚读操作时,在读脉冲(Read Pulse)的作用下会把管脚(Pin)的当前电平状态读到内部总线上(Internal Bus)。
2.推挽输出推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高.在推挽输出模式下,GPIO还具有回读功能,实现回读功能的是一个简单的三态门U2。
注意:执行回读功能时,读到的是管脚的输出锁存状态,而不是外部管脚 Pin的状态。
3.开漏输出开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以改变传输电平,比如加上上拉电阻就可以提供TTL/CMOS电平输出等。
开漏输出和推挽输出相比结构基本相同,但只有下拉晶体管 T1而没有上拉晶体管。
同样,T1实际上也是多组可编程选择的晶体管。
开漏输出的实际作用就是一个开关,输出“1”时断开、输出“0”时连接到 GND(有一定内阻)开漏输出和推挽输出相比结构基本相同,但只有下拉晶体管 T1而没有上拉晶体管。
同样,T1实际上也是多组可编程选择的晶体管。
开漏输出的实际作用就是一个开关,输出“1”时断开、输出“0”时连接到 GND(有一定内阻).4.钳位二级管其作用是防止从外部管脚 Pin输入的电压过高或者过低。
提高输出电压一种简单的做法:是先在GPIO管脚上串联一只二极管(如1N4148),然后再接上拉电阻。
STM32 GPIO入门学习
STM32GPIO入门学习今天下午开始学习STM32的GPIO控制,开始以为跟AVR单片机一样,只是设置方向寄存器跟引脚寄存器,一排引脚由8位变16位而已,谁知道一看资料才发现居然还有IO口状态设置,设置速度设置…不过还好,使用的是STM32的FWLib3.0软件包,里面的GPIO口函数都做好了,只要看一下使用就可以了。
先看一些网上跟书上找到的资料跟自己总结的咚咚:1.STM32每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。
2.GPIO端口的每个位可以由软件分别配置成多种模式。
每个I/O端口位可以自由编程,然而I/0端口寄存器必须按32位字被访问(不允许半字或字节访问)。
GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO 寄存器的读/更改的独立访问;这样,在读和更改访问之间产生IRQ时不会发生危险。
端口位配置CNFx[1:0]=xxb,MODEx[1:0]=xxb3.GPIO_InitTypeDef是GPIO口的一个定义结构体,包含一个16位的变量GPIO_Pin;一个GPIOSpeed_TypeDef枚举结构体GPIO_Speed;一个GPIOMode_TypeDef枚举结构体GPIO_Mode;这3个变量可以在外部被定义,用于初始化或者改变某些GPIO的速度跟类型。
typedef enum{GPIO_Speed_10MHz=1,GPIO_Speed_2MHz,GPIO_Speed_50MHz}GPIOSpeed_TypeDef;typedef enum表示定义了一个枚举型的数据结构,可以用GPIOSpeed_TypeDef去定义变量,这个变量的取值就是GPIO_Speed_10MHz,GPIO_Speed_2MHz,GPIO_Speed_50MHz中的一个。
对STM32的GPIO口的学习及讲解
一、GPIO常用模式高阻输入模式、推挽输出模式和开漏输出模式;二、常用IO口模式的分析及讲解a 高阻输入凡是挂在总线上的的寄存器或存储器等设备,他的输出和输入端不仅能呈现0/1状态,还可以呈现高阻态,此时可以理解被隔离,对总线的状态不起任何作用,总线可以做其他工作,三态控制器都有一个控制端,可以认为控制其工作模式。
上述是管脚的情况,其他管脚和上述类似。
输入模式就是一个带有施密特触发输入的三态缓冲器,有很高的输入阻抗。
施密特的作用是能将缓慢变化的或者畸形的输入脉冲波形整形成理想的矩形脉冲信号。
在执行GPIO读操作时,在脉冲Read Pulse的作用下会把管脚Pin的当前电平状态读到内部的总线上。
在不执行读操作时,外部管脚和内部总线互相隔离,互补干扰b 推挽输出模式推挽输出:在功率放大器电路中大量采用推挽放大电路,电路中的三极管够成放大电路,两只三级干交替工作在放大状态,这样把正弦波的两个半周期全部处在放大状态,最后在Pin 的负载上合成一个完整的放大波形。
推挽模式就是“把原来的数据上拉的意思”,通过内部小心好的变化来控制VDD的导通和截止,从而起到小信号控制大信号的作用,也就好像放大了源信号一样。
GPIO管脚在脉冲Write Pulse的作用下,内部数据被锁存在Q/Q'上面,TI和T2构成COMS反相器,在T1和T2低阻抗的情况下实现推挽输出内部电平的功能,但是T1和T2不能同时导通,否则用以烧坏反相器传输门。
在推挽模式下,GPIO还有回读功能,实现该功能的是三态门U2,在执行回读功能时,读到的是管脚的输出锁存状态,而不是Pin的状态,这一点切记。
c 开漏输出模式推挽输出和推挽输出结构一样,只是断开了p-mos管,连接n-mos管。
内不是1的时候,输出低电平,外部引脚直接和GND连接。
内不是0的时候,n-mos管不截止(通常需要外接上拉电阻才能真正以上输出高电平1,这里和mcs51单片机的P0口结构很类似)。
超经典的STM32学习笔记——第一章GPIO口
超经典的STM32学习笔记——第一章GPIO口固件库中与GPIO有关的函数主要有函数名描述 GPIO_Init 根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器GPIO_ReadInputDataBit读取指定端口管脚的输入GPIO_ReadInputData读取指定的GPIO端口输入GPIO_ReadOutputDataBit读取指定端口管脚的输出GPIO_ReadOutputData读取指定的GPIO端口输出GPIO_SetBits设置指定的数据端口位GPIO_ResetBits清除指定的数据端口位GPIO_WriteBit设置或者清除指定的数据端口位GPIO_Write向指定GPIO数据端口写入数据 1.1函数GPIO_Init 函数名GPIO_Init函数原形void GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_InitStruct)功能描述根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器输入参数1 GPIOx x可以是A B C D或者E来选择GPIO外设输入参数2 GPIO_InitStruct指向结构GPIO_InitTypeDef的指针包含了外设GPIO的配置信息参阅Section GPIO_InitTypeDef查阅更多该参数允许取值范围输出参数无返回值无先决条件无被调用函数无 1.1.1GPIO_TypeDef为一结构体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;GPIOx为一宏定义#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)其中GPIOA_BASE=0x40010800,即PA口的起始地址#define GPIOA ((GPIO_TypeDef *)GPIOA_BASE)这句语句的作用就是将GPIOA指定到PA口的入口地址中也就是说将PA口的寄存器组取名为GPIOA。
STM32学习笔记之一_GPIO
STM32学习笔记之⼀_GPIOSTM32中GPIO的理解⼀、什么是GPIOGPIO,英⽂全称为General-Purpose IO ports,也就是通⽤IO⼝。
嵌⼊式系统中常常有数量众多,但是结构却⽐较简单的外部设备/电路,对这些设备/电路有的需要CPU为之提供控制⼿段,有的则需要被CPU⽤作输⼊信号。
⽽且,许多这样的设备/电路只要求⼀位,即只要有开/关两种状态就够了,⽐如灯亮与灭。
对这些设备/电路的控制,使⽤传统的串⾏⼝或并⾏⼝都不合适。
所以在微控制器芯⽚上⼀般都会提供⼀个“通⽤可编程IO接⼝”,即GPIO。
接⼝⾄少有两个寄存器,即“通⽤IO控制寄存器”与“通⽤IO数据寄存器”。
数据寄存器的各位都直接引到芯⽚外部,⽽对这种寄存器中每⼀位的作⽤,即每⼀位的信号流通⽅向,则可以通过控制寄存器中对应位独⽴的加以设置。
这样,有⽆GPIO接⼝也就成为微控制器区别于微处理器的⼀个特征。
⼆、STM32中GPIO的结构STM32的DGPIO⼝最多可以有7组(GPIOA~GPIOG),⽽每⼀组GPIO⼝均有16个双向IO端⼝位组成。
每个GPIO端⼝有:(1)两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH)分别控制每个端⼝的⾼⼋位和低⼋位,如果IO⼝是0-7号的话,则写CRL寄存器,如果IO⼝是8-15号的话,则写CRH寄存器。
(2)两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR)端⼝输⼊数据寄存器(GPIOX_IDR):其中⾼16位是保留的,低⼗六位对应着16个IO ⼝的数据位。
端⼝输出数据寄存器(GPIOX_ODR):其中⾼16位是保留的,低⼗六位对应着16个IO ⼝的数据位。
(3)⼀个32位置位/复位寄存器(GPIOx_BSRR)(置位/复位寄存器:Set/Reset Register)(4)⼀个16位复位寄存器(GPIOx_BRR)(复位寄存器:Reset Register)(5)⼀个32位锁定寄存器(GPIOx_LCKR)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
s t m32的G P I O学习笔记I/O口工作模式:1.高阻输入输入模式的结构比较简单,就是一个带有施密特触发输入(Schmitt-triggered input)的三态缓冲器(U1),并具有很高的阻抗。
施密特触发输入的作用是能将缓慢变化的或者是畸变的输入脉冲信号整形成比较理想的矩形脉冲信号。
执行 GPIO管脚读操作时,在读脉冲(Read Pulse)的作用下会把管脚(Pin)的当前电平状态读到内部总线上(Internal Bus)。
2.推挽输出推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高.在推挽输出模式下,GPIO还具有回读功能,实现回读功能的是一个简单的三态门 U2。
注意:执行回读功能时,读到的是管脚的输出锁存状态,而不是外部管脚 Pin的状态。
3.开漏输出开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以改变传输电平,比如加上上拉电阻就可以提供TTL/CMOS电平输出等。
开漏输出和推挽输出相比结构基本相同,但只有下拉晶体管 T1而没有上拉晶体管。
同样,T1实际上也是多组可编程选择的晶体管。
开漏输出的实际作用就是一个开关,输出“1”时断开、输出“0”时连接到 GND(有一定内阻)开漏输出和推挽输出相比结构基本相同,但只有下拉晶体管 T1而没有上拉晶体管。
同样,T1实际上也是多组可编程选择的晶体管。
开漏输出的实际作用就是一个开关,输出“1”时断开、输出“0”时连接到 GND(有一定内阻).4.钳位二级管其作用是防止从外部管脚 Pin输入的电压过高或者过低。
提高输出电压一种简单的做法:是先在 GPIO管脚上串联一只二极管(如1N4148),然后再接上拉电阻。
/////////////////////////////////////////////////////////////////////////////////////////////////////////STM32的GPIO管脚深入分析:概述:STM23的每个GPIO引脚都可以由软件配置成输出(推挽或开漏),输入(带或不带上拉或下拉)或复用的外设功能端口。
多数GPIO引脚与数字或模拟的复用外设共用;除了具有模拟输入(ADC)功能的管脚之外,其他的GPIO引脚都有大电流通过能力。
tip:每个IO口可以自由编程,单IO口寄存器必须要按32位bit被访问。
STM32的每个IO端口都有7个寄存器来控制一.具体如下8种模式:1)输入浮空(这个输入模式,输入电平必须由外部电路确定,要根据具体电路,加外部上拉电阻或下拉电阻,可以做按键识别)2)输入上拉(打开IO内部上拉电阻)3)输入下拉(打开IO内部下拉电阻)4)模拟输入(应用ADC模拟输入)5)开漏输出(输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内).能驱动大电流和大电压,LED就使用这种模式。
)6)推挽式输出(可以输出高,低电平,连接数字器件。
推挽式输出输出电阻小,带负载能力强)7)推挽式复用功能(复用是指该引脚打开remap功能)8)开漏复用功能(复用是指该引脚打开remap功能)tip:上拉输入模式:区别在于没有输入信号的时候默认输入高电平(因为有弱上拉)。
下拉输入模式:区别在于没有输入信号的时候默认输入低电平(因为有弱下拉)。
(上拉就是使IO口接上拉电阻到VCC了,跟51一样,下拉就是使IO口接下拉电阻到GND了,浮空就是即不接上拉,也不接下拉,这样的话IO默认输入电平不确定)浮空输入模式:顾名思义也就是输入什么信号才是什么信号,对于浮空输入要保证有明确的输入信号。
库函数:GPIO_Mode_AIN 模拟输入GPIO_Mode_IN_FLOATING 浮空输入GPIO_Mode_IPD 下拉输入GPIO_Mode_IPU 上拉输入GPIO_Mode_Out_OD 开漏输出GPIO_Mode_Out_PP 推挽输出GPIO_Mode_AF_OD 复用开漏输出GPIO_Mode_AF_PP 复用推挽输出二.TM32的每个IO端口都有7个寄存器来控制,具体七个寄存器如下:CRL 端口配置低寄存器CRH 端口配置高寄存器IDR 端口输入数据寄存器ODR 端口输出数据寄存器BSRR 端口位设置/复位寄存器BRR 端口位复位寄存器LCKR 端口配置锁定寄存器EVCR 事件控制寄存器MAPR 复用重映射和调试I/O配置寄存器EXTICR 外部中断线路0-15配置寄存器tip:********************************************************************* *******************************CRL(端口配置低寄存器):复位值为0X4444 4444(4化成二进制为0100),从上图可以看到,复位值其实就是配置端口为浮空输入模式得出:STM32的CRL控制着每个IO端口(A~G)的低8位的模式。
每个IO端口的位占用CRL的4个位,高两位为CNF,低两位为MODE。
CRL控制的是低8位输出口,而CRH控制的是高8位输出口在输入模式(MODE[1:0]=00):00:模拟输入模式01:浮空输入模式(复位后的状态)10:上拉/下拉输入模式11:保留在输出模式(MODE[1:0]>00):00:通用推挽输出模式01:通用开漏输出模式10:复用功能推挽输出模式11:复用功能开漏输出模式MODEy[1:0]:端口x的模式位:00:输入模式(复位后的状态)01:输出模式,最大速度10MHz10:输出模式,最大速度2MHz11:输出模式,最大速度50MHz********************************************************************* *****************************************端口输入数据寄存器(GPIOx_IDR):tip:IDR是一个GPIOx_IDR的端口输入数据寄存器的简称(ODR是输入数据寄存器的简称),要想知道某个IO口的状态,就要读这个寄存器,再从读出的寄存器值分析出某个管脚位的状态,就可以知道这个管脚的状态了;IDR寄存器只用了低16位。
该寄存器为只读寄存器,并且只能以16位的形式读出。
端口输出数据寄存器(GPIOx_ODR):ODR是一个端口输出数据寄存器,其作用就是控制端口的输出,对ODR对应寄存器位置1即对应的GPIO管脚就会输出高电平。
该寄存器也只用了低16位,并且该寄存器可读可写,如果读的话,从该寄存器读出来的数据都是0,所以读是没有意义的;只有写是有效的。
总结:GPIOx_IDR是端口的输入数据寄存器,GPIOx_ODR是端口的输出寄存器,我们配置引脚的输入输出模式是通过GPIOx_CRL和GPIOx_CRH两个寄存器来配置的,但是每个端口的16个引脚它们有的可能是输出模式,有的是输入模式,甚至一会输出一会输入,而GPIOx_IDR和GPIOx_ODR两个寄存器是以字模式(读一次就是访问2个字节,一个字等于2个字节)访问而不能以bit模式(bit模式表示一次访问一个bit位,一个字节等于8个bit,一个字等于16个bit)访问,GPIOx_IDR只能读,而GPIOx_ODR可以读写。
三.总结一下STM32的IO控制寄存器的作用:1)STM32的CRL和CRH寄存器主要是用来IO管脚的方向和速率以及何种驱动模式2)STM32的ODR寄存器是用来控制IO口的输出高电平还是低电平3)STM32的IDR寄存器主要是用来存储IO口当前的输入状态(高低电平)的。
4)STM32的BSRR寄存器主要是用来直接对IO端某一位直接进行设置和清除操作,通过这个寄存器可以方便的直接修改一个引脚的高低电平5)STM32的BRR寄存器用来清除某端口的某一位位0,如果该寄存器某位为0,那么它所对应的那个引脚位不产生影响;如果该寄存器某位为1 ,则清除对应的引脚位。
6)STM32的LCKR用来锁定端口的配置,当对相应的端口位执行了LOCK序列后,在下次系统复位之前将不能再更改端口位的配置。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// GPIO的输出模式下几种速度的区别:2MHz、10MHz、50MHz;这个又可以理解为输出驱动电路的不同响应速度(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路,通过选择速度来选择不同的输出驱动电路模块,达到最佳的噪声控制和降低功耗的目的)。
、//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 在STM32中如何配置片内外设使用的IO端口:首先,一个外设在使用前,必须先配置和激活启动该外设的时钟,比如GPIO 端口B,那么就要激活GPIOB的时钟,比如GPIOA,那么使用PA2管脚前,必须要前激活GPIOA端口的时钟,只有启动时钟后,这个外设才变得激活可用。
到外设的输入输出功能基本有三种情况:1)管脚输出:需要根据外围电路的配置选择对应的管脚为复用功能的推挽输出或复用功能的开漏输出。
2)管脚输入:则根据外围电路的配置可以选择浮空输入、带上拉输入或带下拉输入。
3)ADC对应的管脚:配置管脚为模拟输入。
值得注意的是:这里如果把端口配置成复用输出功能,则该引脚与它当前连的信号电路断开,和复用功能信号电路连接,所以将管脚配置成复用输出功能后,如果只激活了该引脚的GPIO端口的时钟,而忘记把复用功能的时钟激活,那么它的输出将不确定,这样会产生异常的现。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// APB2ENR寄存器是APB2总线上的外设时钟使能寄存器///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 端口位设置/清除寄存器(GPIOx_BSRR) (x=A..E):位31:16 这些位只能写入并只能以字(16位)的形式操作。