×
单片机 > 单片机程序设计 > 详情

51单片机的i2c多字节的读写24c02

发布时间:2020-08-26 发布时间:
|

使用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都无法作为系统时钟。


将下面几行代码添加到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  读写24c02 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR单片机中RC电容触摸的感应原理解析