上次的结束有点仓促,有两个重要的函数没有记录
GPIO_SetBits(GPIOC,GPIO_Pin_13);
GPIO_ResetBits(GPIOC,GPIO_Pin_13)
GPIO_SetBits是将对应的标志口置为高电平;GPIO_ResetBits是将对应的标志口置为低电平
GPIO
- GPIO通用输入输出口
- 可配置为8种输入输出模式
- 引脚电平:0V~3V,部分引脚可容忍5V
- 输出模式下可控制端口输出高低电平,用以驱动LED,控制蜂鸣器、模拟通信协议输出时序等
- 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接受数据等
使用GPIO,就在与它的输入,输出功能,而通过配置GPIO的端口配置寄存器,端口可以配置成一下8种模式:
模式名称 | 性质 | 特征 |
浮空输入 | 数字输入 | 可读取引脚电平,若引脚悬空,则电平不确定 |
上拉输入 | 数字输入 | 可读取引脚电平,内部连接上拉电阻,悬空时默认高电平 |
下拉输入 | 数字输入 | 可读取引脚电平,内部连接下来电阻,悬空时默认低电平 |
模拟输入 | 模拟输入 | GPIO无效,引脚直接接入内部ADC |
开漏输出 | 数字输出 | 可输出引脚电平,高电平为高组态,低电平接VSS |
推挽输出 | 数字输出 | 可输出引脚电平,高电平接VDD,低电平接VSS |
复用开漏输出 | 数字输出 | 由片上外设控制,高电平为高阻态,低电平接VSS |
复用推挽输出 | 数字输出 | 由片上外设控制,高电平接VDD,低电平接VSS |
这里的VDD是电源,VSS是地。
接下来是对GPIO口的一些应用,参考别人的例程,分别是LED闪烁、LED流水灯、蜂鸣器。
参考上节中的PC13口的配置,需要用到的有RCC时钟、GPIOC的使能,在闪烁过程中,还需要延迟函数,要不然单片机驱动高低电平频率太高了,肉眼观察不到。
这里再新学个函数:
GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)
这个函数的作用是对位进行写高低电平,前两个和SetBits的参数一样,第三个参数是Bit_RESET/Bit_SET分别是给对应的pin置低电平/高电平。
首先得对这个延时函数进行添加:
在STM32Project文件内找到1-3Delay函数模块,在工程文件夹中新建一个System文件夹,将Delay的.h和.c文件复制进去,然后将其添加进相应文件和路径。
void Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);
主要就有这三个函数,进行us,ms,s的延时。
LED闪烁
添加完延时函数模块之后,对应的输入输出口就应该使能和配置电平了,参考上节:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
然后在main()函数中的while循环中写下如下语句,实现闪烁灯的亮灭。
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
Delay_ms(500);
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
Delay_ms(500);
然后就完成了LED闪烁的配置,接下来烧录到单片机上就可以进行LED的闪灭闪灭了。
LED流水灯
先学一个新的函数:
GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)
函数的第一个参数是定义A/B/C口大类,后面的数据是进行每个大类口下的pin的高低电平配置
例如:
GPIO_Write(GPIOA,~0X0001);
将外部电路连接好,然后按照上面那种方法,直接进行进行pin口的高低电平配置,延时之后,就可以进行流水灯了。
GPIO_Write(GPIOA,~0X0001);
Delay_ms(500);
GPIO_Write(GPIOA,~0X0002);
Delay_ms(500);
GPIO_Write(GPIOA,~0X0004);
Delay_ms(500);
GPIO_Write(GPIOA,~0X0008);
Delay_ms(500);
GPIO_Write(GPIOA,~0X0010);
Delay_ms(500);
蜂鸣器
蜂鸣器就是将pin口配置好之后,对其输出高低电平,蜂鸣器就实现响与不响了。