IAR FOR 8051 使用中的一个“坑”与大家分享,请君勿入“坑!”
现在数据输出正常吧!
然后要增加新的功能了,这是必须的。
然后…..
加入了一个C文件,sleeptime.c,这是用来设置定时休眠的,源文件如下:
- *****************************************/
- /*引用********************************************/
- #include "SleepTime.h"
- /*宏定义*****************************************/
- bool SleepWakeFlag=false;
- //初始化睡眠定时器
- void init_sleep_timer(void)
- {
- ST2=0X00;
- ST1=0X0F;
- ST0=0X0F;//设置计数值
- EA=1;//开中断
- STIE=1;//使能睡眠定时器中断
- STIF=0;//清除睡眠定时器中断标志
- }
- //设置睡眠时间
- void set_st_period(uint16_t sec)
- {
- uint32_t sleeptimer=0;
- //把ST2:ST1:ST0赋值给sleeptimer
- sleeptimer |=ST0;
- sleeptimer |=(uint32_t)ST1<<8;
- sleeptimer |=(uint32_t)ST2<<16;
- sleeptimer +=((uint32_t)sec*(uint32_t)32768);//低速频率为32.768KHZ,故每秒定时器计数32768次
- //把加N秒的计数值赋给ST2:ST1:ST0
- ST2=(uint8_t)(sleeptimer>>16);
- ST1=(uint8_t)(sleeptimer>>8);
- ST0=(uint8_t)sleeptimer;
- }
- /*中断函数定义********************************/
- //休眠中断唤醒
- #pragma vector=ST_VECTOR
- __interrupt void ST_ISR(void)
- {
- STIF=0;//标志清除
- //ledblink=1;//唤醒
- SleepWakeFlag=true;
- }
上面这个文件只是加入进来,没有调用里面的任何函数哦,
编绎通过,没有报错,下载,运行….
奇怪的事情发生了,串口打印的数据变成了这样:
全部变成了超级大的负值,百思不得其解,清除,重新编绎,再下载,不行!
关闭工程,再打开,不行!
甚至重启了电脑,不是不行。
把上面的sleeptime.c这个文件从工程中移除,重新编绎,再下载,又正常了。
看来只能采用最笨的排除法了,最先怀疑的是这段代码:
- //设置睡眠时间
- void set_st_period(uint16_t sec)
- {
- uint32_t sleeptimer=0;
- //把ST2:ST1:ST0赋值给sleeptimer
- sleeptimer |=ST0;
- sleeptimer |=(uint32_t)ST1<<8;
- sleeptimer |=(uint32_t)ST2<<16;
- sleeptimer +=((uint32_t)sec*(uint32_t)32768);//低速频率为32.768KHZ,故每秒定时器计数32768次
- //把加N秒的计数值赋给ST2:ST1:ST0
- ST2=(uint8_t)(sleeptimer>>16);
- ST1=(uint8_t)(sleeptimer>>8);
- ST0=(uint8_t)sleeptimer;
- }
把这个函数整件屏蔽了,编译,下载,正常。
我的天呐!噩梦还在继续!
只有采用逐行排除了,
- void set_st_period(uint16_t sec)
- {
- uint32_t sleeptimer=0;
- //把ST2:ST1:ST0赋值给sleeptimer
- sleeptimer |=ST0;
- sleeptimer |=(uint32_t)ST1<<8;
- sleeptimer |=(uint32_t)ST2<<16;
- sleeptimer +=((uint32_t)sec*(uint32_t)32768);//低速频率为32.768KHZ,故每秒定时器计数32768次
- //把加N秒的计数值赋给ST2:ST1:ST0
- // ST2=(uint8_t)(sleeptimer>>16);
- // ST1=(uint8_t)(sleeptimer>>8);
- // ST0=(uint8_t)sleeptimer;
- }
- 还是不行,接着屏蔽
- void set_st_period(uint16_t sec)
- {
- uint32_t sleeptimer=0;
- //把ST2:ST1:ST0赋值给sleeptimer
- // sleeptimer |=ST0;
- // sleeptimer |=(uint32_t)ST1<<8;
- // sleeptimer |=(uint32_t)ST2<<16;
- // sleeptimer +=((uint32_t)sec*(uint32_t)32768);//低速频率为32.768KHZ,故每秒定时器计数32768次
- //把加N秒的计数值赋给ST2:ST1:ST0
- // ST2=(uint8_t)(sleeptimer>>16);
- // ST1=(uint8_t)(sleeptimer>>8);
- // ST0=(uint8_t)sleeptimer;
- }
最后屏蔽得就剩下这行代码了
uint32_t sleeptimer=0;
定义了一个长整型的变量,编绎下载,还是不行
看来问题就出在这行代码上了,可实在看不出有什么问题,只能采用各种怀疑了…
难道长整型赋值不对,把代码改成如下:
uint32_tsleeptimer=0L;
编绎通过,吐血,还是不行:
难道这个变量不能定义成局部变量,把这个变量定义放到函数外面试试:
uint32_t sleeptimer=0;
voidset_st_period(uint16_t sec)
{
//把ST2:ST1:ST0赋值给sleeptimer
sleeptimer |=ST0;
sleeptimer |=(uint32_t)ST1<<8;
sleeptimer |=(uint32_t)ST2<<16;
/ sleeptimer+=((uint32_t)sec*(uint32_t)32768);//低速频率为32.768KHZ,故每秒定时器计数32768次
//把加N秒的计数值赋给ST2:ST1:ST0
ST2=(uint8_t)(sleeptimer>>16);
ST1=(uint8_t)(sleeptimer>>8);
ST0=(uint8_t)sleeptimer;
}
编绎,下载,激动人心一刻要来临了,行不行呢?
这里插播一条广告哦,我们把平里产品开发过程中用到的一些芯片、技术顺便做成了模块,与大家一起分享:
https://shop368495242.taobao.com/shop/view_shop.htm?spm=a313o.7775905.a1zvx.d53.35627f98OZfelp&mytmenu=mdianpu&user_number_id=3326006997
欲知后事如何,请先看图:
终于,串口打印数据打印又恢复正常了。