关于C语言中的强制类型转换

以下实例为STM32单片机使用寄存器进行操作的一个头文件中的代码

因为直接对寄存器进行操作,也就是直接对地址中的数据进行操作,因为知道了寄存器所在的地址所以就强制把常量转换为地址,然后对地址进行操作

//define用参数1来直接代替参数2,是直接代替不做检查,只有在使用的时候出错才会在对应的位置提示错误
//因为是直接代替,所以还是加上括号比较好

#define PERIPH_BASE      ((unsigned int)0x40000000)
	
#define APB2PERIPH_BASE  (PERIPH_BASE + 0x00010000)

#define GPIOC_BASE       (APB2PERIPH_BASE + 0x1000)

//强制类型转换,首先是强制转换为指针类型,然后取指针中的数据
//(unsigned int*)(GPIOC_BASE+0x00)强制转换为地址类型,地址为GPIOC_BASE+0x00
//*(unsigned int*)(GPIOC_BASE+0x00)取强制获取到的地址中的数据
#define GPIOC_CRL 	 	 *(unsigned int*)(GPIOC_BASE+0x00)		
#define GPIOC_CRH 	 	 *(unsigned int*)(GPIOC_BASE+0x04)
#define GPIOC_IDR 	 	 *(unsigned int*)(GPIOC_BASE+0x08)
#define GPIOC_ODR 	 	 *(unsigned int*)(GPIOC_BASE+0x0C)
#define GPIOC_BSRR 	 	 *(unsigned int*)(GPIOC_BASE+0x10)
#define GPIOC_BRR 	 	 *(unsigned int*)(GPIOC_BASE+0x14)
#define GPIOC_LCKR 	 	 *(unsigned int*)(GPIOC_BASE+0x18)


#define AHBPERIPH_BASE   (PERIPH_BASE + 0x20000)

#define RCC_BASE 		 (AHBPERIPH_BASE + 0x1000)
#define RCC_APB2ENR 	 *(unsigned int*)(RCC_BASE+0x18)

猜你喜欢

转载自blog.csdn.net/qq_39089444/article/details/87865403