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

查看: 6925|回复: 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版