在stm32中实现
#define APB2_BUS_BASE ((uint32_t)0x40010000U) /*!< apb2 base address */
#define GPIO_BASE (APB2_BUS_BASE + 0x00000800U) /*!< GPIO base address */
#define GPIOB (GPIO_BASE + 0x00000400U)
#define REG32(addr) (*(volatile uint32_t *)(uint32_t)(addr))
#define GPIO_CTL0(gpiox) REG32((gpiox) + 0x00U) /*!< GPIO port control register 0 */
printf("\n\rGPIO_CTL0(GPIOB) = %8x\n\r", GPIO_CTL0(GPIOB));
也就是说
int addr = 0x11223344;//虚拟地址
int x = (*(volatile uint32_t *)(uint32_t)(addr))
= (*(volatile uint32_t *)(uint32_t)(0x11223344))
= ( * ( uint32 * )( 虚拟地址值 ))
延申一下上面的x也是可以直接赋值的,也即是已知的这个地址也是可以直接赋值的。在单片机中相当于直接操作内存映射的外设(或者内存)。
/* set GPIO_CTL0 register */
GPIO_CTL0(gpio_periph) = reg;
参考链接
特此记录
anlog
2024年8月5日