运用Keil的编译环境下载,的确能够下载,可是进口的地址是如下黄色的那行显现所示,假如单步履行(F11)或全速运转(F5),程序一直在原方位不动(0x1FFF4252),假如强制的将PC指针的值和SP的值修正为0x8000000与0x2000000,然后在点击运转,则能够跑到main()函数,再全速运转,能够看到客户板子上的LED灯的闪耀。
可是假如不强制修正PC和SP指针的值,则程序不履行。
所以问题就变成为什么程序下载进去后的地址是0x1FFF4252?0x1FFF4252又是什么地址呢?查阅相应的手册,发现0x1FFF4252是处在了Systemmemory区域。
用万用表丈量了客户板上的Boot0引脚的电平,发现电平不对,到达1.6V,这么高的电平能够被视为高电平了。
对照客户的原理图,本来Boot有上拉和下拉的电阻,焊接的时分将这两个电阻都焊接上去了,去掉上拉电阻,使的BOOT0的引脚接地为低电平,再编译下载进入Keil的环境,程序能够被正常履行了。问题找到了。
关于开始的测验,硬件相同,软件相同,但是IAR能够正常运转,KEIL却不能履行,不解,能够IAR编译环境的设置比较智能。
问题2:调试进入HardFault_Handler函数
网上说了比方仓库溢出,内存溢出的原因,
对照上述办法未处理。查阅发现有可能是stm32L系列运用内部时钟HSI的原因。
stm32L低功耗的芯片在装备体系时钟之前,需求装备flash的拜访方法以ACC64以及LATENCY,还有内核可调电压的规模VOS[1:0]。不然的话,连最高频率32MHz都无法作为体系时钟。
转自:http://bbs.eeworld.com.cn/thread-490070-1-1.html
将下面几行代码添加到systeminit函数的最初。
FLASH_ReadAccess64Cmd( DISABLE);//体系默许是32位拜访,依据状况,能够装备为64位
FLASH_SetLatency(FLASH_Latency_0); //FLASH zero Latency cycle
//使能PWR时钟
SET_BIT(RCC->APB1ENR, RCC_APB1ENR_PWREN);
while(!READ_BIT(RCC->APB1ENR, RCC_APB1ENR_PWREN))
_ _NOP();
//装备内核电压,CPU为高性能。本例中体系时钟最高16MHz
PWR_VoltageScalingConfig(PWR_VoltageScaling_Range1);