打印

CM0的带位操作是如何的

[复制链接]
3047|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我见原子的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 | 只看该作者
有谁试过的,有具体的资料看一看是否一样的吗,

使用特权

评论回复
5
vv123456|  楼主 | 2013-4-23 14:50 | 只看该作者
IJK 发表于 2013-4-23 14:04
原来印象里CortexM0 不支持bit banding,后来查了一下 CortexM0 支持bit banding在设计MCU是可选的。

另外 ...

呵,有具体资料看看吗

使用特权

评论回复
6
IJK| | 2013-4-23 16:00 | 只看该作者
vv123456 发表于 2013-4-23 14:50
呵,有具体资料看看吗

可以上维基百科:  http://en.wikipedia.org/wiki/ARM_Cortex-M

使用特权

评论回复
7
airwill| | 2013-4-23 21:04 | 只看该作者
CM0 并不支持位带操作

使用特权

评论回复
8
vv123456|  楼主 | 2013-4-24 00:35 | 只看该作者
airwill 发表于 2013-4-23 21:04
CM0 并不支持位带操作

确定,那就行了

使用特权

评论回复
9
vv123456|  楼主 | 2013-4-24 00:43 | 只看该作者
airwill 发表于 2013-4-23 21:04
CM0 并不支持位带操作



bit-banding,这个是不是带位操作的吗?

使用特权

评论回复
10
airwill| | 2013-4-24 06:53 | 只看该作者
本帖最后由 airwill 于 2013-4-24 06:54 编辑

本人在 STM32F0Discovery 上测试了一下, 一执行 0x22000000 地址的读操作指令, 就 HardFault 了.

使用特权

评论回复
11
IJK| | 2013-4-24 13:35 | 只看该作者
没错,我记得STM32F0不支持bit banding。不知道其它M0的MCU是不是支持?比如LPC1100、新唐的M0、Freescale Kinetis L系列

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

722

帖子

1

粉丝