框架总述

  • 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开销小;

综上所述:

  1. 没有使用AT宏声明的函数, 默认放在bank区
  2. 中断回调以及其子函数必须放在com区, 放在bank区会死机; 中断相应需要非常即时, CPU直接读取com区, 可以做到较快相应, 而bank要先读取到ram, 则无法快速相应;
  3. 中断回调以及其子函数不能存在switch函数, 因为switch语句编译生成的跳转表默认放在bank区, 务必使用if-else语句;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 回调
AT(.com_text.gpio_isr) // 中断回调必须放在isr中
static void gpio_inputer_handler()
{
gpio_edge_pending_clear(); // 清标志位
}
// GPIO 初始化
static void gpio_init(void)
{
gpio_edge_cap_typedef config;

config.edge = GPIO_EDGE_FALLING;
config.gpiox = IOKEY_PORT;
config.gpio_pin = IOKEY_PIN;

gpio_edge_capture_config(&config); // 注册中断
gpio_edge_pic_config(gpio_inputer_handler, 0); // 注册回调
}

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 回调
AT(.com_text.gpio_isr) // 中断回调必须放在isr中
static void gpio_inputer_handler()
{
gpio_edge_pic_disable(); // 关闭所有沿中断
gpio_edge_pending_clear(); // 清标志位
pass... // 业务处理
pass... // 业务处理
WKUPCON |= BIT(16); // 重新开所有电平沿中断
}
// GPIO 初始化
static void gpio_init(void)
{
gpio_edge_cap_typedef config;

config.edge = GPIO_EDGE_FALLING;
config.gpiox = IOKEY_PORT;
config.gpio_pin = IOKEY_PIN;

gpio_edge_capture_config(&config); // 注册中断
gpio_edge_pic_config(gpio_inputer_handler, 0); // 注册回调
}

SPI1被占用问题

AB2027A3除开魔改的LED载波SPI后, 实际上有两个标准SPI, 分别是SPI0和SPI1, 他们都支持完整的SPI四线标准通讯;

但是上文提到, 芯片片上内置有一个基于SPI协议的flash, 他占用了SPI1, 所以实际可供外设使用的只有一个SPI0, 好在SPI本身支持多设备;

这点在SPI应用手册和FQ中有提到;


官方datasheet

此文档属官方datasheet链接的外链, 属于本站提供的非本站内容, 博主对其内容不负责;