我使用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()函数中定义(局部)并初始化,那么引用也正常; 问题在于,如果我想定义一个全局结构体变量并初始化,不用挨个赋值,按照我的做法将出现错误,请问我的错误在哪里?谢谢大侠们! |
RE:STVD结构体初始化问题
RE:STVD结构体初始化问题
建议楼主给出电路图,并写好完整的程序.
回复:STVD结构体初始化问题
我测试了一下,结果是你赋值的内容。真不知道问题出在什么地方,你可以仿真一下,到temp的时候,看看var1里面的值是什么。
我debugging,发现不是我要的值,而是0,是不是STVD少什么东东了呢?
回复:STVD结构体初始化问题
从程序上看,可能是楼主的IO口没有初始化输出。
建议楼主给出电路图,并写好完整的程序.
IO没有问题,我不初始化结构体变量,在main中先赋值,再引用,这样就可以了!为何呢?谢谢啦!
RE:STVD结构体变量初始化问题
struct PhaseDriveStr
{
u8 CCMR_1;
u8 CCMR_2;
u8 CCMR_3;
u8 CCER_1;
u8 CCER_2;
};
回复:STVD结构体变量初始化问题
你把下面的代码考到main里面,试试。
struct PhaseDriveStr
{
u8 CCMR_1;
u8 CCMR_2;
u8 CCMR_3;
u8 CCER_1;
u8 CCER_2;
};
谢谢你的回答,我之前测试过,还是同样的问题,我在怀疑是不是我那个细节没做好?还是我的stvd有问题??还是其他?为什么就不能在main()之前定义并初始化呢?头疼啊。
RE:STVD结构体变量初始化问题
RE:STVD结构体变量初始化问题