您好!我想通过应用程序将我希望的MAC地址发送给14580年,然后保存在外部SPI flash中,下次启动的时候就使用新的MAC地址。然后我需要在哪里新mac的赋值给dev_bdaddr吗?谢谢
芯片上电拿地址的流程如下:找到system_init函数1.580上电首先会从OTP里去读地址存到dev_bdaddr,函数流程nvds_read_bdaddr - > nvds_read_bdaddr_from_otp2.rwip_init函数,这个函数因为BLE_HOST_PRESENT定义了,所以跑的是罗里的版本,不是SDK里的同名函数。3.在rwip_init函数里面,会调用到rwble_init - > lld_init (false) / /假代表不需要重置4. lld_init函数会调用jump_table_base里的lld_init_func函数5. lld_init_func里面会调用nvds_get函数去拿NVDS_TAG_BD_ADDRESS里的蓝牙地址。获取的地址就是最后设备会用到的地址。nvds_get对应SDK代码里的jump_table里的custom_nvds_get_func。6. custom_nvds_get_func函数里面,查看关于NVDS_TAG_BD_ADDRESS部分。co_null_bdaddr为全0地址。如果dev_bdaddr里是全0,则调用nvds_get_func函数(ROM固化函数)去拿SDK里面nvds_data_storage结构里的地址。(在nvds.c文件里)如果不是0,则dev_bdaddr就是实际获取的地址。
所以,可以在函数custom_nvds_get_func里面修改
嗨Gongyu_Dialog,我在调试下操作spi flash,程序会跑飞,这是怎么回事?谢谢
确定管脚都配置正确了?另外,flash初始化的函数都调用的到。
嗨Gongyu_Dialog,管脚已经正确配置好了,初始化也初始化了。现在问题是,如果读写flash的话,程序就会死掉,不读写程序就正常。
确认一下闪光的配置,比如闪电大小和页大小配置正确。另外,在调试模式下,可以通过断点的方式,看看是在什么地方出错的。
如果DEVELOPMENT_DEBUG开着的,遇到程序死掉,一般都会跑进HardFault_HandlerC函数。可以看看保存的PC / LR是在哪里出问题的。
如果DEVELOPMENT_DEBUG开着的,遇到程序死掉,一般都会跑进HardFault_HandlerC函数。可以看看保存的PC / LR是在哪里出问题的。/ /没错,就是开了DEVELOPMENT_DEBUG。”PC / LR”这个是什么意思?
void HardFault_HandlerC(unsigned long *hardfault_args){如果(DEVELOPMENT_DEBUG){*(volatile unsigned long *)(STATUS_BASE + 0x14) = hardfault_args[5];/ / LR*(volatile unsigned long *)(STATUS_BASE + 0x18) = hardfault_args[6];/ /电脑
.........
开启# define CFG_DEVELOPMENT_DEBUG后,操作flash,程序跑到空NMI_HandlerC(无符号长* hardfault_args)里面的”“如果((GetWord16 (SYS_STAT_REG) & DBG_IS_UP) = = DBG_IS_UP) __asm(“BKPT # 0 \ n”);“谢谢
芯片上电拿地址的流程如下:
找到system_init函数
1.580上电首先会从OTP里去读地址存到dev_bdaddr,函数流程nvds_read_bdaddr - > nvds_read_bdaddr_from_otp
2.rwip_init函数,这个函数因为BLE_HOST_PRESENT定义了,所以跑的是罗里的版本,不是SDK里的同名函数。
3.在rwip_init函数里面,会调用到rwble_init - > lld_init (false) / /假代表不需要重置
4. lld_init函数会调用jump_table_base里的lld_init_func函数
5. lld_init_func里面会调用nvds_get函数去拿NVDS_TAG_BD_ADDRESS里的蓝牙地址。获取的地址就是最后设备会用到的地址。
nvds_get对应SDK代码里的jump_table里的custom_nvds_get_func。
6. custom_nvds_get_func函数里面,查看关于NVDS_TAG_BD_ADDRESS部分。co_null_bdaddr为全0地址。
如果dev_bdaddr里是全0,则调用nvds_get_func函数(ROM固化函数)去拿SDK里面nvds_data_storage结构里的地址。(在nvds.c文件里)
如果不是0,则dev_bdaddr就是实际获取的地址。
所以,可以在函数custom_nvds_get_func里面修改
嗨Gongyu_Dialog,
我在调试下操作spi flash,程序会跑飞,这是怎么回事?谢谢
确定管脚都配置正确了?另外,flash初始化的函数都调用的到。
嗨Gongyu_Dialog,
管脚已经正确配置好了,初始化也初始化了。现在问题是,如果读写flash的话,程序就会死掉,不读写程序就正常。
确认一下闪光的配置,比如闪电大小和页大小配置正确。
另外,在调试模式下,可以通过断点的方式,看看是在什么地方出错的。
如果DEVELOPMENT_DEBUG开着的,遇到程序死掉,一般都会跑进HardFault_HandlerC函数。
可以看看保存的PC / LR是在哪里出问题的。
如果DEVELOPMENT_DEBUG开着的,遇到程序死掉,一般都会跑进HardFault_HandlerC函数。
可以看看保存的PC / LR是在哪里出问题的。
/ /没错,就是开了DEVELOPMENT_DEBUG。”PC / LR”这个是什么意思?
void HardFault_HandlerC(unsigned long *hardfault_args)
{
如果(DEVELOPMENT_DEBUG)
{
*(volatile unsigned long *)(STATUS_BASE + 0x14) = hardfault_args[5];/ / LR
*(volatile unsigned long *)(STATUS_BASE + 0x18) = hardfault_args[6];/ /电脑
.........
开启# define CFG_DEVELOPMENT_DEBUG后,操作flash,程序跑到空NMI_HandlerC(无符号长* hardfault_args)里面的”“如果((GetWord16 (SYS_STAT_REG) & DBG_IS_UP) = = DBG_IS_UP) __asm(“BKPT # 0 \ n”);“
谢谢