GD32F130是否支持位带操作?

[复制链接]
5191|11
 楼主| chenbibi26 发表于 2014-12-24 16:26 | 显示全部楼层 |阅读模式
用户手册里说支持位带操作,但是却找不到对应的位带别名区地址?是不支持还是未标明?求解。
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=Mzg2MzQ1fGJkZjEwMDMxfDE3NTk2MDE5MzF8MHw%3D
https://bbs.21ic.com/forum.php?mod=attachment&aid=Mzg2MzQ3fGY0YTAwNmE1fDE3NTk2MDE5MzF8MHw%3D
GD32F10x系列的GPIO寄存器映射地址是0x4001 0800 ~0x4001 1c00,所以支持GPIO寄存器的位带操作,
https://bbs.21ic.com/forum.php?mod=attachment&aid=Mzg2MzUxfDRkMTkyMjVmfDE3NTk2MDE5MzF8MHw%3D
但是GD32F1x0系列GIPO寄存器与M0一致,映射地址是0x4800 0000~0x4800 1800,所以应该是不支持GPIO寄存器位带操作的。
https://bbs.21ic.com/forum.php?mod=attachment&aid=Mzg2MzQ5fDNiYTM0Y2VhfDE3NTk2MDE5MzF8MHw%3D
结论就是,GD32F130支持位带操作,但是不支持GPIO寄存器位带操作。
给大家参考一下,有不对地方希望能多指教。
位带操作.png
M3映射.png
F130GPIO映射.png
103GPIO映射.png
shdjdq 发表于 2014-12-26 08:50 | 显示全部楼层
一般来讲,位操作不象51有优势,特别是GPIO(如可能的话)。GD32对IO口操作非常的简单,高效。
shenmu2012 发表于 2015-1-12 22:22 | 显示全部楼层
这个跟STM32差不多的,应该是可以的吧。
netpoint 发表于 2016-3-23 16:45 | 显示全部楼层
位带操作不支持IO操作?奇葩啊这是
shdjdq 发表于 2016-3-24 08:58 | 显示全部楼层
STM32F1XX,GD32F1XX等的IO位操作不要太爽啊,比51强大多了。GPIOX->BSRR 想做什么都有了,一条指令
神器飞天 发表于 2016-3-24 11:14 | 显示全部楼层
位带操作是M3核心的功能,跟具体哪家MCU没关系。
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;
}
shdjdq 发表于 2016-3-25 09:00 | 显示全部楼层
netpoint 发表于 2016-3-24 16:52
如果GD32F1x0把GPIO的地址移出了位带区之外,已不再支持GPIO位带操作,下面的代码已没可能实现了
#define BI ...

实在要在超范围用位操作,用一个变量转换一下,就能实现了。
wyz6 发表于 2016-3-27 18:39 | 显示全部楼层
130的GPIO是不支持位带的,我试过了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

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