通用API开发指南
引言
移远通信FC41D模块、FCM100D模块、FCM740D模块和FLMx40D模块支持QuecOpen®方案;QuecOpen®是基于RTOS开发环境的嵌入式开发平台,可简化IoT应用的软件设计和开发过程。有关QuecOpen®的详细信息,请参考 快速入门指南。
本文适用于SDK构建环境的QuecOpen®方案。本文档主要介绍在QuecOpen®方案下,移远通信FC41D模块、FCM100D模块、FCM740D模块和FLMx40D模块的Flash、SPI Flash、定时器、看门狗和低功耗模式功能相关的API及其开发流程,以及OTA功能相关的API和OTA升级流程。
适用模块
适用模块:
| 模块系列 | 模块 |
|---|---|
| FC41D | |
| FCM100D | |
| FCM740D | |
| FLMx40D | FLM040D |
| FLM140D | |
| FLM240D | |
| FLM340D |
Flash
头文件
Flash API的头文件为ql_flash.h,位于SDK包的ql_components/qadpt/include/目录下。若无特别说明,本文档所涉及头文件均在该目录下。
Flash API
ql_flash_set_security
该函数用于设置Flash的保护类型。向Flash写入数据或擦除Flash中的数据之前需取消Flash保护。
函数原型:
ql_errcode_flash_e ql_flash_set_security(ql_flash_protect_type_e type)
参数:
type:
[In] 保护类型;详见ql_flash_protect_type_e。
返回值:
函数执行结果码;详见ql_errcode_flash_e。
ql_flash_protect_type_e
Flash保护类型枚举定义如下:
typedef enum
{
QL_FLASH_PROTECT_NONE = 0,
QL_FLASH_PROTECT_ALL,
QL_FLASH_PROTECT_HALF,
QL_FLASH_UNPROTECT_LAST_BLOCK,
} ql_flash_protect_type_e
成员:
| 成员 | 描述 |
|---|---|
QL_FLASH_PROTECT_NONE |
无保护 |
QL_FLASH_PROTECT_ALL |
保护整个Flash |
QL_FLASH_PROTECT_HALF |
保护Flash的一半分区 |
QL_FLASH_UNPROTECT_LAST_BLOCK |
不保护Flash的最后一个分区 |
ql_errcode_flash_e
函数执行结果码枚举定义如下:
typedef enum
{
QL_FLASH_SUCCESS = 0,
QL_FLASH_EXECUTE_ERR,
QL_FLASH_PARAM_ERROR,
} ql_errcode_flash_e
成员:
| 成员 | 描述 |
|---|---|
QL_FLASH_SUCCESS |
函数执行成功 |
QL_FLASH_EXECUTE_ERR |
函数执行失败 |
QL_FLASH_PARAM_ERROR |
参数无效 |
ql_flash_write
该函数用于将数据写入Flash。
函数原型:
ql_errcode_flash_e ql_flash_write(unsigned char *data, unsigned int addr, unsigned int len)
参数:
data:[In] 待写入的数据。
addr:[In] Flash中待写入数据的地址。
len:[In] 写入数据的长度;单位:字节。
返回值:
函数执行结果码;详见ql_errcode_flash_e。
ql_flash_read
该函数用于从Flash中读取数据。
函数原型:
ql_errcode_flash_e ql_flash_read(unsigned char *data, unsigned int addr, unsigned int len)
参数:
data:[Out] 读取的数据。
addr:[In] 数据读取后的存放地址。
len:[In] 读取的数据长度;单位:字节。
返回值:
函数执行结果码;详见ql_errcode_flash_e。
ql_flash_erase
该函数用于擦除Flash中的数据。每次最少擦除一个扇区(4
KB大小)的数据,每次擦除的数据大小均为扇区大小的整数倍。
函数原型:
ql_errcode_flash_e ql_flash_erase(unsigned int addr, unsigned int len)
参数:
addr:[In] 待擦除数据的地址。
len:[In] 擦除的数据的长度;单位:字节。
返回值:
函数执行结果码;详见ql_errcode_flash_e。
ql_flash_parttion_erase
该函数用于擦除Flash中指定分区的数据。
函数原型:
ql_errcode_flash_e ql_flash_parttion_erase(ql_partition_t inPartition, uint32_t off_set, uint32_t size)
参数:
inPartition:[In] 待擦除数据的分区;详见ql_partition_t。
off_set:[In] 需擦除的数据在分区的起始偏移地址。
size:[In] 擦除的数据长度;单位:字节。
返回值:
函数执行结果码;详见ql_errcode_flash_e。
ql_partition_t
Flash分区枚举定义如下:
typedef enum
{
QL_PARTITION_BOOTLOADER = 0,
QL_PARTITION_APPLICATION,
QL_PARTITION_OTA,
QL_PARTITION_RF_FIRMWARE,
QL_PARTITION_NET_PARAM,
QL_PARTITION_USR_CONFIG,
QL_PARTITION_BLE_BONDING_FLASH,
QL_PARTITION_USR_RESERVE,
QL_PARTITION_MAX,
} ql_partition_t
成员:
| 成员 | 描述 |
|---|---|
QL_PARTITION_BOOTLOADER |
Bootloader分区 |
QL_PARTITION_APPLICATION |
App分区 |
QL_PARTITION_OTA |
OTA分区 |
QL_PARTITION_RF_FIRMWARE |
射频分区 |
QL_PARTITION_NET_PARAM |
网络分区 |
QL_PARTITION_BLE_BONDING_FLASH |
BLE分区 |
QL_PARTITION_USR_RESERVE |
用户配置保留分区 |
QL_PARTITION_MAX |
Flash内的分区数目 |
ql_flash_parttion_write
该函数用于向Flash指定分区中写入数据。
函数原型:
ql_errcode_flash_e ql_flash_parttion_write( ql_partition_t inPartition, volatile uint32_t off_set, uint8_t *inBuffer , uint32_t inBufferLength)
参数:
inPartition:[In] 待写入数据的分区;详见ql_partition_t。
off_set:[In] 需写入的数据在分区的起始偏移地址。
inBuffer:[In] 需写入的数据。
inBufferLength:[In] 需写入的数据的长度;单位:字节。
返回值:
函数执行结果码;详见ql_errcode_flash_e。
ql_flash_parttion_read
该函数用于读取Flash中指定分区中的数据。
函数原型:
ql_errcode_flash_e ql_flash_parttion_read( ql_partition_t inPartition, volatile uint32_t off_set, uint8_t *outBuffer, uint32_t inBufferLength)
参数:
inPartition:[In] 待读取数据的分区;详见ql_partition_t。
off_set:[In] 需读取的数据在分区的起始偏移地址。
outBuffer:[In] 存放读取到的数据。
inBufferLength:
[in] 需读取的数据的长度;单位:字节。
返回值:
函数执行结果码;详见ql_errcode_flash_e。
开发流程
本章节主要介绍在应用程序中如何使用上述Flash API并进行基础功能调试。
操作流程
模块SDK代码中提供了操作Flash的示例,示例程序在ql_application/quectel_demo目录下ql_flash_demo.c文件中。相关函数解析如下:
若需运行该示例程序,打开宏定义CFG_ENABLE_QUECTEL_DEM和CFG_ENABLE_QUECTEL_FLASH, ql_flash_demo_thread_creat()和ql_flash_demo_thread()会自动被调用以创建测试任务。
ql_flash_demo_thread_creat():该函数用于创建Flash任务,运行此Flash示例程序时需要调用该函数;ql_flash_demo_thread():该函数是任务执行函数,实现向Flash中写入数据、从Flash中读取数据和擦除Flash中的数据。


功能调试
用户需使用模块的TE-B板进行GPIO功能调试。调试时先参考操作流程运行Flash示例程序,之后重新编译固件版本并将新固件版本烧录至模块中,最后重启模块。使用串口工具打开串口2获取Log信息,如下图所示。

通过对比数据可以看出,向Flash中写入数据、从Flash中读取数据和擦除Flash中的数据均执行成功。
SPI Flash
头文件
SPI Flash API的头文件为ql_spi_flash.h,位于SDK包的ql_components/qadpt/include/目录下。若无特别说明,本文档所涉及头文件均在该目录下。
SPI Flash API
ql_spi_flash_read
该函数用于通过SPI读取Flash数据。无需初始化SPI,可直接使用该函数读取Flash中的数据。
函数原型:
ql_errcode_spi_nor_e ql_spi_flash_read( unsigned char* data, unsigned int addr, unsigned int len)
参数:
data:[Out] 读取的数据。
addr:[In] 读取的数据的地址。
len:[In] 读取的数据的长度;单位:字节。
返回值:
函数执行结果码;详见ql_errcode_spi_nor_e。
ql_errcode_spi_nor_e
函数执行结果码枚举定义如下:
typedef enum
{
QL_SPI_FLASH_SUCCESS = 0,
QL_SPI_FLASH_EXECUTE_ERR,
QL_SPI_FLASH_PARAM_ERROR,
} ql_errcode_spi_nor_e
成员:
| 成员 | 描述 |
|---|---|
QL_SPI_FLASH_SUCCESS |
函数执行成功 |
QL_SPI_FLASH_EXECUTE_ERR |
函数执行失败 |
QL_SPI_FLASH_PARAM_ERROR |
无效参数 |
ql_spi_flash_write
该函数用于通过SPI将数据写入Flash。无需初始化SPI,可直接使用该函数将数据写入Flash。
函数原型:
ql_errcode_spi_nor_e ql_spi_flash_write(unsigned char *data, unsigned int addr, unsigned int len)
参数:
data:[In] 写入的数据。
addr:[In] 写入的数据的地址。
len:[In] 写入的数据的长度;单位:字节。
返回值:
函数执行结果码;详见ql_errcode_spi_nor_e。
ql_spi_flash_erase_chip
该函数用于擦除整片Flash中的数据。
函数原型:
ql_errcode_spi_nor_e ql_spi_flash_erase_chip(void)
参数:
无
返回值:
函数执行结果码;详见ql_errcode_spi_nor_e。
ql_spi_flash_erase_sector
该函数用于擦除Flash指定扇区(4 KB大小)中的数据。
函数原型:
ql_errcode_spi_nor_e ql_spi_flash_erase_sector(unsigned int addr)
参数:
addr:
[In] 待擦除数据的Flash指定扇区地址。
返回值:
函数执行结果码;详见ql_errcode_spi_nor_e。
ql_spi_flash_erase_64k_block
该函数用于擦除Flash指定块(64 KB大小)的数据。
函数原型:
ql_errcode_spi_nor_e ql_spi_flash_erase_64k_block(unsigned int addr)
参数:
addr:
[In] 待擦除数据的Flash指定块(64 KB大小)地址。
返回值:
函数执行结果码;详见ql_errcode_spi_nor_e。
开发流程
本章节主要介绍在应用程序中如何使用上述SPI Flash API并进行基础功能调试。
操作流程
模块SDK代码中提供了操作SPI Flash的示例,示例程序在ql_application/quectel_demo目录下ql_spi_flash_demo.c文件中。相关函数解析如下:
若需要运行该示例程序,打开宏定义CFG_ENABLE_QUECTEL_DEMO和CFG_ENABLE_QUECTEL_SPI_FLASH和CFG_SUPPORT_SPI_FLASH_TEST,ql_spi_flash_demo_thread_creat()和ql_spi_flash_demo_thread()会自动被调用以创建测试任务。
ql_spi_flash_demo_thread_creat():该函数用于创建SPI Flash任务,运行此SPI Flash示例程序需要调用该函数。ql_spi_flash_demo_thread():该函数是任务执行函数,实现了SPI Flash数据写入、数据读取和数据擦除,示例程序中使用的Flash型号为FM25W32。


功能调试
用户需使用模块的TE-B板进行SPI Flash功能调试,调试时先参考操作流程运行SPI Flash示例程序,之后重新编译固件版本并将新固件版本烧录至模块中,最后重启模块。使用串口工具打开串口2获取Log信息,如下图所示:

通过对比数据可以看出,通过SPI向Flash中写入数据、从Flash中读取数据和擦除Flash中的数据均执行成功。
OTA升级
环境搭建
硬件准备
硬件条件:移远通信模块(以FC41D模块为例)。
固件烧录
联系移远通信技术支持获取BKFIL开发工具及工具相关使用信息。
打开BKFIL工具,点击工具主界面的"选择串口"按钮,选择主串口进行固件烧录
点击"Bin文件路径"后的
图标,选择ql_out/all_2M.1220.bin文件。
点击 "烧录"选项后,再按下模块上的复位键,进行固件烧录。
烧录完成后,"实时状态"区域显示"done"表示烧录成功。重启模块,选择模块通讯端口,使用串口工具连接模块串口。
模块开机log如下图所示:

OTA升级流程
OTA升级包制作步骤
OTA升级包制作步骤如下:
将编译后在
ql_out目录下生成的FC41D.bin文件拷贝到ql_tools/rtt_ota目录下。联系移远通信技术支持获取rt_ota_packaging_tool_cli工具,将其拷贝至
ql_tools/rtt_ota目
录下(有关该工具的使用方法,可联系移远通信技术支持)。使用rt_ota_packaging_tool_cli工具执行以下命令将
FC41D.bin文件打包成OTA升级包,生
成的升级包名称默认为FC41D.rbl:./rt_ota_packaging_tool_cli -f FC41D.bin -v 1.1.1 -p app -c gzip -s aes -i 0123456789ABCDEF -k 0123456789ABCDEF0123456789ABCDEF
OTA升级步骤
OTA升级步骤如下:
请联系移远通信技术支持获取HTTP File
Server(HFS)工具,作为固件升级的工具(固件存 放在局域网设备中)。双击
HFS.exe文件,打开HTTP File
Server(HFS)工具,打开工具后,会自动获取本机局
域网地址,并默认设置HTTP服务端口为80,如下图所示。在HFS工具左侧空白处右键点击"Add
files...",选择升级固件包FC41D.rbl,此时从HTTP
服务器下载升级固件包的URL地址为http://192.168.94.41/FC41D.rbl。

执行如下命令关联AP(需确保AP和升级服务器在同一个局域网下):
sta ssid 12345678
在终端执行如下命令进行OTA升级:
# http_ota http://192.168.94.41/FC41D.rbl(服务器地址)
升级成功后将显示如下界面:

OTA API
http_ota_download
函数原型:
Int http_ota_download(const char *uri,int port)
参数:
uri:[In] 远程HTTP服务器地址。
port:[In] 远程HTTP服务器的端口号。
返回值:
0函数执行成功-1函数执行失败
定时器
模块具有6路定时器,其中定时器0、1、2的时钟源为26MHz,定时器3、4、5的时钟源为32KHz。定时器2为系统时间的补偿定时器,定时器3为系统时基定时器。模块不支持定时器2、3,仅支持定时器0、1、4、5。
头文件
定时器API的头文件为ql_timer.h,位于SDK包的ql_components/qadpt/include/目录下。若无特别说明,本文档所涉及头文件均在该目录下。
定时器API
ql_TimerInit
该函数用于初始化定时器,计时时间单位为毫秒。
函数原型:
ql_timer_errcode_e ql_TimerInit(ql_timer_number_e timer_id, UINT32 time_ms, ql_timer_callback timer_cb)
参数:
timer_id:[In] 定时器编号;详见ql_timer_number_e。
time_ms:[In] 定时时间;单位:毫秒。
timer_cb:[In] 定时器中断的回调函数;详见ql_timer_callback。
返回值:
函数执行结果码;详见ql_timer_errcode_e。
ql_timer_number_e
定时器编号信息枚举定义如下:
typedef enum
{
QL_TIMER_0 =0,
QL_TIMER_1,
QL_TIMER_2,
QL_TIMER_3,
QL_TIMER_4,
QL_TIMER_5,
}ql_timer_number_e
成员:
| 成员 | 描述 |
|---|---|
QL_TIMER_0 |
定时器0 |
QL_TIMER_1 |
定时器1 |
QL_TIMER_2 |
定时器2 |
QL_TIMER_3 |
定时器3 |
QL_TIMER_4 |
定时器4 |
QL_TIMER_5 |
定时器5 |
ql_timer_errcode_e
函数执行结果码枚举定义如下:
typedef enum
{
QL_TIMER_SUCCESS = 0,
QL_TIMER_EXECUTE_ERR,
QL_TIMER_INVALID_PARAM_ERR,
QL_TIMER_NOT_OPEN_ERR,
} ql_timer_errcode_e
成员:
| 成员 | 描述 |
|---|---|
QL_TIMER_SUCCESS |
函数执行成功 |
QL_TIMER_EXECUTE_ERR |
函数执行失败 |
QL_TIMER_INVALID_PARAM_ERRR |
无效参数 |
QL_TIMER_NOT_OPEN_ERR |
定时器未启动 |
ql_TimerInit_us
该函数用于初始化定时器,仅定时器0、1、2支持该函数。
函数原型:
ql_timer_errcode_e ql_TimerInit_us(ql_timer_number_e timer_id, UINT32 time_us, ql_timer_callback timer_cb)
参数:
timer_id:[In] 定时器编号;详见ql_timer_number_e。
time_us:[In] 定时时间;单位:微秒。
timer_cb:[In] 用于定时器中断的回调函数;详见ql_timer_callback。
返回值:
函数执行结果码;详见ql_timer_errcode_e。
ql_get_timer_cnt
该函数用于获取定时器计数值。
函数原型:
ql_timer_errcode_e ql_get_timer_cnt(ql_timer_number_e timer_id, UINT32 *cont)
参数:
timer_id:[In] 定时器编号;详见ql_timer_number_e。
cont:[In] 指向计数值的指针。
返回值:
函数执行结果码;详见ql_timer_errcode_e。
ql_TimerStart
该函数用于开始定时器。
函数原型:
ql_timer_errcode_e ql_TimerStart(ql_timer_number_e timer_id)
参数:
timer_id:
[In] 定时器编号;详见ql_timer_number_e。
返回值:
函数执行结果码;详见ql_timer_errcode_e。
ql_TimerStop
该函数用于停止定时器。
函数原型:
ql_timer_errcode_e ql_TimerStop(ql_timer_number_e timer_id)
参数:
timer_id:
[In] 定时器编号;详见ql_timer_number_e。
返回值:
函数执行结果码;详见ql_timer_errcode_e。
ql_timer_callback
该函数为用于定时器中断的回调函数。
函数原型:
typedef void (*ql_timer_callback)(UINT8 arg)
参数:
arg:
[In] 输入的参数。
返回值:
无
开发流程
本章节主要介绍在应用程序中如何使用上述定时器API并进行基础功能调试。示例中默认使用定时器5进行测试。
操作流程
模块SDK代码中提供了操作定时器的示例,示例程序在ql_application/quectel_demo目录下ql_timer_demo.c文件中。相关函数解析如下:
若需要运行该示例程序,打开宏定义CFG_ENABLE_QUECTEL_DEMO和CFG_ENABLE_QUECTEL_TIMER,ql_timer_demo_thread_creat()和ql_timer_demo_thread()会自动被调用以创建测试任务。
ql_timer_demo_thread_creat():该函数用于创建定时器任务,运行此定时器示例程序需要调用该函数。ql_timer_demo_thread():该函数是任务执行函数,实现定时器的初始化、执行中断函数和停止计时功能。

功能调试
用户需使用模块的测试板进行GPIO功能调试,调试时先参考操作流程运行定时器示例程序,之后重新编译固件版本并将新固件版本烧录至模块中,最后重启模块。使用串口工具打开串口2获取log信息,如下图所示:

打印20次的系统时间,定时时间间隔为1秒。
看门狗
头文件
看门狗API的头文件为ql_watchdog.h,位于SDK包的ql_components/qadpt/include/目录下。若无特别说明,本文档所涉及头文件均在该目录下。
看门狗API
ql_WdgInit
该函数用于初始化看门狗。
函数原型:
ql_wdg_errcode_e ql_WdgInit(UINT32 timeout)
参数:
timeout:
[In] 看门狗溢出时间;单位:毫秒;最大值:0xFFF(约为65秒)。
返回值:
函数执行结果码;详见ql_wdg_errcode_e。
ql_wdg_errcode_e
函数执行结果码枚举定义如下:
typedef enum
{
QL_WDG_SUCCESS = 0,
QL_WDG_EXECUTE_ERR,
QL_WDG_INVALID_PARAM_ERR,
} ql_wdg_errcode_e
成员:
| 成员 | 描述 |
|---|---|
QL_WDG_SUCCESS |
函数执行成功 |
QL_WDG_EXECUTE_ERR |
函数执行失败 |
QL_WDG_INVALID_PARAM_ERR |
无效参数 |
ql_wdg_reload
该函数用于喂看门狗。
函数原型:
void ql_wdg_reload(void)
参数:
无
返回值:
无
ql_wdg_finalize
该函数用于关闭看门狗。
函数原型:
void ql_wdg_finalize(void)
参数:
无
返回值:
无
使用示例
模块SDK代码中提供了操作看门狗API的示例,示例程序在ql_application/quectel_demo目录下ql_watchdog_demo.c文件中。相关函数解析如下:
ql_wdg_demo_thread_creat():该函数用于创建看门狗任务,运行此看门狗示例程序需要调用该函数。ql_wdg_demo_thread():该函数是任务执行函数,实现初始化看门狗和喂看门狗功能。

低功耗模式
头文件
低功耗模式API头文件为ql_lowpower_demo.h,位于SDK包的ql_components/qadpt/include/目录下。若无特别说明,本文档所涉及头文件均在该目录下。
低功耗模式API
ql_deep_sleep_enter
该函数用于使MCU进入深度睡眠模式。
函数原型:
ql_lowpower_errcode_e ql_deep_sleep_enter(ql_sleep_ctrl_parm_s deep_sleep_param)
参数:
deep_sleep_param:
[In] 深度睡眠模式相关配置;详见ql_sleep_ctrl_parm_s。
返回值:
函数执行结果码;详见ql_lowpower_errcode_e。
ql_lowpower_errcode_e
函数执行结果码枚举定义如下:
typedef enum
{
QL_LOWPOWER_SUCCESS = 0,
QL_LOWPOWER_EXECUTE_ERR,
QL_LOWPOWER_INVALID_PARAM_ERR,
} ql_lowpower_errcode_e
成员:
| 成员 | 描述 |
|---|---|
QL_LOWPOWER_SUCCESS |
函数执行成功 |
QL_LOWPOWER_EXECUTE_ERR |
函数执行失败 |
QL_LOWPOWER_INVALID_PARAM_ERR |
函数参数错误 |
ql_sleep_ctrl_parm_s
深度睡眠模式和低电压待机模式的相关配置结构体定义如下:
typedef struct ql_ps_sleep_ctrl {
ql_deep_wakeup_way wake_up_way;
UINT32 gpio_index_map;
UINT32 gpio_edge_map;
UINT32 gpio_stay_lo_map;
UINT32 gpio_last_index_map;
UINT32 gpio_last_edge_map;
UINT32 gpio_stay_hi_map;
UINT32 sleep_time;
UINT32 lpo_32k_src;
} ql_sleep_ctrl_parm_s
参数:
| 类型 | 参数 | 描述 |
|---|---|---|
ql_deep_wakeup_way |
wake_up_way |
唤醒方式;详见ql_deep_wakeup_way。 |
| UINT32 | gpio_index_map |
唤醒引脚。GPIO 0~GPIO31,GPIO寄存器的bit位与引脚按顺序一一对应。 |
| UINT32 | gpio_edge_map |
唤醒边沿。GPIO 0~GPIO31,GPIO寄存器的bit位与引脚按顺序一一对应。0 上升沿1 下降沿 |
| UINT32 | gpio_stay_lo_map |
MCU处于深度睡眠模式时引脚是否需要保持原状态。GPIO 0~GPIO31,GPIO寄存器的bit位与引脚按顺序一一对应。0 不保持1 保持 |
| UINT32 | gpio_last_index_map |
唤醒引脚(无需配置)。 |
| UINT32 | gpio_last_edge_map |
唤醒边沿(无需配置)。 |
| UINT32 | gpio_stay_hi_map |
MCU处于深度睡眠模式时引脚是否需要保持原状态(无需配置)。 |
| UINT32 | sleep_time |
睡眠时间。唤醒方式为RTC定时唤醒MCU时该参数有效。单位:秒。 |
| UINT32 | lpo_32k_src |
RTC时钟源(无需配置)。 |
ql_deep_wakeup_way
唤醒深度睡眠模式和低电压待机模式的方式枚举如下:
typedef enum {
QL_DEEP_WAKEUP_GPIO = 1,
QL_DEEP_WAKEUP_RTC = 2,
} ql_deep_wakeup_way
成员:
| 成员 | 描述 |
|---|---|
QL_DEEP_WAKEUP_GPIO |
GPIO中断唤醒 |
QL_DEEP_WAKEUP_RTC |
RTC定时唤醒 |
ql_lowvol_sleep_enter
该函数用于使MCU进入低电压待机模式。
函数原型:
ql_lowpower_errcode_e ql_lowvol_sleep_enter(ql_sleep_ctrl_parm_s lowvol_sleep_param)
参数:
lowvol_sleep_param:
[In] 低电压待机模式的相关配置;详见ql_sleep_ctrl_parm_s。
返回值:
函数执行结果码;详见ql_lowpower_errcode_e。
ql_deep_mcudtim_enter
该函数用于使MCU进入或退出正常待机模式。
函数原型:
ql_lowpower_errcode_e ql_deep_mcudtim_enter(UINT32 enable, UINT32 dtimnum)
参数:
enable:[In] 进入或退出正常待机模式。
0退出1进入
dtimnum:[In] 在正常待机模式下,MCU是否进入Wi-Fi保活模式。
0不进入
其他值 Wi-Fi保活模式下唤醒MCU的时间间隔;单位:100毫秒(建议将参数值设置为30,即3000毫秒)。
返回值:
函数执行结果码;详见ql_lowpower_errcode_e。
ql_deep_rfdtim_enter
该函数用于打开或关闭RF睡眠模式。
函数原型:
ql_lowpower_errcode_e ql_deep_rfdtim_enter(UINT32 enable,UINT32 arpenable)
参数:
enable:[In] 打开或关闭RF睡眠模式。
0关闭1打开
arpenable:[In] 正常待机模式下,MCU进入Wi-Fi保活模式时,是否开启唤醒MCU的ARP广播。
0关闭1打开。打开ARP广播会增大功耗,减少丢包率。
返回值:
函数执行结果码;详见ql_lowpower_errcode_e。
开发流程
本章节主要介绍在应用程序中如何使用上述低功耗模式API并进行基础功能调试。示例中默认使用Wi-Fi保活模式进行测试。
操作流程
模块SDK代码中提供了操作低功耗模式API的示例,示例程序在ql_application/quectel_demo目录下ql_lowpower_demo.c文件中。相关函数解析如下:
若需要运行该示例程序,打开宏定义CFG_ENABLE_QUECTEL_DEMO和CFG_ENABLE_QUECTEL_LOWPOWER,ql_lowpower_demo_thread_creat()和ql_lowpower_demo_thread()会被自动调用来创建测试任务。
ql_lowpower_demo_thread_creat():该函数用于创建低功耗任务,运行此低功耗示例程序时需要调用该函数;ql_lowpower_demo_thread():该函数是任务执行函数,用于MCU进入Wi-Fi保活模式。
{width="5.6in" height="3.3in"}
功能调试
用户需使用模块的测试板进行调试,调试时参考操作流程运行低功耗示例程序,之后重新编译固件版本并将新固件版本烧录至模块中,最后重启模块。使用串口工具打开串口2获取复位Log信息。然后发送STA命令(STA SSID Key)连接Wi-Fi,否则MCU将无法进入Wi-Fi保活模式。

Wi-Fi连接成功后,需等待一会MCU方可进入Wi-Fi保活模式。

MCU进入Wi-Fi保活模式后,Wi-Fi保持连接。RTC定时器唤醒MCU后串口工具会打印"wake up"。
附录
参考文档:
| 文档名称 |
|---|
| Quectel_FC41D&FCM100D&FCM740D&FLMx40D_QuecOpen(SDK)_快速开发指导 |
术语缩写:
| 缩写 | 英文全称 | 中文全称 |
|---|---|---|
| AP | Access Point | 接入点 |
| API | Application Programming Interface | 应用程序接口 |
| ARP | Address Resolution Protocol | 地址解析协议 |
| GPIO | General-Purpose Input/Output | 通用型输入/输出 |
| HTTP | Hyper Text Transfer Protocol | 超文本传输协议 |
| IoT | Internet of Things | 物联网 |
| MCU | Microprogrammed Control Unit | 微程序控制器 |
| OTA | Over-the-Air Technology | 空中下载技术 |
| RF | Radio Frequency | 射频 |
| RTC | Real-Time Clock | 实时时钟 |
| RTOS | Real-Time Operating System | 实时操作系统 |
| SSID | Service Set Identifier | 服务集标识符 |
| STA | Station | 站点 |
| SDK | Software Development Kit | 软件开发工具包 |
| SPI | Serial Peripheral Interface | 串行外设接口 |