你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32L152系列加入读保护后程序主函数不运行

[复制链接]
你画我猜 提问时间:2015-7-10 11:32 /
使用stm32L152系列整体功能正常,不加入读保护的时候LED1,正常运行,当加入读保护后,程序下进去,关机开机后,LED1,不亮,程序供电没有问题,发现程序根本就不执行了,感觉单片机锁死了。   研究好几天了,希望大家帮忙看看吧。代码如下
void Flash_RProt_ENABLE(void)
{
    u8 status;
    FLASH_Unlock();//解锁FLASH
    FLASH_OB_Unlock();//解锁选项字
    FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_SIZERR | FLASH_FLAG_OPTVERR);
    status=FLASH_OB_GetRDP();
    if(status==0)
    {
      FLASH_OB_RDPConfig(OB_RDP_Level_1);//Read protection of the memory
      FLASH_OB_Lock();
      FLASH_Lock();
    }
}

int main(void)
{
Flash_RProt_ENABLE();
  Main_Init();//时钟初始化,IO口初始化
  while(1)         
  {LED1_OPEN()  }

}

收藏 评论17 发布时间:2015-7-10 11:32

举报

17个回答
你画我猜 回答时间:2015-7-13 13:47:16
安 发表于 2015-7-13 09:58
如果不加密可以运行,加密不能运行,也就是说在加密的地方死掉了。在加密的过程中加串口输出,看看执行到哪 ...

按照你说的修改程序,程序如下:
void Flash_RProt_ENABLE(void)
{
    u8 status;
//    FLASH_Unlock();//解锁FLASH
    FLASH_OB_Unlock();//解锁选项字
    UART1_SENDDATA(0x02);
    FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_SIZERR | FLASH_FLAG_OPTVERR);
    UART1_SENDDATA(0x03);
    status=FLASH_OB_GetRDP();
    UART1_SENDDATA(0x04);

    if(status==0)
    {
      FLASH_OB_RDPConfig(OB_RDP_Level_1);//Read protection of the memory
      UART1_SENDDATA(0x05);
      FLASH_OB_Lock();
      UART1_SENDDATA(0x06);
      //FLASH_Lock();
    }
}
int main(void)
{
  Main_Init();
  UART1_SENDDATA(0x01);
  Flash_RProt_ENABLE();
  while(1)         
  {  
   

  }
}
程序下进去后,不断电,串口接到01 02 03 04 05 06  正常显示。
断电后,串口接收不到任何数据,我感觉是读保护起作用后,是不是起始的堆栈发生改变了,找不到如何堆栈了。我用的是IAR软件
你画我猜 回答时间:2015-7-13 09:52:16
安 发表于 2015-7-10 16:51
说明程序死了。仿真一下或者加串口输出,看看到最后到哪儿死掉的。

程序下进去后,如果不断电程序运行正常,但是一断电程序就运行不了了,也不能仿真了,得用软件将程序的FLASH读保护擦除,才可以继续仿真下载程序
你画我猜 回答时间:2015-7-13 14:44:13
安 发表于 2015-7-13 14:03
楼主查一下系统时钟的配置。看看是不是进入了HardFault_Handler中断。

测试过了,没有进入HardFault_Handler等中断,给我的感觉就是压根就没有进入程序,不知道堆栈指哪里去了
你画我猜 回答时间:2015-7-10 16:06:18
求高手回复啊,已经研究好几天了,也没有个结果,我用的是IAR编译器,keil也用了,效果都一样。
废鱼 回答时间:2015-7-10 16:51:33
说明程序死了。仿真一下或者加串口输出,看看到最后到哪儿死掉的。
chifen 回答时间:2015-7-10 20:00:51
用软件烧写加密就可以实现读保护功能,应该不用在程序里另外做吧
左岸右岸 回答时间:2015-7-10 20:23:49
不懂呢,帮顶吧
你画我猜 回答时间:2015-7-13 09:53:32
chifen 发表于 2015-7-10 20:00
用软件烧写加密就可以实现读保护功能,应该不用在程序里另外做吧

我用J-FLASH-ARM软件加入读保护,遇到的问题是一样的,下进去后在一开机程序运行不了了。
废鱼 回答时间:2015-7-13 09:58:09
如果不加密可以运行,加密不能运行,也就是说在加密的地方死掉了。在加密的过程中加串口输出,看看执行到哪一步的时候死掉的。
废鱼 回答时间:2015-7-13 14:03:31
楼主查一下系统时钟的配置。看看是不是进入了HardFault_Handler中断。
你画我猜 回答时间:2015-7-13 14:47:50
安 发表于 2015-7-13 14:03
楼主查一下系统时钟的配置。看看是不是进入了HardFault_Handler中断。

检查过了,没有进入HardFault_Handler等中断,读保护下进去后堆栈不知道去哪里了,0xAAAAAAAA?是哪里
废鱼 回答时间:2015-7-13 15:02:14
你把加保护的去掉试试。
你画我猜 回答时间:2015-7-13 15:07:09
加保护去掉,程序完全正常。
废鱼 回答时间:2015-7-13 15:13:21
FLASH_OB_Unlock();//
这个是自己写的吗?
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版