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

描述

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

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

22dd6fd710e83ecf38eceefab14276c6.png

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

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

1f103ea23e1732acdc89f9c2bd86209f.png

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

打开APP阅读更多精彩内容

点击阅读全文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值