目录
电路连接
GPIO口的配置
1.RCC开启GPIO时钟
2.初始化GPIO
3.使用库函数操作GPIO输出高低电平
--代码
--实验效果
将LED连接到STM32的PA0上。实物发光二极管长引脚接正极;短引脚接PA0上。
因为LED负极接在STM32上,所以我们的任务就是控制单片机对应的I/O口输出高低电平来控制LED亮灭。所以IO口应该选择推挽输出模式。此时LED连接状态为低电平导通。(I/O的基本结构与8种输入输出模式区别)。
接下来来配置GPIO。配置GPIO需要有三步
在rcc.h文件里可以找到函数定义。因为GPIO是挂在APB2上的,我们要找到APB2外设时钟控制。
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
右键,点击函数定义(Go To Definition),可以看到两个参数可以选的值,第一个值可以选以下值
RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB,
RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE,
RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1,
RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1,
RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3,
RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17,
RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11
第二个值可以选择 ENABLE or DISABLE 。 选择黑色加粗的参数,就配置好时钟了。
用结构体参数来初始化GPIO口。先定义一个结构体变量,在进行赋值,
最后调用 GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) 函数进行初始化。
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //定义完成后输入GPIO_InitStructure. 后面会出现Mode ,Pin,Speed变量并配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // GPIO_Mode_Out_PP推挽输出 GPIO_Pin_0PA0
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50MHz速度GPIO_Init(GPIOA, &GPIO_InitStructure); //最后调用GPIO_Init() 完成初始化
完成初始化后就可以通过库函数来操作输出高低电平了,同样打开stm32f10x_gpio.h可以找到函数声明,右键(goto definition)可以到 .c 文件里查找函数定义。
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); //置高电平1
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); //置低电平0
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal); //写入高低电平, BitAction BitVal 可写 Bit_RESET 置0或者Bit_SET 置1
#include "stm32f10x.h" // Device header
#include "Delay.h"
//LED闪烁
int main(void)
{
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);
while(1)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
Delay_ms(500);
GPIO_SetBits(GPIOA,GPIO_Pin_0);
Delay_ms(500);
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
Delay_ms(500);
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
Delay_ms(500);
GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)0);//BitAction 强制类型转换 0低电平
Delay_ms(500);
GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)1);
Delay_ms(500);
}
}
LED闪烁代码 其中Delay_ms 延时函数 ,主循环中, 三种配置方式都可以使LED闪烁。
#include "stm32f10x.h" // Device header
#include "Delay.h"
//LED流水灯
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
while(1)
{
unsigned char i = 0;
//方法一
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);
GPIO_Write(GPIOA,~0x0020);
Delay_ms(500);
GPIO_Write(GPIOA,~0x0040);
Delay_ms(500);
GPIO_Write(GPIOA,~0x0080);
Delay_ms(500);
//方法二
for(i=0;i<8;i++)
{
GPIO_Write(GPIOA,~(0x0001<
LED流水灯代码 其中的 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; 选择了16个端口全部打开。
#define GPIO_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */
#define GPIO_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected */
#define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */
#define GPIO_Pin_3 ((uint16_t)0x0008) /*!< Pin 3 selected */
#define GPIO_Pin_4 ((uint16_t)0x0010) /*!< Pin 4 selected */
#define GPIO_Pin_5 ((uint16_t)0x0020) /*!< Pin 5 selected */
或者可以将其配置成 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3......GPIO_Pin_7;
因为由定义可知,GPIO_Pin_0 是 0x0001 相当于二进制 0000 0000 0000 0001
GPIO_Pin_1 是 0x0002 相当于二进制 0000 0000 0000 0010
所以 GPIO_Pin_0 GPIO_Pin_7 全部通过 或 操作 最后变成 二进制 0000 0000 0111 1111 也就相当于选择了PA0 - PA7的端口打开,
而上述代码段 GPIO_Pin_All 的二进制相当于 1111 1111 1111 1111 选取了全部的PA口都打开了。
方法一 是采用了逐位设置 高电平然后取反成低电平点亮。
方法二 采用了循环,每隔500ms,循环左移一位。 函数 GPIO_Write( ) 的定义和使用方法就不多在赘述了,可以前往.c文件查看用法。
STM32 点亮LED 闪烁-CSDN
STM32 LED 流水灯-CSDN
附
GPIO模式 GPIO_Mode_AIN (Analog IN) 模拟输入
GPIO_Mode_IN_FLOATING 浮空输入
GPIO_Mode_IPD(In Pull Down) 下拉输入
GPIO_Mode_IPU(In Pull UP) 上拉输入
GPIO_Mode_Out_OD(Out Open Drain) 开漏输出
GPIO_Mode_Out_PP(Out Push Pull) 推挽输出
GPIO_Mode_AF_OD(Alt Open Drain) 复用开漏输出
GPIO_Mode_AF_PP(Alt Push Pull) 复用推挽输出