STM32中操作寄存器GPIOB_CRL &= ~( 0x0F<< (4*0))与GPIOB_CRL &=~(0x0F)之间有啥区别吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32中操作寄存器GPIOB_CRL &= ~( 0x0F<< (4*0))与GPIOB_CRL &=~(0x0F)之间有啥区别吗?相关的知识,希望对你有一定的参考价值。
在一本书上看到的,它说GPIOB_CRL &= ~( 0x0F<< (4*0))只会改变PB0的引脚寄存器,不会改变其他引脚的状态,可是~(0x0F<<(4*0))=0xF0,不还有其他4位被置一了吗?所以有些疑惑,还有~(0x0F<<(4*0))和~0x0F有什么区别吗?
没有区别,在这个代码中用到4*0的作用是因为是用的是作用于PB0,而4是对应GPIO设置的最小位数,将4*0中的0改为1后就可以对PB1进行操作,这种写法是为了后续操作的快捷。所以对于只用到PB0的程序~(0x0F<<(4*0))和~0x0F是没有区别的,而若是使程序以后的修改更加的便利,还是推荐书上的那种写法,希望采纳。 参考技术A #include "stm32f10x.h"#include "GPIO_Config.h"
/*********************************************************************************/
/***GPIO_Config***/
void GPIO_Config(void)
RCC -> APB2ENR |= 1<<0; //开启AFIO IO口辅助功能时钟使能
// RCC -> APB2ENR |= 0x1c; //开启GPIO——A,B ,C
RCC -> APB2ENR |= 0x7c; //开启GPIO——A,B ,C,D,E 103VET6
// AFIO -> MAPR &= ~(0x0f<<24);AFIO -> MAPR |= 2<<24; //配置前先清除;关闭JTAG-DP +SW-DP功能
RCC -> APB2RSTR |= 0x7c;RCC -> APB2RSTR &= ~0x7c; //复位GPIO——A-B-C-D-E,并清除复位
// GPIOA -> CRL = 0x33333333;GPIOA -> CRH = 0x33333333; //推挽 输出 50MHZ
// GPIOB -> CRL = 0x33333333;GPIOB -> CRH = 0x33333333;
// GPIOC -> CRL = 0x33333333;GPIOC -> CRH = 0x33333333;
// GPIOD -> CRL = 0x33333333;GPIOD -> CRH = 0x33333333;
// GPIOE -> CRL = 0x33333333;GPIOE -> CRH = 0x33333333;
/*********************************************************************************/
/***GPIO_Port_Enable***/
void GPIO_Port_Mode(GPIO_TypeDef *GPIO_Numtemp,unsigned char GPIO_PortNum,unsigned char GPIO_PortMode)
GPIO_PortMode &= 0x0f;GPIO_PortNum &= 0x0f;
if(GPIO_PortNum < 8)
GPIO_PortNum *= 4;
GPIO_Numtemp -> CRL &= ~(0x0f <<GPIO_PortNum); //配置前先清除
GPIO_Numtemp -> CRL |= GPIO_PortMode <<GPIO_PortNum; //重新配置 GPIO XX 端口 功能
else
GPIO_PortNum -= 8;
GPIO_PortNum *= 4;
GPIO_Numtemp -> CRH &= ~(0x0f <<GPIO_PortNum);
GPIO_Numtemp -> CRH |= GPIO_PortMode <<GPIO_PortNum;
/**********************************************************************************/ 参考技术B 本人小白,对于=0xf0,寄存器与0xf0,低四位正好至0 参考技术C 我回答一下其他没有回答的那个问题,和1相与是其本身所以不影响
STM32寄存器
1. STM32中寄存器实际是线性内存单元上对应的一个地址
2. 如GPIOA->ODR寄存器实际是对内存上某一单元的操作
#define GPIOA_BASE (APB2PERIPH_BASE + 0x00000800U) //定义GPIOA的基地址 #define GPIOA ((GPIO_TypeDef *)GPIOA_BASE) //此处将GPIOA的基地址转换为GPIO_TypeDef指针类型,相当于在地址值后划分 GPIO_TypeDef大小的内存空间 typedef struct { __IO uint32_t CRL;//相当于在基地址基础上偏移0个字节 0x00000804U //__IO实际是 volatile ,此处代表在基地址上偏移32位的地址内存,为易变的类型,所以此处取值每次都会访问内存 __IO uint32_t CRH;//在基地址上偏移4个字节 0x00000808U __IO uint32_t IDR;//在基地址基础上偏移8个字节 0x0000080CU __IO uint32_t ODR;//在基地址基础上偏移12个字节 __IO uint32_t BSRR;//在基地址基础上偏移16个字节 __IO uint32_t BRR;//在基地址基础上偏移20个字节 __IO uint32_t LCKR;//在基地址基础上偏移24个字节 } GPIO_TypeDef;
以上是关于STM32中操作寄存器GPIOB_CRL &= ~( 0x0F<< (4*0))与GPIOB_CRL &=~(0x0F)之间有啥区别吗?的主要内容,如果未能解决你的问题,请参考以下文章