CM0的带位操作是如何的

[复制链接]
 楼主| vv123456 发表于 2013-4-23 13:31 | 显示全部楼层 |阅读模式
我见原子的F1(CM3内核是可以带位操作的,像51,AVR那样带位);
#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))
//IO?????
#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C
#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C
#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C
#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C
#define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C
#define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C   
#define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C   

#define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808
#define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08
#define GPIOC_IDR_Addr    (GPIOC_BASE+8) //0x40011008
#define GPIOD_IDR_Addr    (GPIOD_BASE+8) //0x40011408
#define GPIOE_IDR_Addr    (GPIOE_BASE+8) //0x40011808
#define GPIOF_IDR_Addr    (GPIOF_BASE+8) //0x40011A08
#define GPIOG_IDR_Addr    (GPIOG_BASE+8) //0x40011E08

//IO???,?????IO?!
//??n????16!
#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //??
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //??

#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //??
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //??

#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //??
#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //??

#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //??
#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //??

#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //??
#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //??

#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //??
#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //??

#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //??
#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //??

不知道M0的又是怎样的呢是否一样呢
 楼主| vv123456 发表于 2013-4-23 13:48 | 显示全部楼层
IJK 发表于 2013-4-23 14:04 | 显示全部楼层
本帖最后由 IJK 于 2013-4-23 14:10 编辑

原来印象里CortexM0 不支持bit banding,后来查了一下 CortexM0 支持bit banding在设计MCU是可选的。

另外,CM0的位带操作(如果芯片支持)跟CM3应该是一样的。
 楼主| vv123456 发表于 2013-4-23 14:47 | 显示全部楼层
有谁试过的,有具体的资料看一看是否一样的吗,
 楼主| vv123456 发表于 2013-4-23 14:50 | 显示全部楼层
IJK 发表于 2013-4-23 14:04
原来印象里CortexM0 不支持bit banding,后来查了一下 CortexM0 支持bit banding在设计MCU是可选的。

另外 ...

呵,有具体资料看看吗
IJK 发表于 2013-4-23 16:00 | 显示全部楼层
vv123456 发表于 2013-4-23 14:50
呵,有具体资料看看吗

可以上维基百科:  http://en.wikipedia.org/wiki/ARM_Cortex-M
airwill 发表于 2013-4-23 21:04 | 显示全部楼层
CM0 并不支持位带操作
 楼主| vv123456 发表于 2013-4-24 00:35 | 显示全部楼层
airwill 发表于 2013-4-23 21:04
CM0 并不支持位带操作

确定,那就行了
 楼主| vv123456 发表于 2013-4-24 00:43 | 显示全部楼层
airwill 发表于 2013-4-23 21:04
CM0 并不支持位带操作

6.jpg

bit-banding,这个是不是带位操作的吗?
airwill 发表于 2013-4-24 06:53 | 显示全部楼层
本帖最后由 airwill 于 2013-4-24 06:54 编辑

本人在 STM32F0Discovery 上测试了一下, 一执行 0x22000000 地址的读操作指令, 就 HardFault 了.
IJK 发表于 2013-4-24 13:35 | 显示全部楼层
没错,我记得STM32F0不支持bit banding。不知道其它M0的MCU是不是支持?比如LPC1100、新唐的M0、Freescale Kinetis L系列
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

722

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

31

主题

722

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部