DA14531 学习笔记经验总结
Posted 不咸不要钱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DA14531 学习笔记经验总结相关的知识,希望对你有一定的参考价值。
DA14531 学习笔记(二)经验总结
烧录
Flash
DA14531 为了降低成本和功耗,片内有32KB的OTP用于存放用户程序。
OTP只能烧录一次,为了方便调试,DA14531还支持外部flash。
使用外部flash时,首先需要根据硬件配置flash对应管脚
然后连接烧录就可以了
OTP
正式生产的时候就需要将外部flash去掉,烧录OTP。OTP烧录分为两部分,OTP header 和 固件
OTP header
-
禁用jtag管脚
-
使用OTP
两个标志位需要选择yes
-
设置MAC地址
使用public 地址时,可以设置这里
-
OTP 长度
上电后,需要使用DMA将OTP中的代码搬运到RAM(OTP不能跑代码),实测这里不填实际长度也可以(使用默认FFFFFFFF)
SDK 框架
DA14531 SDK不建议修改程序结构,也就是不建议修改mian函数。程序的执行流程如下
根据SDK框架的程序执行流程,用户可以在回调函数中添加自己的代码,而不需要直接修改mian函数。
回调函数在user_callback_config.h 文件中
MAC地址
静态随机地址
选择使用静态随机地址
默认静态随机地址生成函数,可以修改成自己的。
也可以在广播开始前修改
#include "llm.h"
#include "lld_util.h"
/* 使用静态地址时, 可以修改这里修改地址 */
llm_le_env.rand_add.addr[0] = 0x00;
llm_le_env.rand_add.addr[1] = 0x01;
llm_le_env.rand_add.addr[2] = 0x02;
llm_le_env.rand_add.addr[3] = 0x03;
llm_le_env.rand_add.addr[4] = 0x04;
llm_le_env.rand_add.addr[5] = 0xC9;
广播开始后修改地址
#include "llm.h"
#include "lld_util.h"
llm_le_env.rand_add.addr[0] = 0x01;
...
lld_util_set_bd_address(&llm_le_env.rand_add, ADDR_RAND);
公共地址
设置公共地址
公共地址默认设置
当OTP header 中的地址字节不是 0xFFFFFFFFFFFF 时,CFG_NVDS_TAG_BD_ADDRESS 的默认地址将会无效,工程使用OTP Header 中的MAC地址
程序可以通过 nvds_get_func 函数来获取公共地址
#include "llm.h"
/* 获取广播地址 */
uint8_t addr[6];
nvds_get_func(NVDS_TAG_BD_ADDRESS, NULL, addr);
低功耗
DA14531的框图如下所示,突出显示的红色框是放置保留存储器块的位置,其中包括SysRAM1(16kB),SysRAM2(12kB)和SysRAM3(20kB)。因此,总共有48kB的系统RAM可用。
DA14531 有三种休眠模式:
-
扩展睡眠模式
在扩展休眠模式下,除 SysRAM、无线电域和外设域外设域外,系统域将断电,XTAL16M 时钟将停止。SysRAM 仍通电以保留数据,但无法访问。
AON电源域为ON,用于将数据保存在保留RAM中,并为可以唤醒系统的模块(即唤醒计时器,正交解码器和BLE计时器)供电。
-
深度睡眠模式
在深度睡眠模式下,为了进一步降低功耗,SysRAM也断电。其他电源域的状态与在扩展休眠模式下的状态相同。
该器件可以使用时钟唤醒控制器、GPIO、RTC 警报或定时器1从深度睡眠中唤醒。
-
休眠休眠模式
与前两种睡眠模式相比,在休眠模式下,PD_SLP(睡眠电源域)域将关闭。这意味着CRG(时钟和复位发生器)已关闭电源,这就是为什么此模式称为无时钟模式的原因。
设备只能从配置为唤醒的 GPIO 中唤醒。用于将设备从休眠状态唤醒的可用GPIO P0_1,P0_2…P0_5。
睡眠模式由 SDK 中的#defines配置
-
Extended Sleep mode
扩展睡眠模式可以选择 ARCH_EXT_SLEEP_OTP_COPY_ON 模式(代码RAM休眠,休眠后功耗会更低(只保留数据RAM),但是退出休眠时需要从OTP中将代码搬运到RAM,这部分操作也会耗电,如果休眠周期小于1s,不建议使用 ARCH_EXT_SLEEP_OTP_COPY_ON 模式)和 ARCH_EXT_SLEEP_ON模式。休眠时SDK会自动计算出RAM Blank使用情况,将未使用的RAM关闭。
扩展睡眠模式可以通过RTC,Timer1, BLE timer唤醒,例如如果有BLE事件(如定时广播等),则BLE Timer可以唤醒DA14531.如果没有BLE唤醒,也可以设置额外的定时唤醒周期。
-
Deep Sleep mode
-
Hibernation mode
深度睡眠模式和 休眠休眠模式比较类似,可以选择性关闭RAM 或者保留全部RAM,当关闭所有RAM后,休眠时更省电,但是唤醒时需要重新将代码从OTP加载到RAM。使用的时候需要定义相对的宏定义并定义唤醒方式,具体可以参考SDK中\\projects\\target_apps\\ble_examples\\prox_reporter 或者 扩展SDK中的hibernation 例子
/** **************************************************************************************** * * @file user_proxr.h * * @brief Proximity Project application header file. * * Copyright (C) 2015-2020 Dialog Semiconductor. * This computer program includes Confidential, Proprietary Information * of Dialog Semiconductor. All Rights Reserved. * **************************************************************************************** */ #ifndef _USER_PROXR_H_ #define _USER_PROXR_H_ /** **************************************************************************************** * @addtogroup APP * @ingroup RICOW * * @brief User Application entry point. * * @ **************************************************************************************** */ /* * INCLUDE FILES **************************************************************************************** */ #include <stdint.h> #include "gapc_task.h" /* * DEFINES **************************************************************************************** */ /**************************************************************************************** * Selects the sleep mode that the device will enter after advertising completion * * - CFG_APP_GOTO_DEEP_SLEEP Deep Sleep mode * * - CFG_APP_GOTO_HIBERNATION Hibernation mode (DA14531 only) * * - CFG_APP_GOTO_STATEFUL_HIBERNATION Stateful Hibernation mode (DA14531 only) * * Note: If none is defined, then system will enter the selected Extended sleep mode * * * * IMPORTANT: If CFG_APP_GOTO_STATEFUL_HIBERNATION is defined, CFG_STATEFUL_HIBERNATION * * shall be defined as well (in Options for Target 'DA14531' --> Asm --> * * Conditional Assembly Control Symbols --> Define:) * ****************************************************************************************/ #undef CFG_APP_GOTO_DEEP_SLEEP #if defined (__DA14531__) #undef CFG_APP_GOTO_HIBERNATION #undef CFG_APP_GOTO_STATEFUL_HIBERNATION #if defined (CFG_APP_GOTO_HIBERNATION) /**************************************************************************************** * Hibernation mode configuration * ****************************************************************************************/ #define CFG_HIBERNATION_RAM1 PD_SYS_DOWN_RAM_OFF #define CFG_HIBERNATION_RAM2 PD_SYS_DOWN_RAM_OFF #define CFG_HIBERNATION_RAM3 PD_SYS_DOWN_RAM_OFF #define CFG_HIBERNATION_REMAP REMAP_ADDR0_TO_ROM #define CFG_HIBERNATION_PAD_LATCH_EN false #elif defined (CFG_APP_GOTO_STATEFUL_HIBERNATION) /**************************************************************************************** * Stateful Hibernation mode configuration * ****************************************************************************************/ #define CFG_STATEFUL_HIBERNATION_RAM1 PD_SYS_DOWN_RAM_ON #define CFG_STATEFUL_HIBERNATION_RAM2 PD_SYS_DOWN_RAM_ON #define CFG_STATEFUL_HIBERNATION_RAM3 PD_SYS_DOWN_RAM_ON #define CFG_STATEFUL_HIBERNATION_REMAP STATEFUL_HIBERN_REMAP_ADDR0_TO_RAM1 #define CFG_STATEFUL_HIBERNATION_PAD_LATCH_EN false #endif // CFG_APP_GOTO_HIBERNATION #endif // __DA14531__ #if defined (CFG_APP_GOTO_DEEP_SLEEP) && (defined (CFG_APP_GOTO_HIBERNATION) || defined (CFG_APP_GOTO_STATEFUL_HIBERNATION)) #error "Config error: Can not define both CFG_APP_GOTO_DEEP_SLEEP and CFG_APP_GOTO_HIBERNATION/CFG_APP_GOTO_STATEFUL_HIBERNATION." #endif #if defined (CFG_SPI_FLASH_ENABLE) && (defined (CFG_APP_GOTO_HIBERNATION) || defined (CFG_APP_GOTO_STATEFUL_HIBERNATION)) #error "Config error: Can not define both CFG_SPI_FLASH_ENABLE and CFG_APP_GOTO_HIBERNATION/CFG_APP_GOTO_STATEFUL_HIBERNATION." #endif #if defined (CFG_APP_GOTO_DEEP_SLEEP) /**************************************************************************************** * Deep Sleep mode and Wake-up from Deep Sleep Configuration * * Selects the trigger mechanism to wake up from deep sleep. * * * * - CFG_DEEP_SLEEP_WAKEUP_POR - Wake up from POR pin * * * * - CFG_DEEP_SLEEP_WAKEUP_GPIO - Wake up from WakeUp Controller * * * * - CFG_DEEP_SLEEP_WAKEUP_RTC - Wake up from RTC Timer (only in DA14531) * * * * - CFG_DEEP_SLEEP_WAKEUP_TIMER1 - Wake up from Timer1 (only in DA14531) * * * * NOTE: * * A hardware reset or power cycle will always wake up the system from deep sleep. * ****************************************************************************************/ #undef CFG_DEEP_SLEEP_WAKEUP_POR #define CFG_DEEP_SLEEP_WAKEUP_GPIO /**************************************************************************************** * Deep sleep mode configuration * ****************************************************************************************/ #define CFG_DEEP_SLEEP_RAM1 PD_SYS_DOWN_RAM_OFF #define CFG_DEEP_SLEEP_RAM2 PD_SYS_DOWN_RAM_OFF #define CFG_DEEP_SLEEP_RAM3 PD_SYS_DOWN_RAM_OFF #define CFG_DEEP_SLEEP_PAD_LATCH_EN false #if defined (__DA14531__) #undef CFG_DEEP_SLEEP_WAKEUP_RTC #undef CFG_DEEP_SLEEP_WAKEUP_TIMER1 #endif #if defined (CFG_DEEP_SLEEP_WAKEUP_POR) && defined (CFG_DEEP_SLEEP_WAKEUP_GPIO) #error "Config error: Can not define both CFG_DEEP_SLEEP_WAKEUP_POR and CFG_DEEP_SLEEP_WAKEUP_GPIO." #endif #if !defined (CFG_DEEP_SLEEP_WAKEUP_POR) && !defined (CFG_DEEP_SLEEP_WAKEUP_GPIO) && \\ !defined (CFG_DEEP_SLEEP_WAKEUP_RTC) && !defined (CFG_DEEP_SLEEP_WAKEUP_TIMER1) #error "Config error: At least one wake-up source has to be selected." #endif #endif /**************************************************************************************** * Wake-up from Extended Sleep Configuration * * Selects the trigger mechanism to wake up from extended sleep. * * * * - CFG_EXT_SLEEP_WAKEUP_RTC - Wake up from RTC Timer (only in DA14531) * * * * - CFG_EXT_SLEEP_WAKEUP_TIMER1 - Wake up from Timer1 (only in DA14531) * * * * NOTE: * * If none is defined, then system will wake up from extended sleep by button press. * ****************************************************************************************/ #undef CFG_EXT_SLEEP_WAKEUP_RTC #undef CFG_EXT_SLEEP_WAKEUP_TIMER1 #if defined (CFG_EXT_SLEEP_WAKEUP_RTC) && defined (CFG_EXT_SLEEP_WAKEUP_TIMER1) #error "Config error: Can not define both CFG_EXT_SLEEP_WAKEUP_RTC and CFG_EXT_SLEEP_WAKEUP_TIMER1." #endif /* * FUNCTION DECLARATIONS **************************************************************************************** */ /** **************************************************************************************** * @brief Enable push button. Register callback function for button press event. * Must be called in periph_init(). **************************************************************************************** */ void app_button_enable(void); /** **************************************************************************************** * @brief Function to be called on the advertising completion event. * @param[in] status GAP Error code **************************************************************************************** */ void app_advertise_complete(const uint8_t status); #if (BLE_SUOTA_RECEIVER) /** **************************************************************************************** * @brief Function called when the SUOTAR status changes. * @param[in] suotar_event SUOTAR_START or SUOTAR_STOP **************************************************************************************** */ void on_suotar_status_change(const uint8_t suotar_event); #endif // BLE_SUOTA_RECEIVER /** **************************************************************************************** * @brief Disconnection function. * @param[in] param Pointer to GAPC_DISCONNECT_IND message **************************************************************************************** */ void user_app_on_disconnect(struct gapc_disconnect_ind const *param); /// @ APP #endif // _USER_PROXR_H_
ADC
ADC内部有一个分压电路,使用的时候需要注意。
学习笔记,如有错误,欢迎斧正。
以上是关于DA14531 学习笔记经验总结的主要内容,如果未能解决你的问题,请参考以下文章