1、OTP烧录
1.烧写OTP image(你的代码,你会发现代码并没有烧写完0x40000到0x4ffff的地址内容...)
2.在OTP Header界面下Read from memory 读出原有Header配置信息,直接在上面修改以下项:
(Address)0x47F00--(Value)Yes
(Address)0x47F04--(Value)Yes
(Address)0x47FF4--(Value)otp at 0
修改完后再Burn回芯片去,程序就会从otp启动了
3.以上均为个人测试而得,有两个需要注意的:一是otp一次烧写,以后每次烧写都只能覆盖,地址里每一位置1就不能改回 0,所以烧写image需慎重;二是一旦从otp启动,蓝牙的物理id(xx.xx.xx.xx.xx.xx)将由Header表里0x47fd4,0x47fd8这两位的数据而定,而不是代码里写的了。。。这个貌似也可以在代码里修改设定,我还没找到~~
2、低功耗控制
1、user_config.h中将变量 改成这样const static sleep_state_t app_default_sleep_mode=ARCH_SLEEP_OFF;
2、da14580x_config_advanced.h中将 #define CFG_LP_CLK LP_CLK_RCX20 这里宏定义很重要,如果你外部没有接32K,这里一定要配置成内部,不然进入低功耗起不来
在设完上面的参数后功耗降了很多,而且工作很正常,接着我把程序烧进flash后,能正常在工作。但是当我再次想烧录的时候就是烧不尽,而且在线调试也调不了。最后分析是因为单片机一直进入低功耗,导致下载都不行。所以 最后采用上电后前一分钟不进入低功耗,1分钟后再进入。直接调用这个函数即可arch_set_sleep_mode(ARCH_EXT_SLEEP_ON);
3、IO控制
DA14580 为了把功耗做的很低,在低功耗的模式的时候大部分外设都会关掉,包括IO口
arch_turn_peripherals_off()这个是睡眠之前对配置全部关掉。SetBits16(SYS_CTRL_REG, PAD_LATCH_EN, 0); 这个是锁定管脚
系统唤醒之后会调用外设初始化,periph_init()
在set_pad_functions(),获取IO口状态,然后重新设置
SetBits16(SYS_CTRL_REG, PAD_LATCH_EN, 1) 把引脚从锁死状态下 解开
4、进入低功耗后的问题
在进入扩展睡眠的时候,RAM数据是不保存的,只有在变量后面加
__attribute__((section("retention_mem_area0"),zero_init))
这个变量才会休眠保存
所以在设计这个任务执行的时候要特别注意,那些变量是进入需要睡眠保存的,避免出现一些很奇怪的问题
在休眠唤醒后也需要先把外设再初始化
if (GetBits16(SYS_STAT_REG, PER_IS_DOWN))
{
periph_init();
}
if (arch_ble_ext_wakeup_get())
{
arch_set_sleep_mode(app_default_sleep_mode);
arch_ble_force_wakeup();
arch_ble_ext_wakeup_off();
app_easy_wakeup();
}