Cortex - M3 位带别名首地址的计算方法
一、源代碼
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))二、功能
? ? ? ? 已知SRAM區(qū)或者Peripheral區(qū)的位帶區(qū)某一位的地址,計算該位對應的位帶別名區(qū)的地址,即:1b轉到32b。
三、解釋
? ? ? ? 上述代碼主要理解的是第1行。第1行代碼可以分解成以下幾部分:
? ? ? ? (1)addr & 0xF000_0000
? ? ? ? 因為位帶功能只存在于SRAM區(qū)和Peripheral區(qū),二者的位帶區(qū)的地址范圍如下:
? ? ? ? ? ? ? ? SRAM區(qū):0x2000_0000
? ? ? ? ? ? ? ? Peripheral區(qū):0x4000_0000
? ? ? ? 該代碼的意思是獲知當前位帶區(qū)是位于SRAM區(qū)和Peripheral區(qū)。
? ? ? ? (2)(addr & 0xF000_0000) + 0x200_0000
? ? ? ??SRAM區(qū)和Peripheral區(qū)的位帶別名區(qū)的首地址分別是0x2200_0000和0x4200_0000,所以這行代碼的功能是計算所在區(qū)的位帶別名區(qū)的首地址。
? ? ? ? (3)(addr &0xFFFFF)<<5)+(bitnum<<2)
? ? ? ? 因為SRAM區(qū)和Peripheral區(qū)的位帶區(qū)的大小為1M,故該區(qū)里面的位的地址最大為0xF_FFFF,所以addr &0xF_FFFF的功能是獲取位帶區(qū)中的位相對于位帶區(qū)首地址的偏移。
? ? ? ? 為了便于理解,這里將(addr &0xFFFFF)<<5)+(bitnum<<2)拆解成((addr & 0xFFFFF)<<3 + bitnum)<<2。
? ? ? ? ?①?(addr & 0xFFFFF)<<3
? ? ? ? ? ? ? ? ?將位帶區(qū)的位轉換成字節(jié)形式。“<<3”意思就是乘以8。
? ? ? ? ?②?(addr & 0xFFFFF)<<3 + bitnum
? ? ? ? ? ? ? ? ?加上bitnum,轉到指定的位。
? ? ? ? ?③?((addr & 0xFFFFF)<<3 + bitnum)<<2
? ? ? ? ? ? ? ? ?乘以4,再將位帶區(qū)的位轉到了32位的字中。
? ? ? ? 經過上述操作,就完成了計算位帶區(qū)的位對應的位帶別名區(qū)位的地址的操作。
?
參考:
https://www.cnblogs.com/szhb-5251/p/6662417.html
https://blog.csdn.net/bgk083/article/details/40082103
?
(SAW:Game Over!)
總結
以上是生活随笔為你收集整理的Cortex - M3 位带别名首地址的计算方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算器中 MS、MR、M+、M- 和 M
- 下一篇: 串口、COM口、TTL和RS-232的区