DA1469x使用记录
Posted while(1)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DA1469x使用记录相关的知识,希望对你有一定的参考价值。
文章目录
1 低功耗管理
参考资料:
- da1469x_software_platform_reference
- 《STM32F103 FreeRTOS开发手册V1.1》主要看FreeRTOS的介绍
1.1 进入休眠与退出休眠的总概览
FreeRTOS 就是通过在处理器处理空闲任务的时候将处理器设置为低功耗模式来降低能耗。一般会在空闲任务的钩子函数中执行低功耗相关处理,比如设置处理器进入低功耗模式、关闭其他外设时钟、降低系统主频等等。
这里就需要使用FreeRTOS的Tickless 模式,即当处理器进入空闲任务周期以后就关闭系统节拍中断(滴答定时器中断),只有当其他中断发生或者其他任务需要处理的时候处理器才会被从低功耗模式中唤醒。
1.2 FreeRTOS低功耗管理分析
这部分低功耗管理主要由FreeRTOS系统处理
1.2.1 Tickless 具体实现
总体请参考《STM32F103 FreeRTOS开发手册V1.1》中Tickless 相关章节
重点关注如下几个:
-
宏
#define configUSE_TICKLESS_IDLE 2
定义为 2,是因为portSUPPRESS_TICKS_AND_SLEEP()由用户自己实现(这里是由DA1469X提供),如下:#define portSUPPRESS_TICKS_AND_SLEEP( x ) prvSystemSleep( x )
函数
prvSystemSleep( x )
在 sdk\\free_rtos\\portable\\GCC\\DA1469x\\port.c 中。 -
宏
configPRE_SLEEP_PROCESSING ()
和configPOST_SLEEP_PROCESSING()
在真正的低功耗设计中不仅仅是将处理器设置到低功耗模式就行了,还需要做一些其他的处理,比如:
● 将处理器降低到合适的频率,因为频率越低功耗越小,甚至可以在进入低功耗模式以后
关闭系统时钟。
● 修改时钟源,晶振的功耗肯定比处理器内部的时钟源高,进入低功耗模式以后可以切换
到内部时钟源,比如 STM32 的内部 RC 振荡器。
● 关闭其他外设时钟,比如 IO 口的时钟。
● 关闭板子上其他功能模块电源,这个需要在产品硬件设计的时候就要处理好,比如可以通过 MOS 管来控制某个模块电源的开关,在处理器进入低功耗模式之前关闭这些模块的电源。
FreeRTOS 为我们提供了一个宏来完成这些操作,它就是configPRE_SLEEP_PROCESSING()
,这个宏的具体实现内容需要用户去编写。如果在进入低功耗模式之前我们降低了处理器频率、关闭了某些外设时钟等的话,那在退出低功耗模式以后就 需 要 恢 复 处 理 器 频 率 、 重 新 打 开 外 设 时 钟 等 , 这 个 操 作 在 宏configPOST_SLEEP_PROCESSING()
中完成,同样的这个宏的具体内容也需要用户去编写。
使用举例:
在DA1469x的SDK代码中如下:#define configPRE_SLEEP_PROCESSING( x ) #define configPOST_SLEEP_PROCESSING()
configPRE_SLEEP_PROCESSING 具体应用位置:
prvSystemSleep -> pm_sleep_enter -> apply_wfi -> configPRE_SLEEP_PROCESSING( sleep_period );
configPOST_SLEEP_PROCESSING 具体应用位置:
prvSystemSleep -> pm_sleep_enter -> system_wake_up -> sys_init_wake_up -> configPOST_SLEEP_PROCESSING();而这里并没有定义具体函数,可由用户自己定义,比如可以通过 MOS 管来控制某个模块电源的开关
1.2.2 空闲任务具体实现
当 FreeRTOS 的调度器启动以后就会自动的创建一个空闲任务,即当调用函数 vTaskStartScheduler()启动任务调度器的时候此函数就会自动创建空闲任务,而DA1469x的低功耗就是在空闲任务中实现的。
#define portSUPPRESS_TICKS_AND_SLEEP( x ) prvSystemSleep( x )
static portTASK_FUNCTION( prvIdleTask, pvParameters )
...
for( ;; )
...
#if ( configUSE_TICKLESS_IDLE != 0 )
if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP )
traceLOW_POWER_IDLE_BEGIN(); /*进入 tickless idle 前需要做的处理,没做任何处理*/
portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime );/*该函数即 prvSystemSleep( x ) */
traceLOW_POWER_IDLE_END(); /*退出 tickless idle 后需要做的处理,没做任何处理*/
else
mtCOVERAGE_TEST_MARKER();
#endif /* configUSE_TICKLESS_IDLE */
1.3 DA1469x低功耗管理分析
这部分是DA1469x低功耗的具体实现
1.3.1 prvSystemSleep函数分析
prvSystemSleep 函数即 portSUPPRESS_TICKS_AND_SLEEP ,FreeRTOS系统进入空闲函数后,会执行prvSystemSleep函数,使系统进入低功耗模式,其执行步骤如下:
prvSystemSleep -> pm_sleep_enter -> apply_wfi -> goto_deepsleep();
进入休眠和退出休眠步骤
prvSystemSleep 还是属于FreeRTOS系统内,而到了pm_sleep_enter 函数才是真正处理DA1469x进入低功耗。
要点了解:
- 具体低功耗模式由
current_sleep_mode
参数决定,由sleep_mode_t pm_sleep_mode_set(sleep_mode_t mode)
函数更改 - dg_configUSE_WDOG如果定义为1,则需要计算看门狗的时间,在看门狗复位前如要唤醒;看门狗复位计时快到时则不会进入低功耗。因此看门狗的复位时间需要注意。
- dg_configMIN_SLEEP_TIME 定义了最短休眠时间,默认为3ms
- 需要使能Tickless 模式
- 唤醒模式设置void pm_set_wakeup_mode(bool wait_for_xtalm),参数为true或false,When false, the system will start executing code immediately after wake-up.When true, upon wake-up the system will wait for the system clock to be switched to the appropriate clock source before continuing with code execution.
在pm_sleep_enter 函数中做的工作:
- 判断是否符合进入休眠的条件,不符合则退出;
- 计算可休眠的时间,如果时间太短不会进入休眠;
- 根据相应的休眠模式做准备,如关闭时钟、外设等;
2 看门狗系统
2.1 看门狗使用注意事项
- sys_watchdog_init 函数为初始化看门狗平台,使用看门狗都要调用该函数,且需要尽早调用;
- 每个任务都有相应的看门狗,各自独立,
- 当任务需要长时间阻塞时,需要暫停该任务的看门狗,并在阻塞停止后恢复看门狗
- The hardware watchdog is essentially a countdown timer, which is powered by the always on domain (PD_AON) and it will be automatically enabled as soon as the system powers up. It is decremented by 1 every ~10 ms (assuming default source clock the RC32K) and it is set to max value at reset.
- dg_configWDOG_RESET_VALUE ,Its default value is the maximum 0xFF, which corresponds to approximately 2.6 seconds (assuming default source clock the RC32K).
- The maximum number of tasks that can be monitored is defined by the configuration macro dg_configWDOG_MAX_TASKS_CNT. Its default value is 6 (the absolute maximum is 32).
4~6点总结:看门狗计数定时器是永久上电(相对休眠或工作模式而言),默认时钟源是RC32K,约10ms计数值减1,当复位值为默认值0xFF时,看门狗复位周期是2.6S(255*10=2550ms);默认可以注册6个任务看门狗,最大可设置为32个(即最大任务数) - This results to a maximum watchdog time-out of 84 seconds. If the RCX is used as a source clock, the time-out time is even longer, depending on the RCX frequency.看门狗复位之间可达84秒甚至更长,取决于时钟源RCX
- 看门狗时钟源选择低速时钟
#define dg_configUSE_LP_CLK ( LP_CLK_32768 )
2.2 看门狗相关函数分析
- int8_t sys_watchdog_register(bool notify_trigger)
Register current task in sys_watchdog module,Returned identifier shall be used in all other calls to sys_watchdog from current task.
int8_t wdog_id;
wdog_id = sys_watchdog_register(false);
参数notify_trigger为 true 或 false,当 dg_configWDOG_NOTIFY_TRIGGER_TMO 被定义时才起作用,dg_configWDOG_NOTIFY_TRIGGER_TMO的功能是,使用定时器周期的通知看门狗
- void sys_watchdog_set_latency(int8_t id, uint8_t latency)
给看门狗复位延长一段时间,比如计数值为10,使用该函数增加延时5,那么计数完5之后,再从10开始倒计时,通常用于一段需要长时间计算的代码中,使用该函数后只延时一次,后面看门狗计时不会增加这部分值
以上是关于DA1469x使用记录的主要内容,如果未能解决你的问题,请参考以下文章
查询某个时间段(日期和时间分别用两个DateTimePicker表示,是分开的)之间的记录的sql语句