stm8s单片机程序初始化加延时的后果

swg1991 2018-10-26 01:53:16
问一下在初始化用延时会有什么后果
void init_1(void) //初始化
{
TIM1_CCR1H = 0;
TIM1_CCR2H = 0;
TIM1_CCR3H =0;
TIM1_CCR1L = 0;
TIM1_CCR2L = 0;
TIM1_CCR3L = 0;
enableInterrupts(); //使能全局中断
// for(aiai=0;aiai<100;aiai++); //等待时间
err_en=1; //可以判断短路标志
}


int main(void)
{
init(); //系统初始化
init_1(); //开机初始化
while(1)
{
if((jdc_on==1)&&(error_sign==0)) //延时1s 模块没有故障
{
OUT=1; //继电器吸合
ad_pd(); //AD
}
IWDG_KR=0xAA; //喂狗数据变为0XFF
}
}


在init_1中增加这句延时后 for(aiai=0;aiai<100;aiai++); 单片机会出现程序跑飞的情况,会是这句语句引起的吗??? 为什么?
...全文
416 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly 100% 2018-10-30
  • 打赏
  • 举报
回复
无意义的for 循环编译器会优化掉,延时最好使用计数器等硬件
DigCore 2018-10-29
  • 打赏
  • 举报
回复
这句代码:
enableInterrupts(); //使能全局中断
开启了全局中断后,不知道你的
init(); //系统初始化
里是否有开门狗的使能,如果有,很有可能是因为在这里做了延时,程序未能及时进入主循环里进行以下的喂狗
IWDG_KR=0xAA; //喂狗数据变为0XFF

尝试把看门狗关掉吧。或者把喂狗的时间设的长一些,至少超过你的那个 for 循环延时!


<www.digcore.cn>
DigCore 2018-10-29
  • 打赏
  • 举报
回复
那么说跟这个for还没关系。

最好的办法是,缕清你的程序逻辑,先回到最初单一功能,逐个增加相应的初始化,首先确定问题点,具体是不是看门狗的问题,也有可能你的其他模块配置错误导致触发的硬件中断。

首先去掉看门狗吧,逐个找问题。

你就这么贴几行代码,都不知道其他模块在干啥,很难判断问题,问题是调试调出来,不是几行代码看出来的。

如果可以确定是看门狗的问题,我推荐你好好看下STM8看门狗这块的相关设置。

欢迎关注公众号:DigCore
欢迎访问博客主页:http://www.digcore.cn
swg1991 2018-10-29
  • 打赏
  • 举报
回复
@DigCore
void wgd_init(void) // DOG
{

IWDG_KR = 0xCC; // 启动IWDG
IWDG_KR = 0x55; // 解除 PR 及 RLR 的写保护
IWDG_RLR = 0xFF; // 看门狗计数器重装载数值
IWDG_PR = 0x06; // 分频系数为256,最长超时时间为:1.02S
IWDG_KR = 0xAA; // 刷新IDDG,避免产生看门狗复位,同时恢复 PR 及 RLR 的写保护状态

}

void init(void)
{

clk_init(); //时钟
Init_Timer1();
Init_Timer4();
Init_GPIO();
ad_init(); //ad初始化
wgd_init(); // DOG
init_int(); //中断
}
-------------------------------------------------------------------------------*/
#pragma vector=2
__interrupt void TLI_IRQHandler(void) //短路输出
{
if(err_en==1)
{
motor_off(); //电机关闭
error_sign=1; //有故障 AD关
OUT=0; //继电器关
DL=50; //快闪1
errout=0; //有故障
}
}

你好 我再 init 里面开启了看门狗,取消的for延时 还是有这个情况?
yishumei 2018-10-26
  • 打赏
  • 举报
回复
引用 5 楼 swg1991 的回复:
@weixin_39671847 ,出现这样的情况概率有个百分之50 50次启动会有一次没有进入while里面,因为开启了看门狗也没有复位,应该是跑飞了
楼主把看门狗关了再试试
swg1991 2018-10-26
  • 打赏
  • 举报
回复
@weixin_39671847 ,出现这样的情况概率有个百分之50
50次启动会有一次没有进入while里面,因为开启了看门狗也没有复位,应该是跑飞了
swg1991 2018-10-26
  • 打赏
  • 举报
回复
应该是没有跑进去,因为有时候是可以的
yishumei 2018-10-26
  • 打赏
  • 举报
回复
楼主,延时在使能中断之后,单片机是不是跑到中断处理函数里了?延时语句本身没有任何问题。
weixin_39671847 2018-10-26
  • 打赏
  • 举报
回复
单片机应使用专门的计数器进行定时,这种情况下for循环不能用
dceacho 2018-10-26
  • 打赏
  • 举报
回复
程序没贴完整,看不出什么问题

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧