目录
GPIO
GPIO输出:向外驱动控制
GPIO输入:读取,捕获(信息)(控制)
右侧两个二级管,阻止不在0-3.3V的电压流入内部电路(通过VDD,VSS将异常电流抹消)
上拉电阻VDD/下拉电阻VSS:给输入提供默认电平,防止处于浮空状态,输入数据易被干扰不确定。
上通下断,上拉输入模式(默认为高电平的输入模式)//
都断,浮空输入模式。
施密特触发器:对输入电压进行整形
中间留一定范围,避免因信号波动造成的输出抖动
位设置/清除寄存器:单独操作寄存器某一位(一般,寄存器操作的16个端口只能整体读写)
两个MOS管:电子开关,信号控制的开关。
推挽:P-MOS,N-MOS均有效。寄存器为1,P-MOS通N-MOS断,接VDD,输出高电平。寄存器为0,N-MOS通P-MOS断,接VSS,输出低电平。
开漏:仅N-MOS有效,仅低电平有驱动能力。
关闭:都无效,输出关闭,外部控制电平
输出时可以进行输入操作,输入时不能进行输出操作
LED
长脚+,短脚-极
内部较小+,较大-
选择看IO口高低电平的驱动能力
GPIO在推挽输出模式下,高低电平均有比较强的驱动能力(均可)
很多单片机或者芯片,都使用了高电平弱驱动,低电平的强驱动的规则(第一种)
蜂鸣器
有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定
中间引脚接低电平(低电平触发):响。高电平:灭
(无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音)
PNP三极管驱动,基极给低电平,三极管导通
NPN三极管驱动,基极给高电平,三极管导通
RCC外设 , GPIO外设
RCC外设
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState); void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
GPIO外设
void GPIO_DeInit(GPIO_TypeDef* GPIOx);//复位指定的GPIO外设 void GPIO_AFIODeInit(void);//复位AFIO外设 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);//结构体变量赋默认值 //读取函数 uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx); //写入函数 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, BitAction BitVal);//可单个引脚操作 void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);//对16个端口进行写入操作
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
用结构体的参数初始化GPIO口,要先定义一个结构体变量,然后再给结构体赋值,最后调用这个函数。这个函数内部就会自动读取结构体的值,然后自动把外设的各个参数配置好。
总概
操作STM32的GPIO
使用RCC开启GPIO的时钟 :
外设的寄存器只有在时钟信号存在时才能被访问和配置
初始化GPIO :
定义结构体变量,用于存储 GPIO 配置参数。
设置参数(*3)
使用输出或输入的函数控制GPIO口:
电灯,推挽输出,GPIO_Mode_Out_PP。RESET低,SET高
这里是低电平点亮(推挽下都可以,把led倒着插也可以闪)
代码
LED闪烁
GPIO_WriteBit()
#include "stm32f10x.h" // Device header #include "Delay.h" int main(void) { //时钟开启GPIOA的 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //初始化GPIO GPIO_InitTypeDef GPIO_InitStructure;//结构体存放参数 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//参数设置*3 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); while(1) { //法一 GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);//设为低电平 Delay_ms(500); GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);//设为高电平 Delay_ms(500); //法二 GPIO_ResetBits(GPIOA, GPIO_Pin_0); Delay_ms(500); GPIO_SetBits(GPIOA, GPIO_Pin_0); Delay_ms(500); //法三:0,1指定,强制类型转换为BitAction枚举 GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0); Delay_ms(500); GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1); Delay_ms(500); } }
LED流水灯
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
法一:GPIO_Pin_All选择所有端口(0-7)
法二:按位或操作 GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2······(0-15)(可)
GPIO_Write()整体操作(!!!!)(一个一个来没必要,太复杂)
(低电平点亮)所以 ~0x0001 , 按位取反(c语言不支持直接写二进制,所以转化为16进制)
int main(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDef GPIO_InitStructure;//结构体存放参数 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//参数设置*3 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); while(1) { GPIO_Write(GPIOA, ~0x0001); //0000 0000 0000 0001 Delay_ms(100); GPIO_Write(GPIOA, ~0x0002); //0000 0000 0000 0010 Delay_ms(100); GPIO_Write(GPIOA, ~0x0004); //0000 0000 0000 0100 Delay_ms(100); GPIO_Write(GPIOA, ~0x0008); //0000 0000 0000 1000 Delay_ms(100); GPIO_Write(GPIOA, ~0x0010); //0000 0000 0001 0000 Delay_ms(100); GPIO_Write(GPIOA, ~0x0020); //0000 0000 0010 0000 Delay_ms(100); GPIO_Write(GPIOA, ~0x0040); //0000 0000 0100 0000 Delay_ms(100); GPIO_Write(GPIOA, ~0x0080); //0000 0000 1000 0000 Delay_ms(100); } }
蜂鸣器!
GPIOB?Pin2 低电平触发
int main(void) { /*开启时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //开启GPIOB的时钟 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //GPIO引脚,赋值为第12号引脚 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); while (1) { GPIO_ResetBits(GPIOB, GPIO_Pin_12); //设为低电平,鸣叫 Delay_ms(100); GPIO_SetBits(GPIOB, GPIO_Pin_12); //高电平,停止 Delay_ms(100); GPIO_ResetBits(GPIOB, GPIO_Pin_12); Delay_ms(100); GPIO_SetBits(GPIOB, GPIO_Pin_12); Delay_ms(700); } }
连接方式
LED闪烁
LED流水灯
蜂鸣器
CTRL+F搜索