打印

GD32F130是否支持位带操作?

[复制链接]
4000|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
用户手册里说支持位带操作,但是却找不到对应的位带别名区地址?是不支持还是未标明?求解。
沙发
sunmeat| | 2014-12-24 19:38 | 只看该作者
必须支持呀,和STM32一样么,你照着STM32的改就OK了

使用特权

评论回复
板凳
chenbibi26|  楼主 | 2014-12-25 08:45 | 只看该作者
sunmeat 发表于 2014-12-24 19:38
必须支持呀,和STM32一样么,你照着STM32的改就OK了

那映射地址还是0x42000000~0x43ffffff?可是GPIO的映射地址是0x480000~0x50000000,会有影响吗?
主要是F1x0系列有点奇怪,又有M3部分又有M0部分。

使用特权

评论回复
地板
chenbibi26|  楼主 | 2014-12-25 11:22 | 只看该作者
好吧,我了解了。用户手册里也说明了,Cortex™-M3处理器提供了两个支持位带操作的区域。其中一个是SRAM区的最低1MB范围,第二个是片内外设区的最低1MB范围。
https://bbs.21ic.com/forum.php?mod=attachment&aid=Mzg2MzQ1fDM2ZTNmMzNmNTExNTE3OTI2ZjMyOTU0OTYwOWIyNzRmfDE3MTYzNDY0NDg%3D&request=yes&_f=.png
https://bbs.21ic.com/forum.php?mod=attachment&aid=Mzg2MzQ3fGU1OGVlOGRkZjM3OWVhNDM4ZTIxM2ExN2ZmYjlmNjQ5fDE3MTYzNDY0NDg%3D&request=yes&_f=.png
GD32F10x系列的GPIO寄存器映射地址是0x4001 0800 ~0x4001 1c00,所以支持GPIO寄存器的位带操作,
https://bbs.21ic.com/forum.php?mod=attachment&aid=Mzg2MzUxfDYwZjRiODNmMTM0N2ZmOThiMGQ2ZmE0OGU2YzFhNjA1fDE3MTYzNDY0NDg%3D&request=yes&_f=.png
但是GD32F1x0系列GIPO寄存器与M0一致,映射地址是0x4800 0000~0x4800 1800,所以应该是不支持GPIO寄存器位带操作的。
https://bbs.21ic.com/forum.php?mod=attachment&aid=Mzg2MzQ5fDIxNTlhNWU4ZmIxODYxMzg3NjhhYmQ0ZTU2NzU5OWY2fDE3MTYzNDY0NDg%3D&request=yes&_f=.png
结论就是,GD32F130支持位带操作,但是不支持GPIO寄存器位带操作。
给大家参考一下,有不对地方希望能多指教。

103GPIO映射.png (9.87 KB )

103GPIO映射.png

F130GPIO映射.png (19.1 KB )

F130GPIO映射.png

M3映射.png (24.2 KB )

M3映射.png

位带操作.png (109.32 KB )

位带操作.png

使用特权

评论回复
5
shdjdq| | 2014-12-26 08:50 | 只看该作者
一般来讲,位操作不象51有优势,特别是GPIO(如可能的话)。GD32对IO口操作非常的简单,高效。

使用特权

评论回复
6
shenmu2012| | 2015-1-12 22:22 | 只看该作者
这个跟STM32差不多的,应该是可以的吧。

使用特权

评论回复
7
netpoint| | 2016-3-23 16:45 | 只看该作者
位带操作不支持IO操作?奇葩啊这是

使用特权

评论回复
8
shdjdq| | 2016-3-24 08:58 | 只看该作者
STM32F1XX,GD32F1XX等的IO位操作不要太爽啊,比51强大多了。GPIOX->BSRR 想做什么都有了,一条指令

使用特权

评论回复
9
神器飞天| | 2016-3-24 11:14 | 只看该作者
位带操作是M3核心的功能,跟具体哪家MCU没关系。

使用特权

评论回复
10
netpoint| | 2016-3-24 16:52 | 只看该作者
netpoint 发表于 2016-3-23 16:45
位带操作不支持IO操作?奇葩啊这是

如果GD32F1x0把GPIO的地址移出了位带区之外,已不再支持GPIO位带操作,下面的代码已没可能实现了
#define BITBAND(addr, bitnum)   ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr)        *((volatile uint32_t*)(addr))   
#define BIT_ADDR(addr,bitnum)   MEM_ADDR(BITBAND(addr, bitnum))
#define BIT_REG(reg,bit)       BITBAND((uint32_t)(&(reg)),bit)

struct{volatile uint32_t *BackLit,*CS,*RS,*WR,*RD,*RESET,*DATA_IN,*DATA_OUT;}LCD;


void LCD_HW_LINK(void)
{
//使用指针连接寄存器
    LCD.BackLit =(uint32_t*)&TIM1->CCR1;               
    LCD.CS      =(uint32_t*)BIT_REG(GPIOB->ODR,12);     
    LCD.RS      =(uint32_t*)BIT_REG(GPIOB->ODR,13);     
    LCD.WR      =(uint32_t*)BIT_REG(GPIOB->ODR,14);     
    LCD.RD      =(uint32_t*)BIT_REG(GPIOB->ODR,15);     
    LCD.RESET   =(uint32_t*)BIT_REG(GPIOA->ODR, 4);     
    LCD.DATA_IN =(uint32_t*)&GPIOD->IDR;               
    LCD.DATA_OUT=(uint32_t*)&GPIOD->ODR;               
}

void Exp(void)                                //位操作演示
{
    *LCD.CS=ENABLE;
    *LCD.CS=DISABLE;
}

使用特权

评论回复
11
shdjdq| | 2016-3-25 09:00 | 只看该作者
netpoint 发表于 2016-3-24 16:52
如果GD32F1x0把GPIO的地址移出了位带区之外,已不再支持GPIO位带操作,下面的代码已没可能实现了
#define BI ...

实在要在超范围用位操作,用一个变量转换一下,就能实现了。

使用特权

评论回复
12
wyz6| | 2016-3-27 18:39 | 只看该作者
130的GPIO是不支持位带的,我试过了

使用特权

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

本版积分规则

1

主题

3

帖子

0

粉丝