DA1469x使用记录

Posted while(1)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DA1469x使用记录相关的知识,希望对你有一定的参考价值。

1 低功耗管理

参考资料:

  1. da1469x_software_platform_reference
  2. 《STM32F103 FreeRTOS开发手册V1.1》主要看FreeRTOS的介绍

1.1 进入休眠与退出休眠的总概览

FreeRTOS 就是通过在处理器处理空闲任务的时候将处理器设置为低功耗模式来降低能耗。一般会在空闲任务的钩子函数中执行低功耗相关处理,比如设置处理器进入低功耗模式、关闭其他外设时钟、降低系统主频等等。
这里就需要使用FreeRTOS的Tickless 模式,即当处理器进入空闲任务周期以后就关闭系统节拍中断(滴答定时器中断),只有当其他中断发生或者其他任务需要处理的时候处理器才会被从低功耗模式中唤醒。

1.2 FreeRTOS低功耗管理分析

这部分低功耗管理主要由FreeRTOS系统处理

1.2.1 Tickless 具体实现

总体请参考《STM32F103 FreeRTOS开发手册V1.1》中Tickless 相关章节
重点关注如下几个:

  1. #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 中。

  2. 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函数中实现DA1469x低功耗。
其执行步骤如下:prvSystemSleep -> pm_sleep_enter -> apply_wfi -> goto_deepsleep();

关注 dg_configUSE_WDOG 宏定义有何影响?

以上是关于DA1469x使用记录的主要内容,如果未能解决你的问题,请参考以下文章

蓝牙BLE之DA1469x的应用

查询某个时间段(日期和时间分别用两个DateTimePicker表示,是分开的)之间的记录的sql语句

使用 SQLAlchemy 过滤今天在 SQLite 中提交的记录

centos7搭建dnsIPv4记录和IPv6记录

如何使用客户端事件 API 在 elFinder 中记录已删除的文件名?

使用 Laravel 将日期值插入日期字段