
中科蓝讯 AB2027 开发兼踩坑备忘录
前言
最近開發用到咗 AB2027 粒芯片,藍訊官方 SDK 同 EXAMPLE 進行開發,都系遇到咗一啲手册同 EXAMPLE 都冇嘅屈,求其紀錄下((
话晒系国产芯片啫,好多嘢都唔够成熟,定系好多嘢都冇资料同教程 ST 意法靓啊靓
框架总述
- AB202X 系列采用基于冯诺依曼结构的 32 位 RISC-V 架构 CPU, 提供高达 120Mhz 主频;
- 内置 64KSRAM 和 8K 缓存;
- 内置 2M falsh
- 24 M 晶体振荡电路,不需要外部加载电容器;
- 蓝牙 5.2 BLE 规范,支持 LE 1M/2M;
- MIC 放大器 x1;高性能 MONO Sigma-Delta ADC;
中断回调重启问题
在 SDK 里用了 GPIO 外部中断的例程,发现一旦中断触发,进入回调,LOG 即刻出现 ERROR,随后自动复位;
通过翻阅蓝讯 datasheet 和芯片框架简述后发现,代码编写的时候需要注意 com 区 和bank 区 的问题;
com 区: 程序放在并常驻在 RAM(SRAM)中,具有较快响应速度,RAM 开销大;
bank 区: 程序放在 flash 中, 需要用的时候再动态加载到 ram 中, falsh 和芯片之间走 spi 响应速度较慢, RAM 开销小;
综上所述:
- 没有使用 AT 宏声明的函数, 默认放在 bank 区
- 中断回调以及其子函数必须放在 com 区, 放在 bank 区会死机; 中断相应需要非常即时, CPU 直接读取 com 区, 可以做到较快相应, 而 bank 要先读取到 ram, 则无法快速相应;
- 中断回调以及其子函数不能存在 switch 函数, 因为 switch 语句编译生成的跳转表默认放在 bank 区, 务必使用 if-else 语句;
// 回调 |
GPIO 外部中断上升下降沿问题
在用 SPI 跑外置 LoRa 模组的时候,LoRa 模组带有一个 DO1 引脚,用于触发中断,宣告 MCU 模组进入相关状态, DO1 引脚为上升沿触发,且需要手动发送报文拉低;
蓝讯 GPIO 外置中断问题在于,SDK 和例程里所谓的 GPIO_EDGE_FALLING 上升沿和 GPIO_EDGE_RISING 下降沿并非真实电平沿触发, 而是单纯高低电平触发;
正常来说 DO1 拉高 -> 检测到上升沿 -> 进入中断回调 -> 清除 GPIO 中断标志位 -> 读取 LoRa 状态标志位 -> 清除 LoRa 模块中断标志位 ->DO1 拉低; 此时只会触发一次中断;
但是蓝讯没有上升沿触发, 进而会 DO1 拉高 -> 检测到高电平 -> 进入中断回调 -> 清除 GPIO 中断标志位 -> 检测到高电平 -> 进入中断回调 -> 清除 GPIO 标志位 ->……; 中断会被一直触发, 进而卡在中断里面, 没法喂狗随后重启;
解决办法是
进入中断回调后, 在中断回调执行 gpio_edge_pic_disable() 关闭所有电平沿中断, 随后处理完中断内容后, 再把 WKUPCON 寄存器反取, 重新开启电平沿中断; 这样的问题在于, 关闭所有电平沿中断, 会导致其他 GPIO 中断也用不了;
// 回调 |
SPI1 被占用问题
AB2027A3 除开魔改的 LED 载波 SPI 后, 实际上有两个标准 SPI, 分别是 SPI0 和 SPI1, 他们都支持完整的 SPI 四线标准通讯;
但是上文提到, 芯片片上内置有一个基于 SPI 协议的 flash, 他占用了 SPI1, 所以实际可供外设使用的只有一个 SPI0, 好在 SPI 本身支持多设备;
这点在 SPI 应用手册和 FQ 中有提到;
官方 datasheet
此文档属官方 datasheet 链接的外链, 属于本站提供的非本站内容, 博主对其内容不负责;