1. 简介:
此文章的目的是能使用固件库,并不是深究固件库的细节,会随着时间的推移而增加内容。
固件库的版本是:3.5.0
2. 程序:
先从程序开始,探索 gpio 的配置和 操作 gpio,以 led 为例最合适不过
#define LED_D3_ON() GPIO_ResetBits(GPIOF, GPIO_Pin_8)
#define LED_D3_OFF() GPIO_SetBits(GPIOF, GPIO_Pin_8)
void LED_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE); // 使能 GPIOF 的时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOF, &GPIO_InitStructure);
LED_D3_ON();
}
3. 过程分析:
【1】stm32芯片出于对电源管理的考虑,将外设的时钟都分别的进行配置,因此,第一件事就是打开某外设的时钟
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
参数:
对 gpio 来说 RCC_APB2Periph 的选值可以是
NewState 的取值是 ENABLE、DISABLERCC_APB2Periph_GPIOA
RCC_APB2Periph_GPIOB
...
RCC_APB2Periph_GPIOG
他们可以是 取或 来同时操作多个 io
【2】声明一个 gpio 结构体
typedef struct
{
uint16_t GPIO_Pin; /* 指定哪个 GPIO */
GPIOSpeed_TypeDef GPIO_Speed; /* 指定引脚的速度 */
GPIOMode_TypeDef GPIO_Mode; /* 指定引脚的上下拉等的属性/模式 */
}GPIO_InitTypeDef;
成员:
选中哪个引脚 GPIO_Pin,可以取值:
GPIO_Pin_0
GPIO_Pin_1
...
GPIO_Pin_15
GPIO_Pin_All
同样上边除All外,可以取 或
选中引脚的上下拉的设置 GPIO_Mode,可以取值 :
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 // 推挽复用
选中引脚 驱动电路的响应速度 GPIO_Speed,当然波特率输出的越大,可以想象的是功耗越高,同时,高的频率对应了高的噪声,可以取值:
GPIO_Speed_10MHz
GPIO_Speed_2MHz
GPIO_Speed_50MHz
【3】将引脚的属性赋值给相应的 IO
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
【4】操作 gpio
置位引脚,即将某引脚置 1 :
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
清零引脚,即将某引脚清 0:
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
清零引脚,GPIO_ResetBits