基于51单片机i2c多字节的读写

使用Keil的编译环境下载,确实能够下载,但是入口的地址是如下黄色的那行显示所示,如果单步执行(F11)或全速运行(F5),程序始终在原位置不动(0x1FFF4252),如果强制的将PC指针的值和SP的值修改为0x8000000与0x2000000,然后在点击运行,则能够跑到main()函数,再全速运行,能够看到客户板子上的LED灯的闪烁。

但是如果不强制修改PC和SP指针的值,则程序不执行。

基于51单片机i2c多字节的读写

所以问题就变成为什么程序下载进去后的地址是0x1FFF4252?0x1FFF4252又是什么地址呢?查阅相应的手册,发现0x1FFF4252是处在了Systemmemory区域。

万用表测量了客户板上的Boot0引脚的电平,发现电平不对,达到1.6V,这么高的电平可以被视为高电平了。

基于51单片机i2c多字节的读写

对照客户的原理图,原来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);

  • 基于51单片机i2c多字节的读写已关闭评论
    A+
发布日期:2019年07月14日  所属分类:参考设计