前提:你已经下好了标准外设库,如果没有可以去找找教程 ST官网上可以下载
目录
前提:你已经下好了标准外设库,如果没有可以去找找教程 ST官网上可以下载
点灯逻辑
开始
│
├── 定义 GPIO 初始化结构体
│
├── 开启 GPIOA 时钟
│
├── 初始关闭 LED(输出高电平)
│
├── 配置 GPIOA Pin1为推挽输出
│
├── 点亮 LED(输出低电平)
│
└── 进入死循环,保持状态不变
1. 定义 GPIO 初始化结构体
GPIO_InitTypeDef gpio_initstruct = {0};
/* 使用结构体 GPIO_InitTypeDef 来配置 GPIO 的工作模式。
{0} 表示清零结构体内容,避免使用未初始化的数据。
*/
解释:
//结构体原型
typedef struct
{
uint16_t GPIO_Pin; /*< 用于指定要配置的 GPIO 引脚 */
GPIOSpeed_TypeDef GPIO_Speed; /*用于设定所选引脚的速度*/
GPIOMode_TypeDef GPIO_Mode; /*用于指定所选引脚的操作模式*/
}GPIO_InitTypeDef;
2. 开启GPIOA的时钟
这张图可以知道我们点亮的灯是在由PA1引脚控制
一、PA1
的含义
- P:表示这是一个 Port(端口)。
- A:表示这是 GPIOA(General Purpose Input/Output Port A) 端口。
- 1:表示这是 GPIOA 端口中的 Pin1(引脚 1)。
因此,PA1
具体指的是 GPIOA 端口的第 1 号引脚。
根据这张图我们可以知道
Cortex-M3 通过 DCode 或 System 总线连接到 AHB 系统总线。
AHB 系统总线 通过 桥接器(桥接 1) 连接到 APB2 总线。
APB2 总线 连接到 GPIOA。
接下来我们就来写代码:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
/* RCC STM32 中管理时钟和复位的模块
APB2 高级外设总线
Periph 外设
Clock Clock 时钟 控制该外设的时钟
Cmd Command 命令 表示这是一个“命令”函数,用来开启或关闭
*/
解释:
//函数原型
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
//功能:根据传入的参数,决定是否开启或关闭某个 APB2 外设的时钟
uint32_t RCC_APB2Periph:表示要操作的 APB2 总线上的某个外设。
比如:RCC_APB2Periph_GPIOA(GPIOA 端口)、RCC_APB2Periph_USART1(串口1)等。
FunctionalState NewState:是一个枚举类型,表示要设置的状态。
只有两个值:
ENABLE:开启该外设的时钟
DISABLE:关闭该外设的时钟
3.初始关闭 LED(输出高电平)
- 由图可知需要低电平才会有电势差,才能点亮LED灯。
- 💡 这里先让 LED 熄灭是为了确保初始状态。
GPIO_SetBits(GPIOA,GPIO_Pin_1);
功能:将GPIOA中的引脚1设置为高电平。
//函数原型
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
GPIO_TypeDef* GPIOx:这个参数表示你要操作的是哪个 GPIO 端口
uint16_t GPIO_Pin:它表示你要操作的是该端口下的 哪一个具体的引脚
4.配置 GPIOA Pin1为推挽输出
//配置io模式 推挽模式,50m
gpio_initstruct.GPIO_Pin = GPIO_Pin_1;
gpio_initstruct.GPIO_Mode = GPIO_Mode_Out_PP;
gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&gpio_initstruct);//配置端口引脚的模式
解释:
gpio_initstruct.GPIO_Pin = GPIO_Pin_1;
gpio_initstruct.GPIO_Mode = GPIO_Mode_Out_PP;
gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;
这三句是开头初始化的那个结构体,现在是来设置具体模式和参数了。
GPIO_Init(GPIOA, &gpio_initstruct);
这个代码的意思是:初始化某个 GPIO 引脚的模式和参数
参数说明:
GPIO_TypeDef* GPIOx:表示你要操作的是哪个端口
GPIO_InitStruct:是一个结构体指针,指向你配置好的 GPIO 参数:
引脚编号(Pin)
工作模式(Mode)
输出速度(Speed)
5.点亮 LED(输出低电平)
GPIO_ResetBits(GPIOA,GPIO_Pin_1); 功能:将GPIOA中的引脚1设置为低电平。
设置为低电平灯就有了电势差,就可以亮了。
最后加个while(1);就可以一直亮了;
int main(void)
{
GPIO_InitTypeDef gpio_initstruct = {0};//初始化gpio结构体
//开启端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //开启端口时钟
//关闭灯
GPIO_SetBits(GPIOA,GPIO_Pin_1);//让端口引脚输出1,使得灯灭
//配置io模式 推挽模式,50m
gpio_initstruct.GPIO_Pin = GPIO_Pin_1;
gpio_initstruct.GPIO_Mode = GPIO_Mode_Out_PP;
gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&gpio_initstruct);//配置端口引脚的模式
//开灯
GPIO_ResetBits(GPIOA,GPIO_Pin_1);//让端口引脚输出0,使得灯亮
while(1);
}