历史上的今天
今天是:2024年08月26日(星期一)
2018年08月26日 | STM32之寄存器访问
2018-08-26 来源:eefocus
一般的寄存器访问需要通过读-改-写三步曲 和 位运算的清0置1来实现,但在stm32的编程中,通过利用它的一些优秀的特性如端口位设置/复位寄存BSRR、位绑定等,我们可以大大提升寄存器的访问速度和简化寄存器的操作。
//一般寄存器操作:
GPIOx->ODR |= 0x10; //Pin4置1
GPIOx->ODR &= ~0x10; //Pin4清0
BSRR/BRR寄存器
GPIOx->BSRR //对BSRR的低16位写1置位,对BSRR的高16位写1清零
GPIOx->BRR //对BRR的低16位写1清零,BRR的高16位保留
由此可见,通过BSRR/BRR寄存器来操作ODR寄存器, 不需要 读-改-写三步曲, 仅通过 写 就可一步到位,方便不少。
位绑定
当然了,stm32还有一个更牛X的特性–位绑定,仅仅只要1个时钟周期就能实现单独的位操作。位绑定,是通过简单的地址变换将寄存器中的某一个位映射到内存中的某一个存储单元。这样通过对一个内存单元的读写就能间接访问相应寄存器的某个位了,当然此时该32位的内存单元也只有最低位是有效的啦!
但是整个M3内核并没有全部允许位绑定,只有两个区有,分别是
SARM:0x20000000~0x2000FFFF 1M大小
这个区绑定的地址是从0x22000000开始的;
PERIPHERALS:0x40000000~0x4000FFFFF 1M大小
这个区绑定的地址是从0x42000000开始的;
对应的位绑定公式为:
SRAM:AliasADDr = 0x22000000+((A-0x20000000)*32+n*4)
其中A:0x20000000~0x2000FFFF n:0~31
PERIPHERALS: AliasADDr = 0x42000000+((A-0x40000000)*32+n*4)
其中A:0x40000000~0x4000FFFFF n:0~31
下面就可以通过位绑定来快速实现位操作
#define GPIOA_ODR_ADDR (GPIOA_BASE + 0x0C)
#define GPIOA_IDR_ADDR (GPIOA_BASE + 0x08)
#define BitBind(Addr, bitNum) (*(volatile unsigned long *)((Addr&0xF0000000)+0x2000000+((Addr&0xFFFFF)<<5)+(bitNum<<2)))
//Addr&0xF0000000是为了区分SRAM还是PERIPHERALS
//Addr&0xFFFFF相当于(A-0x20000000)或者(A-0x40000000)
//左移是为了实现快速的乘法操作:左移n位相当于乘以2^n
#define PAout(n) BitBind(GPIOA_ODR_ADDR, n)
#define PAin(n) BitBind(GPIOA_IDR_ADDR, n)
这样就实现了类似51单片机访问I/O的操作方式
sbit P10 = P1^0
P10 = 0; 或 P10 = 1;
PAout(3) = 1; 或 PAout(3) = 0;
Pretty cool, huh!
史海拾趣
|
用定时器1做的简单输出,友善micro2440的板子 请帮我分析下,搞了好长时间,还是出不来 流驱动:#include \"options.h\" #include #include #include #include #include #include #include #include #include \"time.h\" ...… 查看全部问答> |
|
请问一下各位 学校里学的C语言和单片机C语言(C51)有啥子不一样的?哪个好学一点. 在学校里学了C语言后感觉没有学到啥子,挺浮浅的,现在只记得一些简单的规则和语法。 不知道现在是继续学它基础打扎实点呢,还是就开始学C51,希望大家给点建 ...… 查看全部问答> |
|
在WINCE60里面把CELLCORE组件加进了NK,怎么测试这块是不是可以正常工作?有没简单的测试AP可用?怎么测试RIL组件绑定了物理通信的串口? 在WINCE60里面把CELLCORE组件加进了NK,怎么测试这块是不是可以正常工作?有没简单的测试AP可用?怎么测试RIL组件绑定了物理通信的串口?… 查看全部问答> |
|
ppc2003可以直接访问sql2000 server中的数据吗? ppc2003通过wifi跟局域网连接后,可以通过编程直接访问服务器上sql2000 server中的数据吗?有人说必须在ppc上安装sql CE,然后通过sql CE跟服务器上的sql2000交换数据?真的是这样?… 查看全部问答> |
|
2010年度吉时利测试测量技术全国巡回研讨会将从9月初开始,在成都、重庆、合肥、南京、哈尔滨、武汉、兰州举办届时吉时利资深技术专家将与您深入交流: 绿色电子革命中的光电测试/新能源测试方案 新材料的测试方案 微弱信号测量难点与应对方 ...… 查看全部问答> |
|
使用uC2.86 ADC使用DMA中断的模式,在DMA1_CH1 初始化以及 中断 都没问题,都可以进中断, 但是改成 DMA1_CH4 就再也不进中断了,为什么?? 难道 DR_ADDRESS 地址不对?? RCC,等其他设置应该都没问题请大家看下我的初始化函 ...… 查看全部问答> |
|
最近在调STM8 的I2C(不想搞模拟的I2C),结果I2C没有调通,不知道问题所在,软件是参考I2C EEPROM固件那个程序写的。初始化如下: void IIC_Init(void) { UCHAR temp; CLK_PCKENR1 |= 0x01; I2C_CR1 = 0x00; &n ...… 查看全部问答> |
|
本帖最后由 dontium 于 2015-1-23 12:51 编辑 我这两天用面包板按照vca810芯片的datasheet中的figure2 电路搭建了一个压控放大,将8脚的50欧姆电阻去掉,并在8脚加了一个vpp=30mv,f=800hz的正弦波(函数发生器产生),并在1脚直接接地。但是在Vc= ...… 查看全部问答> |
|
《TMS320C28x系列DSP》读书笔记--通用目标文件格式,段 TMS320系列DSP的目标文件各式为通用目标文件格式 COFF (Command Object File Format,简称COFF)。 采用这种目标文件各式的优点是:将指令和数据按照段的概念进行组织和存储,这使得程序的可读性大大增强,更容易编写 ...… 查看全部问答> |




