秉火429笔记之七位带操作

发布者:dadigt最新更新时间:2019-09-12 来源: eefocus关键字:秉火  位带操作  关键字 手机看文章 扫描二维码
随时随地手机看文章

位带概况

位操作,简单的理解,可以单独的对一个比特位读和写,51单片机非常常见。类如,51单片机通过关键字sbit来实现位定义,STM32并没有这个关键字,而是通过访问位带别名区(Bit band alias)来实现的。


通过查看《M4内核参考手册》3.4 system address map 可知下图:

M4中2个区域实现了位带,其一为SRAM的最低1MB空间,其二为外设区域的最低1MB空间。


参考3.7 Bit-banding 可知,位带区的一个比特经过膨胀后,虽然变大到4个字节,但是还是LSB才有效。有人会问这不是浪费空间吗,要知道F429的系统总线是32位的,按照4个字节访问的时候是最快的,所以膨胀成4个字节来访问是最高效的。通过指针的形式访问位带别名区地址从而达到操作位带区比特位的效果。


// 把“位带地址+位序号”转换成别名地址的宏

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x02000000+((addr & 0x000FFFFF)<<5)+(bitnum<<2))

 

// 把一个地址转换成一个指针

#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))

 

// 把位带别名区地址转换成指针

#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))

关键字:秉火  位带操作  关键字 引用地址:秉火429笔记之七位带操作

上一篇:秉火429笔记之五控制RGB彩灯
下一篇:秉火429笔记之四启动文件分析

推荐阅读最新更新时间:2024-11-19 12:45

Cortex‐M3和Cortex‐M0是否都能操作
最近在进行stm32l011f4的编程,想到stm32有位带操作,便想试一试,但是事与愿违,先贴下位带操作代码 Cortex‐M0的位带操作代码 //IO输出方向设置 #define SDA_IN() {GPIOA- MODER&=0XFFF1FFFF;} //PA_10设置成输入 #define SDA_OUT() {GPIOA- MODER&=0XFFF5FFFF;} //PA_10设置成输出 // SDA = PA_10;SCL = PA_9 #define IIC_SCL PAout(9) #define IIC_SDA PAout(10) #define READ_SDA PAin(10)
[单片机]
Cortex‐M3和Cortex‐M0是否都能<font color='red'>位</font>带<font color='red'>操作</font>
keil 中的重入问题解决
keil c 中可以用关键字 reentrant 定义, 如:void fun(void) reentrant{} 但函数中不可以使用BOOL变量,以为KEIL默认 将所有变量定位到外部RAM的最高处,而外部RAM不可以位寻址。 另外如果你的外部RAM不足64K(0XFFFF),你还的更改KEIL系统文件STARTUP.A51中 XBPSTACKTOP EQU 0FFFFH+1;这一行。 例如你的外部RAM是0-0x7fff, 则该为: XBPSTACKTOP EQU 07FFFH+1;
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved