使用GPIO_Pin_x其实是使用#define重命名后的GPIO_Pin_x的十六进制位
以GPIO_Pin_0到GPIO_Pin_7为例,他们被定义的十六进制为:
#define GPIO_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected 00000001*/
#define GPIO_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected 00000010*/
#define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected 00000100*/
#define GPIO_Pin_3 ((uint16_t)0x0008) /*!< Pin 3 selected 00001000*/
#define GPIO_Pin_4 ((uint16_t)0x0010) /*!< Pin 4 selected 00010000*/
#define GPIO_Pin_5 ((uint16_t)0x0020) /*!< Pin 5 selected 00100000*/
#define GPIO_Pin_6 ((uint16_t)0x0040) /*!< Pin 6 selected 01000000*/
#define GPIO_Pin_7 ((uint16_t)0x0080) /*!< Pin 7 selected 10000000*/GPIO_Write直接传入GPIO_Pin_x会把他设置成为低电平,不对其他GPIO_Pin_x进行操作,但是我们这里想要的是给指定位设置成低电平其他位设置成高电平所以进行取反操作,通过~0x0001操作得到0xFFFE(忽略高位,实际操作中只关心低16位),意味着除了GPIOA的最低位(第0位GPIO_Pin_0)之外的所有位都被设置为高电平,而最低位的状态是低电平。
然后使用Delay延迟一段时间在进行下一次位操作实现流水灯效果
点击跳转到Delay定时器实现文件
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIOA_CONFIG;
GPIOA_CONFIG.GPIO_Mode = GPIO_Mode_Out_PP;
GPIOA_CONFIG.GPIO_Pin = GPIO_Pin_All;
GPIOA_CONFIG.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIOA_CONFIG);
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,~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);
}
}
评论 (0)