点亮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)) // 电平翻转
posted @ 2025-12-20 08:28  雾削木  阅读(4)  评论(0)    收藏  举报