每组IO口含下面7个寄存器。7个寄存器可以控制一组GPIO的16个IO口。
- GPIOx_CRL:端口配置低寄存器
- GPIOx_CRH:端口配置高寄存器
- GPIOx_IDR:端口输入寄存器
- GPIOx_ODR:端口输出寄存器
- GPIOx_BSRR:端口位设置 / 清除寄存器
- GPIOx_BRR:端口位清除寄存器
- GPIOx_LCKR:端口配置锁存寄存器
注:IO口输出高电平,LED灭,输出低电平,LED点亮。
头文件:stm32f10x.h
注:操作IO口必须引入的源文件和头文件。
初始化函数:
- void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
4个设置输出电平函数:
- void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
- 作用:设置某个IO口输出为高电平(1)。实际操作BSRR寄存器
- void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
- 作用:设置某个IO口输出为低电平(0)。 实际操作BSRR寄存器
- void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
- 作用:用来设置IO口输出电平。
- void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
- 作用:用来设置IO口输出电平。
1.点亮LED灯
#include "stm32f10x.h"
void LED_Init(void){
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // PB,PE端口时钟
// 可以一次初始化一个IO组下的多个IO,前提是这些IO口的配置方式一样。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); // 根据设定参数初始化 GPIOB.5
GPIO_SetBits(GPIOA,GPIO_Pin_5); // PB.5 输出高
}
int main(void){
LED_Init(); // 初始化与LED连接的硬件接口
while(1){
}
}
代码运行结果:
2.点亮全部的LED灯
#include "stm32f10x.h"
void LED_Init(void){
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // PB,PE端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8; // LED0-->PB.5 端口配置,LED1-->PB.6 端口配置,LED2-->PB.7 端口配置,LED3-->PB.8 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); // 根据设定参数初始化 GPIOB.5,GPIOB.6,GPIOB.7,GPIOB.8
GPIO_SetBits(GPIOA, GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8); // PB.5,PB.6,PB.7,PB.8 输出高
}
int main(void){
LED_Init(); // 点亮全部的led灯
while(1){
}
}
代码运行结果:
3.LED等闪烁
#include "stm32f10x.h"
void delay_ms(uint16_t t){
// 延迟函数
uint16_t i;
for(;t>0;t--)
for(i = 0;i<7500;i++);
}
void LED_Init(void){
GPIO_InitTypeDef GPIO_InitStructure;
void LED_Init(void){
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // PB,PE端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); // 根据设定参数初始化 GPIOB.5
GPIO_SetBits(GPIOA,GPIO_Pin_5); // PB.5 输出高
}
int main(void){
LED_Init(); // 初始化与LED连接的硬件接口
while(1){
GPIO_SetBits(GPIOA, GPIO_Pin_5); // 输出低电平,点亮led灯
delay_ms(1000); // 调用延迟函数
GPIO_ResetBits(GPIOA, GPIO_Pin_5); // 输出高电平,熄灭led灯
delay_ms(1000);
}
}
4.流水灯实现左移
#include "stm32f10x.h"
void delay_ms(uint16_t t){
// 延迟函数
uint16_t i;
for(;t>0;t--)
for(i = 0;i<7500;i++);
}
void LED_Init(void){
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // PB,PE端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8; // LED0-->PB.5 端口配置,LED1-->PB.6 端口配置,LED2-->PB.7 端口配置,LED3-->PB.8 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); // 根据设定参数初始化 GPIOB.5,GPIOB.6,GPIOB.7,GPIOB.8
GPIO_SetBits(GPIOA, GPIO_Pin_5); // PB.5
}
int main(void){
LED_Init(); // 初始化与LED连接的硬件接口
while(1){
GPIO_SetBits(GPIOA, GPIO_Pin_5); // 输出低电平,点亮led灯
delay_ms(100); // 调用延迟函数
GPIO_ResetBits(GPIOA, GPIO_Pin_5); // 输出高电平,熄灭led灯
delay_ms(100);
GPIO_SetBits(GPIOA, GPIO_Pin_6);
delay_ms(100); // 调用延迟函数
GPIO_ResetBits(GPIOA, GPIO_Pin_6);
delay_ms(100);
GPIO_SetBits(GPIOA, GPIO_Pin_7);
delay_ms(100); // 调用延迟函数
GPIO_ResetBits(GPIOA, GPIO_Pin_7);
delay_ms(100);
GPIO_SetBits(GPIOA, GPIO_Pin_8);
delay_ms(100); // 调用延迟函数
GPIO_ResetBits(GPIOA, GPIO_Pin_8);
delay_ms(100);
}
}
5.流水灯实现右移
#include "stm32f10x.h"
void delay_ms(uint16_t t){
// 延迟函数
uint16_t i;
for(;t>0;t--)
for(i = 0;i<7500;i++);
}
void LED_Init(void){
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // PB,PE端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8; // LED0-->PB.5 端口配置,LED1-->PB.6 端口配置,LED2-->PB.7 端口配置,LED3-->PB.8 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); // 根据设定参数初始化 GPIOB.5,GPIOB.6,GPIOB.7,GPIOB.8
GPIO_SetBits(GPIOA, GPIO_Pin_8); // PB.8
}
int main(void){
LED_Init(); // 初始化与LED连接的硬件接口
while(1){
GPIO_SetBits(GPIOA, GPIO_Pin_8); // 输出低电平,点亮led灯
delay_ms(100);// 调用延迟函数
GPIO_ResetBits(GPIOA, GPIO_Pin_8); // 输出高电平,熄灭led灯
delay_ms(100);
GPIO_SetBits(GPIOA, GPIO_Pin_7);
delay_ms(100);
GPIO_ResetBits(GPIOA, GPIO_Pin_7);
delay_ms(100);
GPIO_SetBits(GPIOA, GPIO_Pin_6);
delay_ms(100);
GPIO_ResetBits(GPIOA, GPIO_Pin_6);
delay_ms(100);
GPIO_SetBits(GPIOA, GPIO_Pin_5);
delay_ms(100);
GPIO_ResetBits(GPIOA, GPIO_Pin_5);
delay_ms(100);
}
}
转载:https://blog.csdn.net/qq_44989881/article/details/117405184
查看评论