19533|9

69

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STM32中,如何设置一个位变量? [复制链接]

keil51中是用 bit 加上 变量名字 就可以了!!

STM32中呢?

 
此帖出自stm32/stm8论坛

最新回复

                                 可以把位变量定义在bitband区内,不管是u8/u16/u32,通通只占一个bit,呵呵  详情 回复 发表于 2010-4-12 17:34
点赞 关注
 

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

楼主用的是MDK吧

如果用MDK的话,那么用extern声明外部变量时,类型名必须要写上。

例如 一个文件 建立变量 __IO bool Time_Interval_OK;

另一个文件用这个变量的话,就的写extern bool Time_Interval_OK;

不能写成extern Time_Interval_OK;否则会默认为是int变量。 
此帖出自stm32/stm8论坛
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

MDK里的bool型实际占用一个字节, 不算真正的bit.


stm32用bit banding来实际bit级的访问. 不过如果不是追求速度或节省存贮器, 也没有必要用这个功能. 有兴趣查一下手册,弄清楚memery map和地址换算就行了.

如果是想将移槙原有51程序, 我是这样做的:
有些bit定义的直接换成char,
有些sbit定义的, 如:
u8      bdata   CtrlState
sbit CtrlVisable    = CtrlState ^0;
sbit CtrlEnable     = CtrlState ^1;
......
改成位寻址的结构体:
struct{
    u8 CtrlVisable:1;
    u8 CtrlEnable:1;
    ......

}CtrlState;
此帖出自stm32/stm8论坛
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

4
 

请教楼上的

位寻址的结构体是如何占用内存的,向你上面最后的示例中:
struct{
    u8 CtrlVisable:1;
    u8 CtrlEnable:1;
    ......

}CtrlState;

那么,CtrlVisable 是1字节的占用空间还是1 bit的占用空间?
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 

1bit

注意每个变量后面有个:1表示占用几个bit, 查查c语言的语法书就知道了.
一般排在前面的变量在字节中的低位.(不同系统的编译器可能会不同)

补充: 如果有很多零散的bit型变量也可以合并到一个字节中:
struct{
  u32 var1:1;
  u32 var2:1;
  ...
}VarName;

如果在循环或者中断里要求快速访问某个bit, 可以用bit banding.地址换算:
SRAM_BB_BASE + ((addr-SRAM_BASE)*32) + (bit*4))
其中SRAM_BB_BASE/SRAM_BASE在3.0的库里面有定义的
可以将多个需要快速访问的bit合到一个32bit word里, 其地址可以用&得到, 换算出其中一个bit的地址然后赋给一个u32型的指针就行了. 具体原理请查手册.

对于外设寄存器的位也可以用这种方法, 换算公式:
PERIPH_BB_BASE + (addr-PERIPH_BASE)*32 + (bit)*4. 这个我有现成的例子, q我有8个按键接在GPIOB上, 
每个按键的位地址定义到一个数组里: 
u32 KeyIO[]={
    BB_Periph_addr((GPIOB_BASE+8),6),//GPIOB_6
    BB_Periph_addr((GPIOB_BASE+8),7),//GPIOB_7
    BB_Periph_addr((GPIOB_BASE+8),8),
    BB_Periph_addr((GPIOB_BASE+8),9),
    BB_Periph_addr((GPIOB_BASE+8),12),
    BB_Periph_addr((GPIOB_BASE+8),13),
    BB_Periph_addr((GPIOB_BASE+8),14),
    BB_Periph_addr((GPIOB_BASE+8),15),
};
注GPIOB_BASE+8是&GPIOB->IDR, 前者是常量, 可以赋初值, 后者是取地址,不能用来赋初值. 

在定时中断中读按键:
    for(i=0;i<8;i++) {
        pKeyIO=(volatile u32 *)KeyIO;//按键的位地址
        if (*pKeyIO==0){//有键压下
            .......
        }else{//无键压下
            ......
        }

我这个方案也没有加快多少速度, 只是试验了一下bit banding, 然后也懒得再优化了. 通常直接用(GPIOB->IDR & KEYx_MASK)来判断也就行了.

方法是活的, 看自己怎么选择就是了.
此帖出自stm32/stm8论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

6
 
                                 选用BOOL 变量就是为了 节省RAM,而在KELI中BOOL也要在用4个字节了,如果想节省的话该怎么办呢?
此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

7
 
选用BOOL 变量就是为了 节省RAM,而在KELI中BOOL也要在用4个字节了,如果想节省的话该怎么办呢?
看三楼的方法。
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

8
 
                                 这种方法和在PIC编译器中是一样的,原来所有的C编译器都是这样呀
此帖出自stm32/stm8论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

9
 
                                 可以把位变量定义在bitband区内,不管是u8/u16/u32,通通只占一个bit,呵呵
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

10
 
                                 可以把位变量定义在bitband区内,不管是u8/u16/u32,通通只占一个bit,呵呵
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表