在线时间3 小时
UID344783
ST金币0
蝴蝶豆0
注册时间2008-3-23
初级会员
- 最后登录
- 2018-7-19
|
a0a.1 0b0c
我使用stvd开发stm8s,在编程时遇到一个棘手的问题,请教大家:
程序:
在stm8s_type.h文件中:
struct PhaseDriveStr
{
u8 CCMR_1;
u8 CCMR_2;
u8 CCMR_3;
u8 CCER_1;
u8 CCER_2;
};
//情况一,结构体变量在main函数前定义(全局)并初始化,在main中引用,出现错误,所要的值不是期望的值,均为0,
在main.c文件中:
struct PhaseDriveStr MosDri_CW = {1,2,3,4,5};
void main(void)
{
u8 TempCharX1;
_asm("sim");
SysInit();
_asm("rim"); // 允许CPU全局中断
while (1)
{
if (TIM6_SR &0X40 == 0X40)
{
TIM6_SR = 0x00;
TempCharX1 = MosDri_CW.CCMR_3;
if(TempCharX1 == 0)
{
PD_ODR|=0x80; // PD7为LED,为1 //程序运行结果,错误
}
else
{
PD_ODR&=0x7F; //LED为0
}
}
}
}
上面程序运行结果为LED灯亮,错误
//情况二,在main函数之前前定义结构体变量,但是不初始化,在main函数中对结构体变量挨个赋值,然后引用,正常,
stm8s_type.h文件不动,如果把main.c程序改为以下:
struct PhaseDriveStr MosDri_CW;
void main(void)
{
u8 TempCharX1;
_asm("sim");
SysInit();
MosDri_CW.CCMR_1 = 1;
MosDri_CW.CCMR_2 = 2;
MosDri_CW.CCMR_3 = 3;
MosDri_CW.CCER_1 = 4;
MosDri_CW.CCER_2 = 5;
_asm("rim"); // 允许CPU全局中断
while (1)
{
if (TIM6_SR &0X40 == 0X40)
{
TIM6_SR = 0x00;
TempCharX1 = MosDri_CW.CCMR_3;
if(TempCharX1 == 0)
{
PD_ODR|=0x80;
}
else
{
PD_ODR&=0x7F; //程序运行结果,正常
}
}
}
}
程序运行结果为:LED灯灭
//情况三,结构体变量在main函数中定义并初始化,然后引用,正常
如果main再修改为以下:
void main(void)
{
struct PhaseDriveStr MosDri_CW = {1,2,3,4,5};
u8 TempCharX1;
_asm("sim");
SysInit();
_asm("rim"); // 允许CPU全局中断
while (1)
{
if (TIM6_SR &0X40 == 0X40)
{
TIM6_SR = 0x00;
TempCharX1 = MosDri_CW.CCMR_3;
if(TempCharX1 == 3)
{
PD_ODR|=0x80; //运行结果,正常
}
else
{
PD_ODR&=0x7F;
}
}
}
}
问题总结:
1、如果结构体变量在main()函数之前定义(全局)并初始化,那么引用将出现错误;
2、如果结构体变量在main()函数之前定义(全局),但在main()中挨个赋值,那么引用正常;
3、如果结构体变量在main()函数中定义(局部)并初始化,那么引用也正常;
问题在于,如果我想定义一个全局结构体变量并初始化,不用挨个赋值,按照我的做法将出现错误,请问我的错误在哪里?谢谢大侠们! |
|