1.前言
在泰凌微的使用中,会出现一个问题,对片上flash的擦除会导致蓝牙的断连。
2.原因
2.1 关闭蓝牙的中断
为了保证flash MSPI时序操作的的完整性,会关闭掉中断,而蓝牙通讯是通过中断来收发数据
2.2 flash擦除时间过长
使用flash_erase_sector(u32 addr) 去擦除一个扇区,在官方文档说明中:16M系统时钟,大约需要30~100ms甚至更长时间。 在48M系统,测试出来的时间大约是50~70ms。
3.解决办法
SDK提供了一套机制,通过bls_ll_requestConnBrxEventDisable() 去查询下个蓝牙通讯的时间点,如果大于flash的擦除时间,则使用bls_ll_disableConnBrxEvent() 去关闭蓝牙收发,调用flash_erase_sector 擦除flash,再调用bls_ll_restoreConnBrxEvent() 开启蓝牙收发;
3.1蓝牙三种可以擦除的状态:bls_ll_requestConnBrxEventDisable()
注:bls_ll_requestConnBrxEventDisable()的返回值为0表示蓝牙处于Conn state时的Brx working阶段,不接受申请;非0表示允许停掉Brx Event的时间。
3.2 代码
实现代码如下
static void hal_flash_sector_erase(unsigned long addr)
{
//根据测试出的擦除时间,去设置可以擦除的时间,这里暂定为100ms
if(bls_ll_requestConnBrxEventDisable()>100){
bls_ll_disableConnBrxEvent();
flash_erase_sector(addr);
bls_ll_restoreConnBrxEvent();
}
}
4 FLASH操作的一些主要事项
4.1 写函数 flash_write_page
4.2 读数据
(1).使用flash_read_page 来读数据; (2).使用指针读取数据,但要注意一下问题:只要是通过MCU系统读到的数据,MCU都会将这些数据缓存在cache里,如果cache里这个数据没有被其他内容覆盖时,又有新的访问该数据时的请求发送生,此时MCU会直接用cache里的缓存的内容作为结果。
|