来源:公众号【鱼鹰谈单片机】
作者:鱼鹰Osprey
ID :emOsprey
直接操作地址,而不是像 ST 一样通过结构体指针间接操作,给调试带来不便。 没有参数检查功能,这样导致任何参数都能进入函数,从而造成不可预知的破坏。
if(FLASH_GetReadOutProtectionStatus() != SET)
{
FLASH_Unlock();
FLASH_ReadOutProtection(ENABLE);
FLASH_Lock();
}
if(FLASH_GetReadOutProtectionStatus() != RESET)
{
FLASH_Unlock();
FLASH_ReadOutProtection(DISABLE);
FLASH_Lock();
}
if(ob_spc_get() != SET)
{
ob_unlock();
ob_security_protection_config(FMC_LSPC);
ob_start(); // 特别注意这条语句
ob_lock();
}
ob_security_protection_config 函数有参数,目前的参数表示低级别的保护,还有更高级别的保护,但是那种保护是永久性的,无法解除,也就是说你无法通过调试器下载代码了,只能通过你编写的程序里面自带更新的代码更新,否则就变成砖头了(芯片可以用,但无法调试与更新程序)。一般来说低级别保护足够了。 必须调用 ob_start 函数启动改写,否则无法真正写入到寄存器(上电会恢复)。ST 好像没有这个。 ob_start 函数里面有死循环,所以不建议大家直接使用该库函数,而是自己按它的实现方法重新写一个,这样出现问题,可以快速定位(毕竟很少人有勇气怀疑库函数有问题而去查看库函数实现),最起码在死循环前加一条打印信息吧。
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,DISABLE);
rcu_periph_clock_enable(RCU_GPIOA);
gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_PULLDOWN, GPIO_PIN_13 | GPIO_PIN_14);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13 | GPIO_PIN_14);
-THE END-
如果对你有帮助,记得转发分享哦
微信公众号「鱼鹰谈单片机」
每周一更单片机知识
长按后前往图中包含的公众号关注
鱼鹰,一个被嵌入式耽误的畅销书作家
个人微信「EmbeddedOsprey」
长按后打开对方的名片关注