GPIOE->ODR = GPIOE->ODR & 0xff00 | Newdata; 使用BRR和BSRR寄存器可以方便地快速地实现对端口某些特定位的操作,而不影响其它位的状态。 比如希望快速地对GPIOE的位7进行翻转,则可以: GPIOE->BSRR = 0x80; //置'1' GPIOE->BRR = 0x80; //置'0' 如果使用常规'读-改-写'的方法: GPIOE->ODR = ...
在MDK中有以下定义,计算GPIOB_ODR寄存器地址为 . #define PERIPH_BASE ((uint32_t)0x40000000) #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) #define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00) #define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) typedef struct { __IO uint32_t CRL; _...
通用输入输出端口GPIO
PD_ODR ^= (1 << 5); //通过异或取反控制LED1 等效于PD_ODR = PD_ODR ^(1 << 5) ^是异或运算,(1<<5)其实就是0x20,上面的意思是当PA4 == 0 时,PortD_ODR的第5位取反,其余位状态不变,即为1左移5位,二进制即为 0010 0000 image.png 相当于,每次按下KEY1,当PA4 == 0的之后,函数几对...
PA_CR1 = 0xFF; PA_CR2 = 0x00; 当然,当定义单独一个引脚时,分别定义为 PA_CR1_C10 = 1; //PA0 PA_CR2_C20 = 0; 3、输出数据寄存器 ODR 当对应 IO 口定义为输出时,如何输出一个让程序控制的数值呢?这就要用到输出数据寄存器。具体实现的是当向对应的输出数据寄存器写入数据时,这个数值就会在对应...
GPIOE->ODR = GPIOE->ODR & 0xFF7F; // 置'0'有⼈问是否BSRR的⾼16位是多余的,请看下⾯这个例⼦:假如你想在⼀个操作中对GPIOE的位7置'1',位6置'0',则使⽤BSRR⾮常⽅便:GPIOE->BSRR = 0x00400080;如果没有BSRR的⾼16位,则要分2次操作,结果造成位7和位6的变化不同步!GPI...
PA_CR1 = 0xFF; PA_CR2 = 0x00; 当然,当定义单独一个引脚时,分别定义为 PA_CR1_C10 = 1; //PA0 PA_CR2_C20 = 0; 3、输出数据寄存器ODR 当对应IO 口定义为输出时,如何输出一个让程序控制的数值呢?这就要用到输出数据寄存器。具体实现的是当向对应的输出数据寄存器写入数据时,这个数值就会在对应的引...
相当于,每次按下KEY1,当PA4 == 0的之后,函数几对ODR5的状态进行翻转。因此实现了LED1的亮灭! 补充: 和0 “与” A&0 = 0 清零操作,一般把低8位清零 A & FF00 和1 “或” A|1 = 1 置一操作 和1 “异或” A^ 1 = 0 取反操作