点亮LED的三种写法
首先初始化对应的引脚时钟和配置模式
// 开启GPIOC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
// GPIO初始化
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; // PC13引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure); // 配置GPIOC
这里演示的是标准库,HAL库按照标准Write就行。
// 方法1:使用GPIO_ResetBits/GPIO_SetBits
GPIO_ResetBits(GPIOC, GPIO_Pin_13); // PC13低电平
Delay_ms(500);
GPIO_SetBits(GPIOC, GPIO_Pin_13); // PC13高电平
Delay_ms(500);
// 方法2:使用GPIO_WriteBit
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET); // PC13低电平
Delay_ms(500);
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET); // PC13高电平
Delay_ms(500);
// 方法3:直接写入0/1
GPIO_WriteBit(GPIOC, GPIO_Pin_13, (BitAction)0); // PC13低电平
Delay_ms(500);
GPIO_WriteBit(GPIOC, GPIO_Pin_13, (BitAction)1); // PC13高电平
Delay_ms(500);
// 方式4:GPIO_Write整体端口写入(单引脚控制)
u16 port_val = GPIO_ReadOutputData(GPIOC); // 读取GPIOC当前输出值
port_val &= ~GPIO_Pin_13; // 清PC13位(低电平)
GPIO_Write(GPIOC, port_val); // 写入新值
Delay_ms(500);
port_val = GPIO_ReadOutputData(GPIOC); // 读取当前值
port_val |= GPIO_Pin_13; // 置PC13位(高电平)
GPIO_Write(GPIOC, port_val);
Delay_ms(500);
// STM32F103位带操作宏定义(GPIO输出寄存器位带)
#define GPIOBIT_ADDR(addr, bitnum) ((addr & 0xF0000000) + 0x2000000 + ((addr & 0xFFFFF) << 5) + (bitnum << 2))
#define GPIOBIT_SET(addr, bitnum) (*(volatile unsigned int *)GPIOBIT_ADDR(addr, bitnum) = 1)
#define GPIOBIT_CLR(addr, bitnum) (*(volatile unsigned int *)GPIOBIT_ADDR(addr, bitnum) = 0)
// GPIOC的输出数据寄存器地址:0x4001100C(STM32F103)
#define GPIOC_ODR_ADDR 0x4001100C
// 方法5:位带操作控制PC13
GPIOBIT_CLR(GPIOC_ODR_ADDR, 13); // 清PC13位(低电平点亮LED)
Delay_ms(500);
GPIOBIT_SET(GPIOC_ODR_ADDR, 13); // 置PC13位(高电平熄灭LED)
Delay_ms(500);
// 方法6.1:直接操作ODR寄存器
GPIOC->ODR &= ~GPIO_Pin_13; // 清PC13位(低电平),保留其他引脚值
Delay_ms(500);
GPIOC->ODR |= GPIO_Pin_13; // 置PC13位(高电平),保留其他引脚值
Delay_ms(500);
// 方法6.2:直接操作BSRR寄存器
GPIOC->BSRR = GPIO_Pin_13 << 16; // 高16位:复位PC13(低电平)
Delay_ms(500);
GPIOC->BSRR = GPIO_Pin_13; // 低16位:置位PC13(高电平)
Delay_ms(500);
// 方法6.3:直接操作BRR寄存器(复位)+ BSRR(置位)
GPIOC->BRR = GPIO_Pin_13; // 复位PC13(低电平)
Delay_ms(500);
GPIOC->BSRR = GPIO_Pin_13; // 置位PC13(高电平)
Delay_ms(500);
// 自定义GPIO电平控制宏
#define LED_ON() GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET) // 点亮LED(低电平)
#define LED_OFF() GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET) // 熄灭LED(高电平)
#define LED_TOGGLE() GPIO_WriteBit(GPIOC, GPIO_Pin_13, !GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13)) // 电平翻转

浙公网安备 33010602011771号