意义: 有时候我们在操作多个STM32 IO 时,硬件设计未必有规律,比如输出引脚是:PB3,PC4,PC5,PD0,但是操作这些引脚具有共性,或者说我们想用 for(it i = 0; i < 4; i++) 像操作数组一样操作这些引脚,程序将变得非常简洁,这时候把 IO 映射到地址就可以实现该目的。
方法:
1.//位带操作,实现51类似的GPIO控制功能
//具体实现思想,参考《CM3权威指南》第五章(87~92页),M4同M3类似,只是寄存器地址变了
//IO口操作宏定义
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
//IO口地址映射
#define GPIOA_ODR_Addr (GPIOA_BASE+20) //0x40020014
#define GPIOB_ODR_Addr (GPIOB_BASE+20) //0x40020414
#define GPIOC_ODR_Addr (GPIOC_BASE+20) //0x40020814
#define GPIOD_ODR_Addr (GPIOD_BASE+20) //0x40020C14
#define GPIOE_ODR_Addr (GPIOE_BASE+20) //0x40021014
#define GPIOF_ODR_Addr (GPIOF_BASE+20) //0x40021414
#define GPIOG_ODR_Addr (GPIOG_BASE+20) //0x40021814
#define GPIOH_ODR_Addr (GPIOH_BASE+20) //0x40021C14
#define GPIOI_ODR_Addr (GPIOI_BASE+20) //0x40022014
#define GPIOA_IDR_Addr (GPIOA_BASE+16) //0x40020010
#define GPIOB_IDR_Addr (GPIOB_BASE+16) //0x40020410
#define GPIOC_IDR_Addr (GPIOC_BASE+16) //0x40020810
#define GPIOD_IDR_Addr (GPIOD_BASE+16) //0x40020C10
#define GPIOE_IDR_Addr (GPIOE_BASE+16) //0x40021010
#define GPIOF_IDR_Addr (GPIOF_BASE+16) //0x40021410
#define GPIOG_IDR_Addr (GPIOG_BASE+16) //0x40021810
#define GPIOH_IDR_Addr (GPIOH_BASE+16) //0x40021C10
#define GPIOI_IDR_Addr (GPIOI_BASE+16) //0x40022010
2. 输出:u32 val = BITBAND(GPIOB_ODR_Addr, 3); 把val打印出来即可(输入是:GPIOB_IDR_Addr)
PB3,PC4,PC5,PD0依次对应:0x4240828c、0x42410290、0x42410294、0x42418280
3. 操作:
uint32_t PinTest[4] = {0x4240828c, 0x42410290, 0x42410294, 0x42418280};
*((vu32 *)(PinTest[idx])) = 1; *((vu32 *)(PinTest[idx])) = 0;
4. 输入操作类似
5. 定时器相关:
u32 val = (u32)&(TIM3->CCR3); // TIM_Pluse
u32 val = (u32)&(TIM3->ARR); // TIM_Period
上一篇:STM32 24C02函数 I2C例程 非STM32库方式
下一篇:STM32的定时器(含中断)配置样例
推荐阅读最新更新时间:2024-03-16 16:14