你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 6912|回复: 8

STVD结构体变量初始化问题

[复制链接]

3

主题

28

回帖

0

蝴蝶豆

初级会员

最后登录
2018-7-19
发表于 2012-3-1 14:50:21 | 显示全部楼层 |阅读模式
我使用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()函数中定义(局部)并初始化,那么引用也正常;
问题在于,如果我想定义一个全局结构体变量并初始化,不用挨个赋值,按照我的做法将出现错误,请问我的错误在哪里?谢谢大侠们!
回复

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2012-3-1 15:43:42 | 显示全部楼层

RE:STVD结构体初始化问题

我测试了一下,结果是你赋值的内容。真不知道问题出在什么地方,你可以仿真一下,到temp的时候,看看var1里面的值是什么。
回复 支持 反对

使用道具 举报

19

主题

31

回帖

4

蝴蝶豆

初级会员

最后登录
2020-12-2
发表于 2012-3-1 17:23:39 | 显示全部楼层

RE:STVD结构体初始化问题

从程序上看,可能是楼主的IO口没有初始化输出。
建议楼主给出电路图,并写好完整的程序.
回复 支持 反对

使用道具 举报

3

主题

28

回帖

0

蝴蝶豆

初级会员

最后登录
2018-7-19
 楼主| 发表于 2012-3-1 23:28:46 | 显示全部楼层

回复:STVD结构体初始化问题

回复第 2 楼 于2012-03-01 07:43:42发表:
我测试了一下,结果是你赋值的内容。真不知道问题出在什么地方,你可以仿真一下,到temp的时候,看看var1里面的值是什么。 

我debugging,发现不是我要的值,而是0,是不是STVD少什么东东了呢?
回复 支持 反对

使用道具 举报

3

主题

28

回帖

0

蝴蝶豆

初级会员

最后登录
2018-7-19
 楼主| 发表于 2012-3-1 23:30:01 | 显示全部楼层

回复:STVD结构体初始化问题

回复第 3 楼 于2012-03-01 09:23:39发表:
从程序上看,可能是楼主的IO口没有初始化输出。
建议楼主给出电路图,并写好完整的程序. 

IO没有问题,我不初始化结构体变量,在main中先赋值,再引用,这样就可以了!为何呢?谢谢啦!
回复 支持 反对

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2012-3-2 09:18:31 | 显示全部楼层

RE:STVD结构体变量初始化问题

你把下面的代码考到main里面,试试。
struct PhaseDriveStr
{               
u8 CCMR_1;
u8 CCMR_2;
u8 CCMR_3;
u8 CCER_1;
u8 CCER_2;
};
回复 支持 反对

使用道具 举报

3

主题

28

回帖

0

蝴蝶豆

初级会员

最后登录
2018-7-19
 楼主| 发表于 2012-3-2 09:35:54 | 显示全部楼层

回复:STVD结构体变量初始化问题

回复第 6 楼 于2012-03-02 01:18:31发表:
你把下面的代码考到main里面,试试。
struct PhaseDriveStr
{
u8 CCMR_1;
u8 CCMR_2;
u8 CCMR_3;
u8 CCER_1;
u8 CCER_2;
};
 

 
谢谢你的回答,我之前测试过,还是同样的问题,我在怀疑是不是我那个细节没做好?还是我的stvd有问题??还是其他?为什么就不能在main()之前定义并初始化呢?头疼啊。
回复 支持 反对

使用道具 举报

3

主题

28

回帖

0

蝴蝶豆

初级会员

最后登录
2018-7-19
 楼主| 发表于 2012-3-2 14:17:30 | 显示全部楼层

RE:STVD结构体变量初始化问题

大侠,指教一下,是不是有其他问题?
回复 支持 反对

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2012-3-2 14:55:16 | 显示全部楼层

RE:STVD结构体变量初始化问题

我给你测试过,我这里显示的是正确的啊。
回复 支持 反对

使用道具 举报

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版