ASR5502X 系列 FreeRTOS 平台 外设 Demo 用户手册
前言
关于本文档
本文档主要介绍 ASR5502X 系列 Wi-Fi 芯片的各个外设接口,包括功能、参数配置、函数说明和应用示例,用户根据此指导文件可快速地搭建基于 FreeRTOS 平台调用相应的外设模块的应用程序。
读者对象
本文档主要适用于以下工程师:
单板硬件开发工程师
软件工程师
技术支持工程师
产品型号
本文档适用于 ASR IoT 5502X 系列 Wi-Fi 芯片。
版权公告
版权归 © 2020 翱捷科技股份有限公司所有。保留一切权利。未经翱捷科技股份有限公司的书面许可,不得以任何形式或手段复制、传播、转录、存储或翻译本文档的部分或所有内容。
商标声明
ASR、翱捷和其他翱捷商标均为翱捷科技股份有限公司的商标。
本文档提及的其他所有商标名称、商标和注册商标均属其各自所有人的财产,特此声明。
免责声明
翱捷科技股份有限公司对本文档内容不做任何形式的保证,并会对本文档内容或本文中介绍的产品进行不定期更新。
本文档仅作为使用指导,本文的所有内容不构成任何形式的担保。本文档中的信息如有变更,恕不另行通知。
本文档不负任何责任,包括使用本文档中的信息所产生的侵犯任何专有权行为的责任。
防静电警告
静电放电(ESD)可能会损坏本产品。使用本产品进行操作时,须小心进行静电防护,避免静电损坏产品。
翱捷科技股份有限公司
地址:上海市浦东新区科苑路 399 号张江创新园 10 号楼 9 楼 邮编:201203
文档修订历史
日期 |
版本号 |
发布说明 |
|---|---|---|
2020.11 |
V1.0.0 |
首次发布。 |
1. SDK 目录介绍
SDK 目录结构如下表所示:

2. 外设模块使用说明
2.1 GPIO 使用说明
2.1.1 功能描述
ASR5502X 共有 16 个 GPIO 口,它们分别可配置为不同的输入,输出模式和复用功能,通用 IO 口和各引脚的复用功能,如下表所示:

2.1.2 参数配置
GPIO 设备的结构体定义如下所示:

结构体成员说明如下:
port 为 GPIO 的端口号,uint8_t 类型,实际定义为宏(枚举),例如:

config,其定义为一个枚举类型,用来配置 IO 的上拉、下拉、中断和输出模式,如下图所示:

priv 为保留的函数指针,使用 GPIO 功能时,该指针赋值为空。
2.1.3 使用示例
定义 GPIO0,GPIO1 结构体变量:

GPIO0 配置为下降沿中断模式:

// GPIO0 中断服务程序:

GPIO1 配置为普通推挽输出模式:

完整代码请参考 SDK:demo/periphare/gpio 文件夹。
2.2 Watchdog 接口使用说明
2.2.1 功能描述
看门狗用来检测和解决由程序引起的故障,比如一个程序正常运行的时间是 50ms,在运行完这个程序之后紧接着进行喂狗,当系统设置独立看门狗的定时溢出时间为 60ms,大于被监控的程序整个运行的时间 50ms,如果超过 60ms 还没有喂狗,则说明被监控的程序出故障了,此时会产生系统复位,让程序重新运行,ASR5502X 芯片支持看门狗功能,并可对看门狗溢出时间进行配置。
2.2.2 参数配置
Watchdog 设备的结构体定义如下所示:


结构体成员说明如下:
port:设备号,固定为 0。
config:配置看门狗的超时时间,以毫秒为单位计时,如果设置看门狗超时时间为2秒,则计算公式为:wdg.config.timeout=2Timeout_value=21000毫秒。
priv:未使用,该指针赋值必须为空。
SDK 提供清除看门狗计数器的 API为lega_wdg_reload(&lega_wdg)。
备注
默认在看门狗中断服务函数中有进行清除动作,如果用户需使用看门狗来重启系统,则需把中断服务函数中的喂狗动作去掉,将喂狗动作放到其他主任务中去。
2.2.3 使用示例
看门狗初始化函数如下所示:

主程序调用看门狗初始化及清除看门狗超时计数标志:

2.3 Timer 接口使用说明
2.3.1 功能描述
ASR5502X 提供 2 个硬件定时器,每个硬件定时器都具有周期定时和单次定时功能,定时器计数到 0 时,会产生中断信号。如果定时器配置周期定时功能,定时中断信号产生后,会自动加载原始的值和周期性的计数;如果定时器配置为单次触发模式,中断信号产生后,定时器会停止计数,直到重新配置它。
2.3.2 参数配置
定时器设备的结构体定义如下所示:

结构体成员说明如下:
port:指定定时器编号,定时器 1/2 的宏定义如下所示:

config:定时器配置参数结构体,定义如下:

config 中的结构体成员说明如下:
peroid:定时的时间周期,以微秒为单位。
reload_mode:触发模式,如下定义:

cb:定时器中断服务函数的回调函数。
*arg:暂未使用,保持为空。
priv:未使用,该指针赋值必须为空。
2.3.3 使用示例
定时器 1 定时 1s,自动加载定时初值;定时器 2 定时 20s,只加载一次初值,如下所示:

完整代码请参考 SDK:demo/periphare/timer 文件夹。
2.4 UART 接口使用说明
2.4.1 功能描述
ASR5502X 共有三组独立硬件 UART 接口,默认 UART 的引脚分别是:
UART0
UART0_TXD—–DIG_PAD0
UART0_RXD—–DIG_PAD1
UART1
UART1_TXD—–DIG_PAD2
UART1_RXD—–DIG_PAD3
UART2
引脚需要通过软件重新配置映射
备注
在烧录模式下,只能通过 Uart1 来烧录,这个是由芯片决定的,不能更改。
射频校准、AT 指令、调试 log 都默认使用 UART1, 软件可配置。
UART0 一般用于与外设或 MCU 的通讯。
2.4.2 参数配置
UART 设备的结构体定义如下所示:

结构体成员说明如下:
port:设备的端口号,可配置为 UART0、UART1 和 UART2。
config:配置串口参数,例如波特率、位度、奇偶校验位和停止位等,其结构体如下:

priv:用来定义注册串口接受的回调函数,当串口有数据接收到时,会产生中断,在中断服务函数中会调用此回调函数进行数据处理。
2.4.3 使用示例
定义 UART1 串口设备,初始化接收,发送数据缓冲区:


//UART1 串口接收中断服务程序:

UART1 串口发送数据:

UART1 将串口中断服务程序中接收的数据放入接收数组中:


完整代码请参考 SDK:demo/periphare/uart 文件夹。
2.5 PWM 接口使用说明
2.5.1 功能描述
ASR5502X 系统的 PWM 由 16 位的定时器在软件上实现,可产生 8 路 PWM 信号,其中 4 路可配置为输入捕获功能,PWM 可输出特定的频率和占空比,默认配置 PWM 输出引脚如下:
PWM0—- DIG_PAD14
PWM1—- DIG_PAD10
PWM2—- DIG_PAD15
PWM3—- DIG_PAD11
PWM4—- DIG_PAD6
PWM5—- DIG_PAD0
PWM6—- DIG_PAD7
PWM7—- DIG_PAD1
由于 SDK 默认 DIG_PAD0 和 DIG_PAD1 为 UART0 的 TXD 和 RXD,所以在使用 PWM5 和 PWM7 功能时需要重新配置引脚的映射关系。
2.5.2 参数配置
PWM 设备的结构体定义如下所示:

结构体成员说明如下:
port:PWM 输入的端口,其宏定义如下所示:

config:PWM 配置参数结构体,包括 PWM 的频率和占空比,如下所示:

config中的结构体成员说明如下:
duty_cycle:占空比。
freq:频率。
priv:没有使用,固定为空。
2.5.3 使用示例
PWM 通道 7 产生 10K 占空比为 50% 的方波信号:

完整代码请参考 SDK:demo/periphare/pwm 文件夹。
2.6 Flash 接口使用说明
2.6.1 功能描述
ASR5502X 内部集成了一个 2 M 的 NOR flash,Lega SDK 将内置 flash 划分成如下图所示的 bootload、system information、image、OTA 和 User information 这 5 个分区。

备注
各 SDK 版本对分区略有不同,具体可以查看 lega_board.c 源文件。
SDK 提供了两种访问 Flash 操作的接口:
使用逻辑地址和偏移量作为参数对 Flash 进行操作。
Flash 的 sector 为 4 KB,擦除的最小单位为一个 sector,读写时需 4K 字节对齐,先擦除才能写。
写/擦除动作需关闭系统中断。
通过键值进行 Flash 的读写,用户需要定义存储数据 Flash 区的键值,然后对该键值相应 Flash 区域进行读/写/删数据的操作。用此方式读写 Flash 不用考虑地址对齐和关中断等。
2.6.2 参数配置
2.6.2.1 通用 Flash 操作的 API
以下是通用 Flash 操作的 API:
按分区擦除 Flash 中的数据,offset 为分区的偏移:

在对应分区偏移 offset 位置的 Flash 中写数据:

在对应分区偏移 offset 位置的 Flash 中擦除并写数据:

在对应分区偏移 offset 位置的 Flash 中读数据:

其中参数 in_partition 为分区名称或者逻辑地址,分区名称用宏定义:

通常用户的 flash 操作区域为 PARTITION_PARAMETER_2,同时 SDK 也提供了使用逻辑地址操作 flash 的 API,如下所示:


使用逻辑地址传递参数时,API 函数会自动判断将数据写到哪个分区中。Flash 操作函数的参数 off_set 为逻辑地址的偏移量,调用 lega_flash_write() 和 lega_flash_write_common() 函数后,函数逻辑地址的偏移量 off_set 将会被赋值为写入数据后的地址与写入数据之前的地址的偏移量。
API 函数的参数 in_buf 和 out_buf 为数据读写缓冲区指针,参数 in_buf_len 为读写数据的长度。
调用以上 API 之前,需要调用 int32_t lega_flash_init() 进行 Flash 操作初始化,且在调用此函数时,需要关闭中断,初始化完成后,再打开中断; 调用 lega_flash_erase_common() 和 lega_flash_write_common() 时也需要关闭中断,函数调用完成后,再打开中断。
2.6.2.2 KV_flash写操作的API
以下是 KV_flash 写操作的 API:

参数 key 为存储 Flash 区的键值,写数据将在这个键值命名的区里进行。
参数 value 为写入的数据,参数 len 为写入数据的长度。
参数 sync 必须设置为 1,用来立刻保存 KV 键值到 flash。
读取对应 KV flash 区的函数如下所示:

在使用 KV Flash 读取或者写入之前,需要调用 int32_t lega_flash_kv_init(void) 进行 KV Flash 操作的初始化。
2.6.3 使用示例
通用 Flash 分区读写操作如下所示:

通用 Flash 逻辑地址读写操作如下所示:

完整代码请参考 *SDK:demo/periphare/flash(kv_flash) 文件夹。
2.7 eFuse接口使用说明
2.7.1 功能描述
ASR5502X 内置4K bits(512 Bytes)的 eFuse 区,逻辑地址如下表所示:
eFuse Byte Address |
Size (Bytes) |
Contents |
|---|---|---|
0x000 – 0x0EF |
240 |
for system |
0x0F0 – 0x1EF |
256 |
for customer |
0x1F0 – 0x1FF |
16 |
for system |
total: 512 |
用户可使用 0x0F0~0x1EF 地址进行数据的存储,其它区域不能操作,eFuse 区域的值只能写一次,可多次读。
2.7.2 参数配置
在 eFuse 进行读写之前,需要调用 lega_efuse_init(EFUSE_LDO25_OPEN) 函数将内部 2.5V 的 LDO 打开。操作 eFuse 的 API 如下:
初始化 eFuse 操作,打开内部 LDO:

写一字节数据到对应的 eFuse 地址:

写一个字数据到对应的 eFuse 地址:

从对应的 eFuse 地址读一字节数据,返回值为读到的 eFuse 空间里的值:

从对应的 eFuse 地址读一个字数据,返回值为读到的 eFuse 空间里的值:

从对应起始的 eFuse 地址读多个字节的数据:

2.7.3 使用示例
eFuse测试:

2.8 I2C接口使用说明
2.8.1 功能描述
ASR5502X 提供主、从模式的硬件 I2C 接口,支持 7 位和 10 位的地址模式,提供 4 种不同的时钟速率,最低速率 100 Kbps,最高速率 3.4 Mbps。
当 ASR5502X 作为主设备,SDK 分别提供了其读写外部设备和读写外部存储器的 API,用户可根据不同的 I2C 设备,调用相应的 API 函数。
当 ASR5502X 作为从设备,在 I2C 初始化时有设置从设备发送和接收数据的中断回调函数,主设备对 ASR5502X 读写数据时,会进入相应的中断服务程序,然后进行数据的传输。
2.8.2 参数配置
I2C 设备的结构体定义如下所示:

结构体成员说明如下:
port:设置 I2C 设备的端口号,可设置为 I2C_DEVICE0 或 I2C_DEVICE1。
config:I2C 设备的配置信息结构体,可设置 I2C 通讯的速度、地址和模式等,如下所示:

config 中的结构体成员说明如下:
address_width:设置地址模式,可设置从机 7 位地址或 10 位地址模式。
freq:配置 I2C 的时钟速率。
mode:配置 I2C 为主模式或从模式。
dev_addr:作为 I2C 从模式时,设备的地址。
priv:回调函数,作为从设备时,数据发送和接收都会定义回调函数。
2.8.3 使用示例
初始化 I2C0 为主设备,配置 I2C0 设备的时钟和从设备的地址,并初始化发送和接收缓冲区数据:


I2C0 作为主设备,发送数据到从设备:

I2C0 作为主设备,接收从设备发送的数据:

I2C0 作为主设备,发送数据到从设备 EEPROM:

I2C0 作为主设备,读取从设备 EEPROM 中的数据:

完整代码请参考 SDK:demo/periphare/i2c_master 文件夹。
2.9 SPI接口使用说明
2.9.1 功能描述
ASR5502X 提供三个 SPI 的硬件接口控制器,在硬件设计上定义了 SPI0 和 SPI1 作为主设备,SPI2 作为从设备,满足 SPI 数据通讯的标准,有四根信号线,分别是 CLK、CS、MOSI 和 MISO。软件配置不能改变 SPI 的主从模式。
ASR5502X 的 SPI 数据传输有两种方式可以选择,一种是通用模式,另一种是 DMA 模式。通过宏定义 SPI_USE_DMA_MODE 来选择数据的传输模式,默认是通用数据传输模式。
2.9.2 参数配置
SPI 设备结构体的定义如下所示:

结构体成员说明如下:
port:设置 SPI 设备的端口号,设备端口号通过宏定义为 SPI0、SPI1 或 SPI2。
config:SPI 设备的配置信息,结构体定义如下所示:

config 中的结构体成员说明如下:
Mode:设置 SPI 的时钟相位和极性。
Freq:设置 SPI 的频率。
priv:当 SPI 作为主设备时,该函数为空;当 SPI 作为从设备时,赋值为 SPI 数据中断回调函数。
调用 lega_spi_init(lega_spi_dev_t *spi) 函数来初始化 SPI 端口,并注册 SPI 数据发送接收中断服务,当 SPI 数据发送缓冲区为空或者数据接收缓冲区不为空,进入中断服务程序。
关键函数功能说明:
SPI 主设备发送数据:

SPI 接收数据:

SPI 发送和接收数据,参数 size 为接收和发送数据缓冲区的大小:

2.9.3 使用示例
以下为 SPI0 作为主设备,以 1 Mbps 的速率,第一个时钟上升沿有效的模式发送 100 个数据到从设备的示例:

完整代码请参考 SDK:demo/periphare/SPI 文件夹。
2.10 RTC接口使用说明
2.10.1 功能描述
ASR5502X 提供一个硬件 RTC 时钟,当使能 RTC 时钟功能时,即使系统处在 sleep 模式,RTC 功能仍然正常运行,以提供准确的时间。系统提供设置 RTC 当前时间以及获取 RTC 时间的接口,另外在使用 RTC 接口前需要先初始化 RTC 设备。系统提供的 API 如下:
初始化 RTC 设备:

设置 RTC 时间:

获取 RTC 时间:

2.10.2 参数配置
RTC 设备的结构体定义如下所示:

结构体成员说明如下:
port:描述 RTC 的设备号,使用时固定为 0(系统只有一个 RTC 设备)。
config:设置或获取 RTC 时间的格式配置信息,支持 HAL_RTC_FORMAT_DEC。
priv:没有使用,固定为空。
2.10.3 使用示例
以下为设置 RTC 时间并实时打印时间的示例:
