GPIO初始化函数
GPIO_Ini:初始化GPIO引脚的模式,速度和引脚号
GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIOA的引脚0
GPIO输出控制函数
GPIO_SetBits:将指定的GPIO引脚设置为高电平
GPIO_SetBits(GPIOA, GPIO_Pin_0); // 将GPIOA的引脚0设置为高电平
GPIO_ResetBits:将指定的GPIO引脚设置为低电平
GPIO_ResetBits(GPIOA, GPIO_Pin_0); // 将GPIOA的引脚0设置为低电平
GPIO_WriteBit:写入指定的电平状态到GPIO引脚
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET); // 将GPIOA的引脚0设置为高电平
GPIO_Write:写入一个16位值到GPIO端口
GPIO_Write(GPIOA, 0x0001); // 将GPIOA的引脚0设置为高电平,其他引脚为低电平
GPIO输入读取函数
GPIO_ReadInputDataBit:读取指定GPIO引脚的电平状态
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_SET) {
// 引脚0为高电平
}
GPIO_ReadInputData:读取整个GPIO端口的输入状态
uint16_t portValue = GPIO_ReadInputData(GPIOA); // 读取GPIOA的输入状态
GPIO时钟使能函数
RCC_APB2PeriphClockCmd:使能GPIO端口的时钟。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA的时钟
时钟使能是指为某个外设(如GPIO、USART、SPI等)提供时钟信号,使其能够正常工作。
GPIO复用功能配置
GPIO_PinAFConfig:配置GPIO引脚的复用功能
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1); // 配置GPIOA的引脚9为USART1功能
GPIO引脚的复用功能是指将GPIO引脚用于除普通输入输出之外的其他功能。STM32的GPIO引脚不仅可以作为普通的数字输入或输出,还可以配置为其他外设功能(如USART、SPI、I2C、定时器等)的引脚。
点亮LED
#include "stm32f10x.h" // 包含STM32F10x系列的头文件int main(void) {// 使能GPIOA的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 定义并初始化GPIO结构体GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 修正拼写错误:GPIO_Mode_OUT_PP -> GPIO_Mode_Out_PPGPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 选择引脚0GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置输出速度为50MHz// 初始化GPIOA的引脚GPIO_Init(GPIOA, &GPIO_InitStructure);// 将GPIOA的引脚0设置为低电平GPIO_ResetBits(GPIOA, GPIO_Pin_0); // 修正拼写错误:GPIO_ResetLBits -> GPIO_ResetBits// 主循环while (1) {// 可以在这里添加其他逻辑}
}
LED闪烁
#include "stm32f10x.h" // 包含STM32F10x系列的头文件
#include "Delay.h"
int main(void) {// 使能GPIOA的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 定义并初始化GPIO结构体GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 修正拼写错误:GPIO_Mode_OUT_PP -> GPIO_Mode_Out_PPGPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 选择引脚0GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置输出速度为50MHz// 初始化GPIOA的引脚GPIO_Init(GPIOA, &GPIO_InitStructure);// 主循环while (1) {GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);Delay_ms(500);GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);Delay_ms(500);}
}
流水灯
#include "stm32f10x.h" // 包含STM32F10x系列的头文件
#include "Delay.h"
int main(void) {// 使能GPIOA的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 定义并初始化GPIO结构体GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 修正拼写错误:GPIO_Mode_OUT_PP -> GPIO_Mode_Out_PPGPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1|GPIO_Pin_2; // 选择引脚0GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置输出速度为50MHzGPIO_Init(GPIOA,&GPIO_InitStructure);// 主循环while (1) {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,~0x00010);Delay_ms(500);GPIO_Write(GPIOA,~0x00020);Delay_ms(500);GPIO_Write(GPIOA,~0x00040);Delay_ms(500);GPIO_Write(GPIOA,~0x00080);Delay_ms(500);}
}
蜂鸣器
#include "stm32f10x.h" // 包含STM32F10x系列的头文件
#include "Delay.h"
int main(void) {// 使能GPIOA的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);// 定义并初始化GPIO结构体GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 修正拼写错误:GPIO_Mode_OUT_PP -> GPIO_Mode_Out_PPGPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; // 选择引脚0GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置输出速度为50MHzGPIO_Init(GPIOA,&GPIO_InitStructure);// 主循环while (1) {GPIO_Write(GPIOB,GPIO_Pin_12);Delay_ms(500);GPIO_Write(GPIOB,GPIO_Pin_12);Delay_ms(500);}
}
GPIO使用步骤:初始化时钟,然后定义结构体,赋值结构体
GPIO_Mode选择输入输出模式
GPIO_Pin选择引脚
GPIO_Speed选择速度
OLED:有机发光二极管
OLED驱动函数
STM32中断系统
外部中断
定时器
输出比较功能
输出比较(Output Compare,OC) 是定时器(Timer)的一种功能,用于生成精确的时间信号或控制外部设备(如PWM信号、脉冲生成等)。输出比较功能通过比较定时器的计数器值(CNT)和捕获/比较寄存器(CCR)的值,来触发特定的事件(如翻转输出、产生中断等)。
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"uint8_t i; //定义在定时器中断里自增的变量int main(void)
{/*模块初始化*/OLED_Init(); //OLED初始化PWM_Init(); //定时中断初始化while (1){for(i=0;i<=100;i++){PWM_SetComparel(i);Delay_ms(10);}for(i=0;i<=100;i++){PWM_SetComparel(100-i);Delay_ms(10);}
}