第一天点亮LED。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 要求让DS0、DS1一起闪烁,周期为1S。 I/O口的输入输出方式有八种,输出速度三种。 u 4种输入模式: 输入浮空 //GPIO_Mode_IN_FLOATING 输入上拉 //GPIO_Mode_IPU 输入下拉 //GPIO_Mode_IPD 模拟输入 //GPIO_Mode_AIN u 4种输出模式: 开漏输出 //GPIO_Mode_Out_OD 开漏复用功能 //GPIO_Mode_AF_OD 推挽式输出 //GPIO_Mode_Out_PP 推挽式复用功能 //GPIO_Mode_AF_PP 浮空,顾名思义就是浮在空中,上面用绳子一拉就上去了,下面用绳子一拉就沉下去了. 开漏,就等于输出口接了个NPN三极管,并且只接了e,b. c极 是开路的,你可以接一个 电阻到3.3V,也可以接一个电阻到5V,这样,在输出1的时候,就可以是5V电压,也可以是3.3V电压了.但是不接电阻上拉的时候,这个输出高就不能实现了. 推挽,就是有推有拉,任何时候IO口的电平都是确定的,不需要外接上拉或者下拉电阻 (1) 浮空输入_IN_FLOATING ——浮空输入,可以做KEY识别,RX1
(2)带上拉输入_IPU——IO内部上拉电阻输入
(3)带下拉输入_IPD—— IO内部下拉电阻输入
(4) 模拟输入_AIN ——应用ADC模拟输入,或者低功耗下省电
(5)开漏输出_OUT_OD ——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但 由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读 I O输入电平变化,实现C51的IO双向功能
(6)推挽输出_OUT_PP ——IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的
(7)复用功能的推挽输出_AF_PP ——片内外设功能(I2C的SCL,SDA)
(8)复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS). STM32设置实例:
(1)模拟I2C使用开漏输出_OUT_OD,接上拉电阻,能够正确输出0和1;读值时 先GPIO_SetBits(GPIOB, GPIO_Pin_0);拉高,然后可以读IO的值;使用GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0);
(2)如果是无上拉电阻,IO默认是高电平;需要读取IO的值,可以使用带上拉输入_IPU和浮空输入_IN_FLOATING和开漏输出_OUT_OD; 以上内容摘抄于openedv论坛上一位学长的帖子(先学者为学长嘛) u 3种最大输出速度: -2MHZ -10MHz -50MHz STM32有很多I/O口兼容3.3V和5V(Level标有FT的就是兼容的) 有关寄存器的知识 每个I/O口都由7个寄存器控制 2个32位的端口配置寄存器CRL和CRH; CRL复位值为0X44444444;CRL寄存器控制着每组I/O端口的低8位的模式和输出速率;每个I/O端口的位占用CRL的4个位,高两位为CNF,低两位为MODE。CNF位(两位):在输入模式下【MODE[1:0]=00】{(00表示模拟输入模式),(01表示浮空输入模式),(10表示上拉/下拉输入模式),(11表示保留在输出模式)}MOD位(两位):{(00表示输入模式),(01表示输出模式10MHZ),(10表示输出模式2MHZ),(11表示输出模式50MHZ)} PxODR寄存器位和设置上拉输入(0)/下拉输入有关(1);??? 模式:NCF7[1:0]MODE7[1:0]………………………..NCF0[1:0]MODE0[1:0] CRH寄存器控制着每组I/O端口的高8位的模式和输出速率。 2个32位的数据寄存器IDR和ODR; IDR是一个端口输入数据寄存器,只用了低16位,高16位都保留为0;该寄存器为只读寄存器。要想知道某个I/O口的电平状态,只要读取这个寄存器就可以了。 ODR是一个端口输出寄存器,只用了低16位,高16为都保留为0;该寄存器为可读/写寄存器。从该寄存器读出的数据可以用来判断当前I/O的输出状态。而向该寄存器写数据则可以控制某个I/O口的输出电平。 1个32位的置位/复位寄存器BSRR; BSRR寄存器是端口位设置/清除寄存器,可以用来设置GPIO端口的输出位。32个位只能写入并只能以字的形式操作。 写0对【高16位】来说【对相应的ODR位不产生影响】 对【低16位】来说【清除对应的ODR位为0,也就是让相应的I/O口的端口值为1】 写1对【低16位】来说【对相应的ODR位不产生影响】 对【高16位】来说【设置对应的ODR位为1,也就是让相应的I/O口的端口值为0】 低16位设置优先于高16位 1个16位的复位寄存器BRR; BRR寄存器是端口位清除寄存器,作用和BSRR的高16位类似。 1个32位的锁存寄存器LCKR; 重要函数: 1个初始化函数: void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef*GPIO_InitStruct); 2个读取输入电平函数: uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_tGPIO_Pin); uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); 2个读取输出电平函数: uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx); 4个设置输出电平函数: void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); //常用 void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); //常用 void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitActionBitVal); void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal); 1个初始化函数: voidGPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); 作用:初始化一个或者多个IO口(同一组)的工作方式和速度。该函数主要是操作GPIO_CRL(CRH)寄存器,在上拉或者下拉的时候有设置BSRR或者BRR寄存器。(GPIOx: GPIOA~GPIOG) 注意:外设(包括GPIO)在使用之前,几乎都要先使能对应的时钟。 初始化样例: GPIO_InitTypeDef GPIO_InitStructure; //加粗部分为结构体 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//LED0-->PB.5 端口配置 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度为50MHz GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5 结构体原型如下: typedefstruct { uint16_t GPIO_Pin; //指定要初始化的IO口 GPIOSpeed_TypeDef GPIO_Speed; //设置IO口输出速度 GPIOMode_TypeDef GPIO_Mode; //设置工作模式:8种中的一个 }GPIO_InitTypeDef; 使能IO口时钟:调用函数RCC_APB2PeriphColckCmd(); 操作IO口,输出高低电平。GPIO_SetBits();//变高GPIO_ResetBits();//变低 格式如下GPIO_Set(Reset)Bits(GPIOX,GPIO_Pin_N);//将PX_N变高(变低) 注意:在使用任何外设的函数或其它函数之前,要注意初始化 Program Size: Code=4980RO-data=336 RW-data=56ZI-data=1832(编译后生成的语句) Code表示程序占用Flash的大小 RO—data即Read Only—data,表示已被程序定义的常量,如const类型(Flash) RW—data即Read Write—data,表示已被初始化的全局变量(SRAM) ZI—data即Zero Init—data,表示未被初始化的全局变量(SRAM) 有了这个就可以知道当前使用的Flash和SRAM大小了。程序的大小不是生成.hex文件的大小而是编译后的Code和RO—data之和。 和I/O口有关的固件库函数有stm32f10x_rcc(处理内部时钟相关函数文件)、stm32f10x_gpio() 10月19日 |