STM32之Keil、Proteus配置问题引起的程序执行卡住

这学期参加了个比赛,要设计作品,需要用到单片机,之前一直都是用的51单片机,但想到51性能和功能有限,所以打算学STM32单片机来做作品,为此特意买了应用案例书本来照着学。

直到前2天,我学到定时中断,因为学过51单片机的定时中断的缘故,对这还是有点感觉的,感觉信手拈来,代码写好了,把报错都修了,程序也没问题了,通常来说这个时候程序就可以用了对吧?问题来了,我在用Proteus8.17仿真STM32F103C8的时候,程序总是达不到预期效果,因为之前有类似因为逻辑问题导致的BUG,所以我就查代码,每一行都对过了,甚至固件库我都看过了,不能说相差无几吧,只能说一模一样,我查过许多网上的文章,甚至我还把书中的源代码拷过来删,删到只有这一个功能的程度,还是不行,实属无奈的情况下,我在那个代码中的不同的位置添加GPIO端口翻转代码,其实类似断点调试,但我懒得用(主要是不熟练^_^),发现问题出在如下这行:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

这行代码之前的都可以运行,但是直到这行代码就卡住了,发现问题了,好啊,问题已经解决一大部分了,那我就按照这个去搜索文章,结果还是没办法,就这样,陷入僵局了,苦恼了我3天啊,书我都翻烂了,始终想不出问题,甚至我还怀疑是不是还需要开其他时钟才行,结果都没用。折腾这玩意,尤其是没人指导的情况下(关键能问的都不会),真的心态炸裂。

直到昨天,我做最后的尝试,修改Keil为仿真调试。调试的时候还真让我发现了问题所在,程序一直会卡在上面这个代码不错,但是这个代码会调用固件库的system_stm32f10x.c中的下面这个函数:

static void SetSysClockToHSE(void)

这函数是用于选择外部高速时钟(HSE)作为系统时钟的函数,调用这个没问题;可是问题就出在这个函数内部,当调用它之后就会卡在它函数内部的下面这个代码部分,不断循环

do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

 这个循环就是等待外部时钟准备好,否则一直阻塞在这里。

好,现在问题的本质终于找到了,那好啊,那根据这意思我就以这部分中的一个关键变量HSEStatus为关键词搜索文章,还真让我搜到了,也有人遇到类似的问题,原来是需要修改Keil的Debug参数才行,不然仿真就会这样。但是修改了还是解决不了,那我就看看书里有没有提到环境的事情,还真有,在第四章的时候也有需要修改Debug选项卡参数,可让我一顿好苦恼啊,总算搞定了,程序debug不会卡死了。

修改方法如下:

1.点击Keil的魔法棒(Options for Target)

2.进入Debug选项卡

3.修改下面2组的Dialog DLL和Parameter,Dialog DLL就左边改为DARMSTM.DLL,右边改为TARMSTM.DLL,Parameter改为你仿真的型号并且前面加个-p就行,我的是STM32F103RC所以我填了这个。具体格式看下面图

4.确定后,编译再debug一遍就不会卡死了

当然啦,事情到这里,Keil这边程序卡住的问题是解决了,但是问题又来了,把编译出来的hex文件拷到Proteus运行还是不行,秉持着勇于尝试的冒险精神,我把所有针对单片机仿真的骚操作都试一遍,还真让我发现了

在图中框出的这个位置,必须手动设定时钟频率,哪怕你电路上连接了片外晶振提供时钟信号都不行,就这里必须修改,我用的是高速8MHz,低速32.768kHz(别管,书上就这么说的,而且确实在定时的时候好用),修改完以后再跑电路仿真就没问题了,我的天,终于解决了!(嚎啕大哭)

问题到这里就全部解决了,包括Keil程序问题和Proteus仿真问题。讲真的,如果要学单片机,尤其是没人带领的情况下自学,你要会折腾,会搜BUG文章,更要有耐心,就这个问题搞得我寝食难安,上课在想,下课也在想,差点就劝退了,不过好在还是解决了。

最后,感谢您的阅读,希望本篇文章对您有帮助,祝您前程似锦,心想事成^_^

  • 15
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值