
中科蓝讯AB2027开发兼踩坑备忘录
框架总述
- 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语句;
1 | // 回调 |
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中断也用不了;
1 | // 回调 |
SPI1被占用问题
AB2027A3除开魔改的LED载波SPI后, 实际上有两个标准SPI, 分别是SPI0和SPI1, 他们都支持完整的SPI四线标准通讯;
但是上文提到, 芯片片上内置有一个基于SPI协议的flash, 他占用了SPI1, 所以实际可供外设使用的只有一个SPI0, 好在SPI本身支持多设备;
这点在SPI应用手册和FQ中有提到;
官方datasheet
此文档属官方datasheet链接的外链, 属于本站提供的非本站内容, 博主对其内容不负责;