目录
在学习GPIO引脚前,先介绍一些函数:
库函数:stm32f10x_rcc
库函数:stm32f10x_gpio
这些函数怎么用呢?
那如何使用?:
完成初始化!
初始化完成后便可以进行一些GPIO的一些操作了
如:点亮共阳极LED
如:进行LED闪烁
如:进行LED取反
如:进行LED二进制显示
现在知道了怎么控制GPIO的输出那控制GPIO的输入呢?
初始化GPIOB
读取输入电平状态进行犍值扫描:
总结:
不管操作那个GPIO的都需要进行初始化,开启时钟设置工作数据,然后才能进行后续操
在学习GPIO引脚前,先介绍一些函数:
库函数:stm32f10x_rcc
RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
函数说明:
功能:启用或禁用高速APB (APB2)外设时钟。
参数:
RCC_APB2Periph: 指定APB2外设门控其时钟。
* 该参数可以是以下值的任意组合:
* rcc_apb2peri_afio, rcc_apb2peri_gpioa, rcc_apb2peri_gpiob,
* rcc_apb2peri_gpioc, rcc_apb2peri_gpiod, rcc_apb2peri_gpioe,
* rcc_apb2peri_gpiof, rcc_apb2peri_gpiog, rcc_apb2peri_adc1,
* rcc_apb2peri_adc2, rcc_apb2peri_tim1, rcc_apb2peri_spi1,
* rcc_apb2peripheral _tim8, rcc_apb2peripheral _usart1, rcc_apb2peripheral _adc3,
* rcc_apb2peripheral _tim15, rcc_apb2peripheral _tim16, rcc_apb2peripheral _tim17,
* rcc_apb2peripheral _tim9, rcc_apb2peripheral _tim10, rcc_apb2peripheral _tim11
* NewState:指定外设时钟的新状态,开启(ENABLE)关闭(DISABLE)
*没有返回值
通过函数说明可以知道这个函数是开启RCC相应外设寄存器时钟
库函数:stm32f10x_gpio
GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
函数说明:
功能:
根据指定的初始化GPIOx外设
参数:
GPIOx:其中x可以是(A..G)来选择GPIO外设。
参数:
GPIO_InitStruct:指向GPIO_InitTypeDef结构体的指针包含指定GPIO外设的配置信息。
GPIO_InitTypeDef:用默认值填充每个GPIO_InitStruct(结构体)成员
(这里可以打开库函数文件进行跳转直接阅读文件的函数说明就不详细介绍了)
没有返回值
根据函数说明可以知道,这个函数是用来初始化指定GPIO
GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
函数说明:
* 作用:设置所选数据端口位位高。
* 参数: GPIOx:其中x可以是(A..G)来选择GPIO外设。
* GPIO_Pin:指定要写入的端口位。
*该参数可以是GPIO_Pin_x的任意组合,其中x可以是(0..15)
* 没有返回值
根据函数说明可以知道这个函数是将指定GPIO置高电平
GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
函数说明:
* 作用:清除选定的数据端口位(将指定GPIO置低电平)。
* 参数:
GPIOx:
其中x可以是(A..G)来选择GPIO外设。
* GPIO_Pin:
指定要写入的端口位。
* 该参数可以是GPIO_Pin_x的任意组合,其中x可以是(0..15)。
* 没有参数
根据说明文档可以知道这个函数可以将指定GPIO置低电平
GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)
设置或清除所选的数据端口位。
* @param GPIOx:
其中x可以是(A..G)来选择GPIO外设。
* @param GPIO_Pin:
指定写入的端口位。
*该参数可以是GPIO_Pin_x中的一个,其中x可以是(0..15)。
* @param BitVal:
指定要写入选定位的值。
*该参数可以是BitAction枚举值中的一个:
* Bit_RESET清除端口引脚
* Bit_SET设置端口引脚
* @retval没有
根据函数说明可以知道这个函数是可以将指定GPIO置高或者置低的函数
GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)
作用:写入指定GPIO数据端口。
*参数:
GPIOx:其中x可以是(A..G)来选择GPIO外设。
* 参数:
PortVal:写入端口输出数据寄存器的值。
根据函数说明可以知道这个函数是一次将GPIO16个IO进行高低电平赋值。
GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
* @brief读取指定的输出数据端口位。
* @param GPIOx:
其中x可以是(A..G)来选择GPIO外设。
* @param GPIO_Pin:
指定要读取的端口位。
*该参数可以是GPIO_Pin_x,其中x为(0..15)。
* @retval输出端口pin值。
* /
根据函数说明可以知道这个函数是读取指定GPIO的输出状态的
GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
读取指定的输入端口引脚。
* @param GPIOx:
其中x可以是(A..G)来选择GPIO外设。
* @param GPIO_Pin:
指定要读取的端口位。
*该参数可以是GPIO_Pin_x,其中x为(0..15)。
* @retval输入端口引脚值(0或1)
由函数说明文档可以知道这个函数是读取指定GPIO输入状态的
这些函数怎么用呢?
通过导图可以知道GPIOX寄存器都挂在APB2总线上,所以就可以开启APB2总线时钟使能,
(理解不了就当是给指定寄存器供电吧,这是一个不恰当的方法!)
那又出现问题了,怎么控制APB2开启总线时钟呢?
RCC!
如图:RCC就是复位与时钟控制的资源
那如何使用?:
1:使用RCC开启APB2_GPIOA的时钟
2:使用GPIO初始化函数进行GPIO的参数初始化
完成初始化!
1:使用这些函数进行GPIO操作:
GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)将指定GPIO置高
GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)将指定GPIO置低
GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)将指定GPIO置高或者置低
GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)将指定GPIO16位一次赋值
GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);读取指定GPIO的电平
代码如下:
初始化GPIOB:
void APB_AInit(void)
{
//开启挂在RCC_APB2总线上的GPIOA时钟(打开时钟)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//GPIO_InitTypeDef结构体进行重新定义
GPIO_InitTypeDef GPIO_InitStructure;
//设置GPIOA工作模式(当前为推挽输出模式)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//工作模式
//启动GP4IOA上面的全部GPIOA0-7
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;//启动的IO口(GPIO_Pin_All全部打开)
//设置GPIOA工作频率(当前位最高50mhz)
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//工作频率
//将设置好的数据进行初始化赋值
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
GPIO工作模式的设置决定他是否在此次电路中能不能正常工作,所以一定要根据需要选则好需要的工作模式:
初始化完成后便可以进行一些GPIO的一些操作了
如:点亮共阳极LED
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
如:进行LED闪烁
GPIO_SetBits(GPIOA, GPIO_Pin_1);
Delay_ms(500);
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
Delay_ms(500);
如:进行LED取反
if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0) == 0)
{
GPIO_SetBits(GPIOA, GPIO_Pin_0);
}
else
{
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
}
如:进行LED二进制显示
GPIO_Write(GPIOA, 0x0001);
现在知道了怎么控制GPIO的输出那控制GPIO的输入呢?
更改工作模式即可,改为上拉输入即可
示例以GPIOB_pin_12,GPIOB_pin_13,为例
初始化GPIOB
void Key_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
读取输入电平的函数:GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
读取输入电平状态进行犍值扫描:
unsigned char Key_GetNum(void)
{
unsigned char KeyNum=0;
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12) == 0)
{
Delay_ms(20);
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12) == 0);
Delay_ms(20);
KeyNum=1;
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13) == 0)
{
Delay_ms(20);
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13) == 0);
Delay_ms(20);
KeyNum=2;
}
return KeyNum;
总结:
不管操作那个GPIO的都需要进行初始化,开启时钟设置工作数据,然后才能进行后续操作