Dialog的DA14531芯片支持通过通讯接口在BOOT中写入程序,然后加载在RAM中运行。
注意该启动方式是将程序加载到RAM里的,所以设备复位或者掉电后,程序都需要重新刷写一次。一般情况下,DA14531的程序在32K以下,UART方式刷写一般不超过3秒完成启动,SPI方式则会快很多。
之所以这么做,主要是考虑芯片本身只有OTP的FLASH,升级通常通过外挂SPI的FALSH完成。但是考虑到成本问题,如果条件满足,完全可以将程序放在外挂的MCU里,每次上电启动时将程序写入,也可以起到相同作用,同时BLE芯片的程序受控性更好,降低程序无法恢复的风险。
下面是DA14531的BOOT启动描述和使用方法:
1、启动方式
DA14531的BOOT启动写入程序到RAM的方式包含以下几种:
由表可以看出,可以通过SPI、单线串口、双线串口、I2C方式将应用程序在芯片处于BOOT中时通讯并写入到RAM里,加载程序并运行。这样,就可以通过外挂一个芯片(比如一个MCU),通过启动时通讯来随时更新BLE芯片的程序了。
二、启动时间
上图还描述了BOOT启动时通讯的顺序,6种启动方式依次进行,它们的启动时间如下:
三、通讯示例
下面以双线串口来举例,如何在BOOT中刷入程序:
首先根据上表,p0_0需要接MCU的RX,P0_1接MCUTX,用于程序写入RAM。
同时,如果DA14531的电源不受控,则我们无法通过控制供电让它进入BOOT,则需要通过复位方式完成这一点
假设我们完成了断电重启或者复位,此时,根据上图所示,芯片会在上电后15.19ms串口发送一帧启动信号,MCU检测该启动信号,开始刷写流程
首先注意串口的属性配置:
通讯的流程:
(1)、复位15.19ms后,BLE芯片TX发送0x02,MCU接收到后,需给出回复
回复3个字节,分别是0x01,程序长度低字节、程序长度高字节(15.63ms之前MCU需要给出长度回复,否则会进入下一模式)
(2)BLE收到回复后,返回ACK0x06 或 NACK0x15,标识刷写是否可以继续进行
(3)MCU开始依次传输升级BIN文件内容,直到传输完(1)步骤指定的长度为止
(4)BLE发送Code的CRC值(该CRC值为BLE芯片收到的code内容逐字节异或,MCU可以根据回复确认BLE芯片是否正确接收到了程序)
(5)MCU发送ACK0x06
(6)BEL收到后,完成刷写流程,自动跳转到0x07FC0000处,开始执行新程序
程序写入RAM的地址:
四、解决复位问题
按照上述流程描述,需要一个复位源来控制芯片重启,但是此时存在一个问题,我们已经把p0_0,也就是芯片默认的RST脚作为TX来用了,这样就需要在应用程序中重映射复位脚,可以直接调用Dialog的SDK来把RST脚映射到任何一个引脚上,如下:
/**
****************************************************************************************
* @brief Enable the GPIO Power-On Reset (POR) source.
* @param[in] port GPIO port
* @param[in] pin GPIO pin
* @param[in] polarity GPIO por pin polarity. 0 = Active low, 1 = Active high.
* @param[in] por_time Time for the Power-On Reset to happen. The time is calculated
* based on the following equation:
* Time = por_time x 4096 x RC32 clock period
****************************************************************************************
*/
void GPIO_EnablePorPin(GPIO_PORT port, GPIO_PIN pin, GPIO_POR_PIN_POLARITY polarity, uint8_t por_time);
//设置示例:
//配置复位脚(将P07设置为复位脚,300mS以上拉高复位)
GPIO_EnablePorPin(GPIO_PORT_0, GPIO_PIN_7, 1, 0x02);
经过这样的配置,就可以解决复位问题了:此时,在BOOT中可以通过拉高P00脚来给芯片复位,在应用程序中则通过p07脚来给芯片复位。当然,还是建议通过电源控制程序进入BOOT会简单一些。
以上同样可以应用到剩下5种启动方式,都是相似的方法,参照手册即可。