
STM32控制器位带操作详解.ppt
15页STM32控制器位带操作STM32控制器与8051控制器IO口输入/输出操作对比#include “reg51.h”sbit P20= P2^0;void main(void){ while(1) { P20 = 1; delay(); P20 = 0; delay(); }}#include “stm32f10x.h”sbit P20= P2^0;void main(void){ while(1) { GPIOB->BSRR|=1<<5; delay(); GPIOB->BRR|=1<<5; delay(); }}BSRR寄存器BRR寄存器8051单片机的P2口寄存器STM32控制器与8051控制器IO口输入/输出操作对比#include “reg51.h”sbit P20= P2^0;void main(void){ while(1) { P2 |= 0x01; delay(); P20 &= 0xfe; delay(); }}#include “stm32f10x.h”sbit P20= P2^0;void main(void){ while(1) { GPIOB->BSRR|=1<<5; delay(); GPIOB->BRR|=1<<5; delay(); }}8051单片机的位寻址区表表2-32-3STM32位带区之一STM32位带区之二STM32存储器映射关系教材26页 图2-10 CM3存储器组织位带区位带区位别名区位别名区位带区位带区位别名区位别名区STM32 位带绑定操作示意图STM32 位带绑定操作 计算公式注释(对于位带区的某个bit,上图红色圈中的bit)n:所代表的位序号(0≤n≤7)。
例如上图中n=3A:该bit所在的字节地址例如上图中A=0x2000 0000(0x20000000≤A≤0x200FFFFF或0x20000000≤A≤0x200FFFFF )AliasAddr:该bit在别名区的地址例如上图AliasAddr=0x2200000CSTM32 位带绑定操作 程序设计举例:在SRAM的0x20004000地址定义一个长度为512字节的数组:#pragma location =0x20004000 __root _no_init u8 Buffer[512];GPIOA的端口输出数据寄存器位于地址0x4001080C要求:将数组中数据通过GPIOA.0引脚送出分析:数组首字节的bit0对应的位别名区地址为:0x22000000+((0x20004000-0x20000000)×32)+(0×4)=0x22080000GPIOA.0控制其输出电平的bit位所对应的别名区地址为:位所对应的别名区地址为:0x42000000+((0x4001080C-0x40000000)×32)+(0×4)=0x42210180u32 *pBuffer=(u32 *)0x22080000;u16 cnt= 512 * 8;while(cnt--){ (*((u32 *)0x42210180))=*pBuffer++;}STM32 位带绑定操作方法归纳1 指针、地址与取指针操作#define PD12 ((volatile unsigned long *)(0x424182b0) //0x424182b0为GPIOD.12引脚对应的映射位别名地址*PD12=0x01;//PD12引脚置高电平2 直接定义使用地址操作#define PD12 *((volatile unsigned long *)(0x424182b0) //0x424182b0为GPIOD.12引脚对应的映射位别名地址PD12=0x01;//PD12引脚置高电平3 宏定义,转换别名操作使用:VIEW_TIME=1; VIEW_TIME=0;//GPIOA.10引脚 输出1或者0分析:#define VIEW_TIME PAout(10)#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出 #define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入#define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)#define PERIPH_BASE ((uint32_t)0x40000000) #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))#define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))使用位带操作的优势n n有助于运算量和代码量的减少。
教材P32n n空间32位寄存器操作时不再进行屏蔽操作,优化了RAM和I/O寄存器的读/写,提高了位操作的速度n n防止中断对“读-改-写”方式的影响n n简化跳转程序的可能。












