关于stm32 u8中u8定义的变量值为0时,提示警告的问题,怎么解决

后使用快捷导航没有帐号?
查看: 8145|回复: 9
STM32中,如何设置一个位变量?
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
keil51中是用&bit&加上&变量名字&就可以了!!STM32中呢?&
在线时间0 小时
TA的帖子TA的资源
楼主用的是MDK吧
如果用MDK的话,那么用extern声明外部变量时,类型名必须要写上。例如&一个文件&建立变量&__IO&bool&Time_Interval_OK;另一个文件用这个变量的话,就的写extern&bool&Time_Interval_OK;不能写成extern&Time_Interval_OK;否则会默认为是int变量。&
在线时间0 小时
TA的帖子TA的资源
MDK里的bool型实际占用一个字节, 不算真正的bit.
stm32用bit&banding来实际bit级的访问.&不过如果不是追求速度或节省存贮器,&也没有必要用这个功能.&有兴趣查一下手册,弄清楚memery&map和地址换算就行了.如果是想将移槙原有51程序,&我是这样做的:有些bit定义的直接换成char,有些sbit定义的,&如:u8&&&&&&bdata&&&CtrlStatesbit&CtrlVisable&&&&=&CtrlState&^0;sbit&CtrlEnable&&&&&=&CtrlState&^1;......改成位寻址的结构体:struct{&&&&u8&CtrlVisable:1;&&&&u8&CtrlEnable:1;&&&&......}CtrlS
在线时间0 小时
TA的帖子TA的资源
请教楼上的
位寻址的结构体是如何占用内存的,向你上面最后的示例中:struct{&&&&u8&CtrlVisable:1;&&&&u8&CtrlEnable:1;&&&&......}CtrlS那么,CtrlVisable&是1字节的占用空间还是1&bit的占用空间?
在线时间0 小时
TA的帖子TA的资源
注意每个变量后面有个:1表示占用几个bit,&查查c语言的语法书就知道了.一般排在前面的变量在字节中的低位.(不同系统的编译器可能会不同)补充:&如果有很多零散的bit型变量也可以合并到一个字节中:struct{&&u32&var1:1;&&u32&var2:1;&&...}VarN如果在循环或者中断里要求快速访问某个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-&gtIDR,&前者是常量,&可以赋初值,&后者是取地址,不能用来赋初值.&在定时中断中读按键:&&&&for(i=0;i&lt8;i++)&{&&&&&&&&pKeyIO=(volatile&u32&*)KeyIO;//按键的位地址&&&&&&&&if&(*pKeyIO==0){//有键压下&&&&&&&&&&&&.......&&&&&&&&}else{//无键压下&&&&&&&&&&&&......&&&&&&&&}我这个方案也没有加快多少速度,&只是试验了一下bit&banding,&然后也懒得再优化了.&通常直接用(GPIOB-&gtIDR&&&KEYx_MASK)来判断也就行了.方法是活的,&看自己怎么选择就是了.
在线时间0 小时
TA的帖子TA的资源
& & & & & & & & & & & & & & & &&&选用BOOL 变量就是为了 节省RAM,而在KELI中BOOL也要在用4个字节了,如果想节省的话该怎么办呢?
在线时间0 小时
TA的帖子TA的资源
选用BOOL 变量就是为了 节省RAM,而在KELI中BOOL也要在用4个字节了,如果想节省的话该怎么办呢?
看三楼的方法。
在线时间0 小时
TA的帖子TA的资源
& & & & & & & & & & & & & & & &&&这种方法和在PIC编译器中是一样的,原来所有的C编译器都是这样呀
在线时间0 小时
TA的帖子TA的资源
& & & & & & & & & & & & & & & &&&可以把位变量定义在bitband区内,不管是u8/u16/u32,通通只占一个bit,呵呵
在线时间0 小时
TA的帖子TA的资源
& & & & & & & & & & & & & & & &&&可以把位变量定义在bitband区内,不管是u8/u16/u32,通通只占一个bit,呵呵
Powered by
逛了这许久,何不进去瞧瞧?关于stm32中u8定义的变量值为0时,提示警告的问题,怎么解决_百度知道
关于stm32中u8定义的变量值为0时,提示警告的问题,怎么解决
我有更好的答案
表达式无意义,警告说得很清楚if( tmp &= 9 ){.....} 这样写就行了。
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁程序中u8是uchar,u16是uint,stm32中bit不识别啊,定义一个bit变量怎么办?_百度知道
程序中u8是uchar,u16是uint,stm32中bit不识别啊,定义一个bit变量怎么办?
提问者采纳
stm32不能定义位变量,虽然有个“位带”但也麻烦,如果你真的想用到位,那就试试“位域”。
提问者评价
谢谢,还是用u8吧,但取值只是0或1感觉有点浪费啦~~
其他类似问题
为您推荐:
uint的相关知识
其他1条回答
bit可以直接用u8来代替
c51中bit是0或1,只需要1位,但uchar是要8位的,bit更节省资源,keil编译的stm32程序中没有关于bit的定义吗?
呵呵 没有.
,当然要弄也可以的 可以利用c语言的位域功能来做.一般不太提倡.对32位单片机来说.有的是内存,何必还纠结于位呢.
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁stm32变量的定义(整理而得,并非原创)
一、最近在玩stm32,用库(V3.5.0)开发,被 stm32的变量定义搞的晕头转向,决心将其弄清楚。
& & 在 stdint.h
文件里,我们可以清楚的看到:
typedef & signed
& &char int8_t;
typedef & signed
short & & int int16_t;
typedef & signed
& & int int32_t;
typedef & signed
& & & __int64
typedef unsigned
& &char uint8_t;
typedef unsigned short
& & int uint16_t;
typedef unsigned
& & int uint32_t;
typedef unsigned
& & & __int64
typedef & signed
& &char int_least8_t;
typedef & signed
short & & int
int_least16_t;
typedef & signed
& & int int_least32_t;
typedef & signed
& & & __int64
int_least64_t;
typedef unsigned
& &char uint_least8_t;
typedef unsigned short
& & int uint_least16_t;
typedef unsigned
& & int uint_least32_t;
typedef unsigned
& & & __int64
uint_least64_t;
typedef & signed
& & int int_fast8_t;
typedef & signed
& & int int_fast16_t;
typedef & signed
& & int int_fast32_t;
typedef & signed
& & & __int64
int_fast64_t;
typedef unsigned
& & int uint_fast8_t;
typedef unsigned
& & int uint_fast16_t;
typedef unsigned
& & int uint_fast32_t;
typedef unsigned
& & & __int64
uint_fast64_t;
typedef & signed
& & int intptr_t;
typedef unsigned
& & int uintptr_t;
typedef & signed
& & & __int64
typedef unsigned
& & & __int64
uintmax_t;
在百度百科中,我们可以看到&stdint.h 的作用:
二、在 core_cm3.h 文件里,有如下定义:
&#ifdef __cplusplus
& #define &
volatile & &
& #define &
volatile const & &
#define & & __O
& & volatile &
#define & & __IO
& &volatile &
CMSIS IO类型限定词
IO类限定词
volatile const
读和写访问
其中,volatile&的作用:
作为指令,确保本条指令不会因的优化而省略,且要求每次直接读值.
const&是一个C语言的关键字,它限定一个不允许被改变。
三、在 stm32f10x.h 文件里,有如下定义:
typedef int32_t
typedef int16_t s16;
typedef int8_t
typedef const int32_t sc32;
typedef const int16_t sc16;
typedef const int8_t sc8;
typedef __IO int32_t
typedef __IO int16_t
typedef __IO int8_t
typedef __I int32_t vsc32;
typedef __I int16_t vsc16;
typedef __I int8_t vsc8;
typedef uint32_t
typedef uint16_t u16;
typedef uint8_t
typedef const uint32_t uc32;
typedef const uint16_t uc16;
typedef const uint8_t uc8;
typedef __IO uint32_t
typedef __IO uint16_t vu16;
typedef __IO uint8_t
typedef __I uint32_t vuc32;
typedef __I uint16_t vuc16;
typedef __I uint8_t vuc8;
固件库与CMSIS数据类型对比
固件库类型
易挥发只读有符号32位数据
易挥发只读有符号16位数据
易挥发只读有符号8位数据
const int32_t
只读有符号32位数据
const int16_t
只读有符号16位数据
const int8_t
只读有符号8位数据
_IO int32_t
易挥发读写访问有符号32位数据
_IO int16_t
易挥发读写访问有符号16位数据
_IO int8_t
易挥发读写访问有符号8位数据
_I int32_t
易挥发只读有符号32位数据
_I int16_t
易挥发只读有符号16位数据
易挥发只读有符号8位数据
无符号32位数据
无符号16位数据
无符号8位数据
const uint32_t
只读无符号32位数据
const uint16_t
只读无符号16位数据
const uint8_t
只读无符号8位数据
_IO uint32_t
易挥发读写访问无符号32位数据
_IO uint16_t
易挥发读写访问无符号16位数据
_IO uint8_t
易挥发读写访问无符号8位数据
_I uint32_t
易挥发只读无符号32位数据
_I uint16_t
易挥发只读无符号16位数据
_I uint8_t
易挥发只读无符号8位数据
变量声明宏定义及重命名基本都在此了!
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。21ic官方微信
后使用快捷导航没有帐号?
查看: 1379|回复: 9
求解:STM32库函数编程全部变量问题
&&未结帖(5)
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
本帖最后由 stevendaoyun 于
22:01 编辑
现在我在程序中定义了三个全局变量,由对应子函数进行赋值,利用其中全局变量带入公式中计算得到的结果不正确,如果在公式语句前,给这两个变量赋值,赋的值正是子函数计算出的值,公式得到结果正确,不知道问题出在哪了。定义了三个全局变量:
double Data_T,Data_R,Data_Z;
三个子函数最后一句话是给全局变量赋值,这是程序一部分,子函数代码不用看,测试结果正确:
/**************环境温度检测函数*****************/
void T_det()
{
& && &&&double Rt,r,Ut,A
& && &&&Average=(double)(ADC1_Average());
& && &&&Ut=Average/1000;
& && &&&Rt=.42*Ut)/(100-0.42*Ut);
& && &&&r=(Rt-R1)/(R2-R1);
& && &&&Data_T=49.989*r+0.03*r*r-0.02*r*r*r;//适用于0到50摄氏度& && &&&
}
/*********交流电阻R测试函数***************/
void R_det()
{& && &&&
& && &&&u8
& && &&&u32&&temp1,temp2,Uh=0,Ul=0,U=0;
& && &&&flag=0;
& && &&&DAC_Configuration();& && && && && && &&&//DAC配置数控恒流源
& && &&&DAC_DATA=(u16)(49.636*TestCurrent1);
& && &&&DAC_WriteData();
& && &&&delay_us(100);
& && &&&GPIO_SetBits(GPIOA,GPIO_Pin_8);& && &&&//使能参考电压
& && &&&ADC_Configuration_R_Z();
& && &&&Timer_Configuration();
& && &&&TIM_Cmd(TIM3,ENABLE);//启动定时器
& && &&&while(j&num) //等待num次数据采集完成
& && &&&{
& && &&&//& && &&&printf(&当交流电阻R测试电流为:%d(mA)\r\n&,Current());& && &&&
& && &&&}& && &&&
& && &&&TIM_Cmd(TIM3,DISABLE);//关闭定时器
& && &&&GPIO_ResetBits(GPIOA,GPIO_Pin_6);//PA6、PA7置低电平为Z测试做准备& && &&&
& && &&&GPIO_ResetBits(GPIOA,GPIO_Pin_7);
& && &&&j=0;
& && &&&for(i=10;i&(num-10);i++) //采样num-20次
& && &&&{
& && && && &if(i%2==0) //获取正向(反向)电压
& && && && && & {
& && && && && && &&&temp1=0;
& && && && && && && && &temp1=ADC_RegularConvertedValueTab1[i];
& && && && && && && && &Uh=Uh+temp1;
& && && && && && && && &printf(&电阻R正向电压转换值=%dmV\r\n&,ADC_RegularConvertedValueTab1[i]);
& && && && && & }
& && && && && & else
& && && && && & {
& && && && && && && && &temp2=0;
& && && && && && && && &temp2=ADC_RegularConvertedValueTab1[i];
& && && && && && && && &Ul=Ul+temp2;
& && && && && & printf(&电阻R反向电压转换值=%dmV\r\n&,ADC_RegularConvertedValueTab1[i]);
& && && && && & }
& && &&&}& && &&&
& && &&&printf(&Uh=%d,Ul=%d\r\n&,Uh,Ul);
& && &&&U=Uh-Ul; //正向和反向电压差
& && &&&Data_R=U*1.0/(2*2*TestCurrent1*50);//计算交流电阻R
}
/************优值系数Z测试函数************/
void Z_det()//Z值测试子函数 等待TEC工作稳定
{
& && &&&u32 Uadd=0,Ua=0,temp1,temp2;
& && &&&double Ua1,Uadd1,Ur1;
& && &&&u8 i,w;
& && &&&flag=1;
& && &&&DAC_DATA=(u16)(49.636*TestCurrent2);
& && &&&DAC_WriteData();
& && &&&delay_us(100);
& && &&&GPIO_SetBits(GPIOA,GPIO_Pin_8);
& && &&&ADC_Configuration_R_Z();& && &&&
& && &&&Timer_Configuration();
& && &&&TIM_Cmd(TIM3,ENABLE);& && &&&
& && &&&for(w=WaitTime_S;w&0;w--)& && &&&//延时等待TEC工作在稳定状态
& && &&&{
& && && && && & delay_ms(500);
& && && && && & delay_ms(500);
& && &&&}
& && &&&Z_TestStart=1;& && && && && &
& && &&&while(k&num)
& && &&&{
& && && &//& && &&&printf(&当前优值系数Z测试电流为:%d(mA)\r\n&,Current());
& && &&&}
& && &&&TIM_Cmd(TIM3,DISABLE);
& && &&&Z_TestStart=0;
& && &&&k=0;
& && &&&for(i=10;i&(num-10);i++)&&//测量num-20次
& && &&&{
& && && && && & if(i%2==0)& && &&&//获取塞贝克电压值
& && && && && & {
& && && && && & temp1=0;
& && && && && & temp1=ADC_RegularConvertedValueTab2[i];
& && && && && & Ua=Ua+temp1;
& && && && && & printf(&& && && && &&&塞贝克电压Ua=%dmV\r\n&,ADC_RegularConvertedValueTab2[i]);
& && && && && & }
& && && && && & else& && &&&//获取电阻电压与塞贝克电压之和电压值
& && && && && & {
& && && && && & temp2=0;
& && && && && & temp2=ADC_RegularConvertedValueTab2[i];
& && && && && & Uadd=Uadd+temp2;
& && && && && & printf(&电阻电压与塞贝克电压和Uadd=%dmV\r\n&,ADC_RegularConvertedValueTab2[i]);
& && && && && & }
& && &&&}
& && &&&Ua1=(double)((Ua-2500*50)/(2*50));
& && &&&Uadd1=(double)((Uadd-2500*50)/(2*50));
& && &&&Ur1=Uadd1-Ua1;
& && &&&Data_Z=(double)(Ua1/(Ur1*Data_T));//塞贝克电压与电阻电压比值为优值系数Z值
}
主函数main中用到的公式:
Max_Temper_Differ=(double)((Data_T+273)-(sqrt(1+2*(Data_T+273)*Data_Z/1000)-1)/(Data_Z/1000));
直接利用子函数给全局变量Data_T和Data_Z赋值,通过Printf语句观察,全局变量确实被赋值了,然而这样得到的计算结果错误。
下面直接给全局变量赋值,所赋值的两个数是子函数计算结果:
Data_T=8.58;
Data_Z=1.42;& && && && && && && && && && && && && && && && && && && && &
Max_Temper_Differ=(double)((Data_T+273)-(sqrt(1+2*(Data_T+273)*Data_Z/1000)-1)/(Data_Z/1000));
得到的结果正确,两个值正是T_det()和Z_DET()两个子函的值。复制代码
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
自己顶一下,翘首企盼高手到来
主题帖子积分
资深技术员, 积分 431, 距离下一级还需 69 积分
资深技术员, 积分 431, 距离下一级还需 69 积分
主题帖子积分
专家等级:结帖率:62%
主题帖子积分
资深技术员, 积分 431, 距离下一级还需 69 积分
资深技术员, 积分 431, 距离下一级还需 69 积分
你得变量是否在中断中用过?
主题帖子积分
助理工程师, 积分 1449, 距离下一级还需 551 积分
助理工程师, 积分 1449, 距离下一级还需 551 积分
主题帖子积分
专家等级:结帖率:12%
主题帖子积分
助理工程师, 积分 1449, 距离下一级还需 551 积分
助理工程师, 积分 1449, 距离下一级还需 551 积分
你这个问题,完全是变量在处理的时候,造就的问题,你可以把这变量值在main函数当中应用的时候,将这三个全局变量再赋值给三个局部变量,然后在main函数当中,打印出这三个局部变量。就可以了解了。还有注意变量类型。
专业单片机Zigbee方案代开发。可接毕设。
主题帖子积分
资深工程师, 积分 16327, 距离下一级还需 3673 积分
资深工程师, 积分 16327, 距离下一级还需 3673 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
资深工程师, 积分 16327, 距离下一级还需 3673 积分
资深工程师, 积分 16327, 距离下一级还需 3673 积分
问题解决了就好& & 楼上高手
微软CEO史蒂夫·鲍尔默:不要激情,要有韧性
电子设计的灵魂是知识,坚持做技术,共勉
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
sun1238898 发表于
你这个问题,完全是变量在处理的时候,造就的问题,你可以把这变量值在main函数当中应用的时候,将这三个全 ...
这个我之前试过,打印出局部变量的值也是对的,但是计算结果和用全局变量一样,数据类型我再看看有没有问题
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
pentral0311 发表于
你得变量是否在中断中用过?
没有在中断中用过,但是数据是在TIM3中断函数中采集,将采集的数据存在全局数组中,子函数通过数组中的数据计算出三个全局变量值
主题帖子积分
助理工程师, 积分 1449, 距离下一级还需 551 积分
助理工程师, 积分 1449, 距离下一级还需 551 积分
主题帖子积分
专家等级:结帖率:12%
主题帖子积分
助理工程师, 积分 1449, 距离下一级还需 551 积分
助理工程师, 积分 1449, 距离下一级还需 551 积分
我想应该是你的程序设计,哪里出现了异常,导致这样的问题,你再瞅瞅看看,
专业单片机Zigbee方案代开发。可接毕设。
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
sun1238898 发表于
我想应该是你的程序设计,哪里出现了异常,导致这样的问题,你再瞅瞅看看, ...
恩,今天一天在忙,没调程序,明天继续调程序
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
感谢各位热情帮助,问题解决了,是我数据处理出了点问题,打印函数中为了方便观察结果,将Data_Z乘以了1000printf(&Data_Z:%f(1000/K)\r\n&,Data_Z*1000);复制代码
而最大温差计算函数中直接用Data_Z带入我帖子了的代码是这样的:
Max_Temper_Differ=(double)((Temper+273)-(sqrt(1+2*(Temper+273)*Data_Z/1000)-1)/(Data_Z/1000));复制代码
正确的是这样的:
Max_Temper_Differ=(double)((Temper+273)-(sqrt(1+2*(Temper+273)*Data_Z)-1)/(Data_Z));复制代码
技术新星奖章
人才类勋章
涓涓之细流
发帖类勋章
时间类勋章
技术奇才奖章
人才类勋章
时间类勋章
欢快之小溪
发帖类勋章
社区建设奖章
等级类勋章
核心会员奖章
等级类勋章
坚毅之洋流
发帖类勋章
时间类勋章
热门推荐 /4

我要回帖

更多关于 stm32 u8 u16 的文章

 

随机推荐