微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > bitBanding例子程序

bitBanding例子程序

时间:10-02 整理:3721RD 点击:
Cortex?-M3 将片内外设和SRAM都做了位映射。=====这么处理,单片机就无法直接支持4G字节内存。哈。
(08年,笔记本电脑正在4G内存热炒,也来凑个热闹)
SRAM空间2000... 映射到2200...
实际上,为片内SRAM仅保留了2000,0000 - 200f,ffff。
Cortex?-M3 仅保留1Mbyte空间,马马虎虎====要知道,受到07年的飞身直落,08年的DDR2仅相当于1M折合1元人民币!(不好意思,又来了。20080313Hy512M DDR2-667仅58元人民币--板上8颗芯片?每颗芯片64Mbyte不到8元?实际上DDR芯片非存储部分占用了相当大面积,近乎一半,不能简单除法。内存与逻辑生产工艺也不相同。片内SRAM相当占面积,更不要提主流CPU内的高速缓存RAM......)

闲话少说,言归正传:
0x2000 0000   bit0 对应   0x2200 0000
0x2000 0000   bit1 对应   0x2200 0004
0x2000 0000   bit2 对应   0x2200 0008
......
0x200f ffff   bit15对应   0x23ff fffc    呵呵

由于32位系统,一次处理4个字节比较直观;所以,总是把4个字节一起处理;于是,字节地址0123就被一
次性处理掉了;总之,地址没有123那样连续,而是0,4,8,c,0这样蹦蹦跳跳。
=======为每一个bit分配一个 “32bit MCU 可以方便处理的地址”,需要占用32倍地址空间。
因此,嗯,是这样的,地址的计算公式,稍微复杂了点:
bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number × 4)
SRAM
2200 0000 加上偏移
SRAM_BB_BASE
void get_bit(u8 db8)
{
  vu32 VarAddr;
  VarAddr = (u32)&db8;
  VarAddr = (0x22000000 | ((VarAddr - 0x20000000) << 5) );
  bit0  = (*(vu8 *) VarAddr);  //VarAddr += 4;
......
}
特殊功能寄存器:
4200 0000 加上偏移
PERIPH_BB_BASE
#include "stm32f10x_map.h"
#define BIT_1 1
#define BIT_2 2
#define BIT_3 3
#define BIT_4 4
#define BIT_5 5
#define IO_ODR 0x0c
#define IO_OUT(a,b) (*(vu8 *)(PERIPH_BB_BASE | ((a - PERIPH_BASE + IO_ODR) << 5) + (b << 2)))
#define bitX  IO_OUT(GPIOD, BIT_Pin_3)
========bitX仅仅负责输出哦!ODR 可以输出0,也可以输出1。IDR才能输入,读取。还有BSRR,BRR,根据需要取用。
或者干脆
//       C9   C 40011000   ODR  C   bit 9
//              42220000      180      24
#define dd0           (*(vu8 *)0x422201A4)
//看明白了么?
dd0 = 1;
bitX = 1;
bitX = 0;
出处:americ

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top