跳到主要内容

休眠模式

1个月前

休眠模式

张贴了vishaliotlynx.20分 5回复
0旋转

大家好,

我正在研究da14531微小的模块。我想把我的设备放在hibernate模式下,因为我在arable.c文件中完成了以下更改

静态void Enter_Ship_Mode(void)
{
ARCH_PRINTF(“\ n \ r%s”,__f功能__);

/ *在进入船舶模式之前,确保所有调试输出都完成* /
ARCH_PRINTF_PROCESS();
而(getBits32(UART2_USR_REG,UART_BUSY)!= 0);

/ *将设备放入休眠模式,没有RAM保留(唤醒唤醒)
功能不返回* /
ARCH_SET_HIBERNATION(0x20,/ * p0_5 * /
pd_sys_down_ram_off,
pd_sys_down_ram_off,
pd_sys_down_ram_off,
remap_addr0_to_rom,
错误的);
}
静态void flash_power_down(void)
{
ARCH_PRINTF(“\ n \ r%s”,__f功能__);
/ *默认SPI配置* /
static const spi_cfg_t spi_cfg = {
.spi_ms = spi_ms_mode_master,
.spi_cp = spi_cp_mode_0,
.spi_speed = spi_speed_mode_4mhz,
.spi_wsz = spi_mode_8bit,
.spi_cs = spi_cs_0,
.cs_pad.port = spi_en_port,
.cs_pad.pin = spi_en_pin,
.spi_capture = spi_master_edge_capture,
};

/ *将接口初始化为spi flash * /
spi_initialize(&spi_cfg);

/ *禁用P0_0上的HW RST,所以它可以用作SPI MOSI * /
gpio_disable_hw_reset();
spi_flash_power_down();

/ *重新启用HW复位输入(如果进一步操作时必须被禁用)
执行外部闪存) - 必须先设置为输入!* /
gpio_configurepin(spi_do_port,spi_do_pin,input_pulldown,pid_gpio,false);
gpio_enable_hw_reset();
}
uint8_t count_var = 0;
void user_app_add_undirect_complete(uint8_t状态)
{


char buffer [2],str_parse [5];
ARCH_PRINTF(“\ n \ r%s”,__f功能__);
虽然(UART_DATA_READY_GETF(UART1)== 1)
{
UART_RECEIVE(UART1,(UINT8_T *)缓冲区,1,UART_OP_BLOCKING);
// UART_WRITE_BYTE(UART2,BUFFER [0]);
rx_buff [count] =缓冲器[0];
count ++;
}
虽然(UART_DATA_READY_GETF(UART1)== 1)
{
UART_RECEIVE(UART1,(UINT8_T *)缓冲区,1,UART_OP_BLOCKING);
// UART_WRITE_BYTE(UART2,BUFFER [0]);
rx_buff [count] =缓冲器[0];
count ++;
}

rx_buff [count] ='\ 0';
strncpy(str_parse,rx_buff + 4,2);
temp_val = atoi(str_parse);
UART_WRITE_BYTE(UART1,TEMP_VAL);
memset(str_parse,0,sizeof(str_parse));


strncpy(str_parse,rx_buff + 8,4);
supply_vtg_vale = atoi(str_parse);
UART_WRITE_BYTE(UART2,supply_vtg_vale&0xff);
UART_WRITE_BYTE(UART2,SUPPLY_VTG_VALE >> 8);
memset(str_parse,0,sizeof(str_parse));

strncpy(str_parse,rx_buff + 13,2);
pressult_value = Atoi(str_parse);
UART_WRITE_BYTE(UART2,FLUGED_VALUE);
memset(str_parse,0,sizeof(str_parse));

// UART_WRITE_BYTE(UART1,'D');
// UART_WRITE_BYTE(UART1,COUNT);
// UART_WRITE_BYTE(UART1,'\ R');
// UART_WRITE_BYTE(UART1,'\ n');
// for(int i = 0; i // UART_WRITE_BYTE(UART1,RX_BUFF [i]);
// count = 0;
// memset(rx_buff,0,sizeof(rx_buff));
// UART_WRITE_BYTE(UART1,'\ R');
// UART_WRITE_BYTE(UART1,'\ n');
//如果广告被取消,则更新广告数据并再次启动广告

count_var ++;

if(status == gap_err_canceled)
{
user_app_adv_start();

}

if(count_var> 2)
{
UART_WRITE_BYTE(UART2,'A');
count_var = 0;
// ARCH_PRINTF(“\ n \ r%d”,count_var);

flash_power_down();
__nop();
__nop();
__nop();
__nop();
Enter_Ship_Mode();
}



}

所以在添加该代码后,我的代码不起作用

此外,我试图重新编程Flash SmartBond闪存程序员显示以下错误

在打开JLink连接终止过程时没有发现芯片......

我还尝试使用SmartSnippet工具箱使用单线UART编程,但我没有成功。

我为休眠模式做了什么?我的代码是正确的

当我编写flash时,我丢失了4次HW。所以我如何恢复那个HW?

1个月前

PM_DIALOG.

嗨vishaliotlynx,

感谢您在线的问题,并符合我们的微小模块解决方案。

我建议首先检查DA14531配置休眠和状态感知休眠模式SW示例。DA14531在广告关闭时进入休眠状态,user_app_adv_undirect_complete()击中。关于您的代码段:

1.在刻录闪光灯之前,您是否在调试模式下运行代码,以便您可以检查它是否正常工作?在user_app_adv_undirect_complete()我看到你想通过UART阅读一些数据。因此,如果启用了WDOG,我猜出了WDOG时段,并且在NMI处理程序中的代码gests堆栈。

因此,我的第一个建议将从系统RAM引导,附加调试器,添加一些断点并检查代码是否正常运行。

例如,如果将断点添加到ente_ship_mode()中,它会击中吗?

2.在user_app_adv_undirect_complete()中,如果状态为GAP_ERR_CANCELED,则会重新启动广告。我假设代码永远不会到达enter_ship_mode();由于#1。

3.如果SPI闪存被编程,则相信芯片始终重置,因为代码可能将堆栈纳入断言,NMI等,因此不允许您连接到SPI闪存。

4.请尝试使用SDK提供的BLE_APP_BAREBONE项目从SYSTEM-RAM引导。当设备靴子时,使用工具箱连接到SPI闪光灯并擦除它。

谢谢,PM_DIALOG.

1个月前

vishaliotlynx. 20分

你好 ,

感谢您的答复

在该代码片段中,您可以看到我填充了一些成功运行的串行调试语句。

我的流程就像波罗纹一样

1)DA14531从UART读取一些字节

2)通过BLE的字节进行广告

3)广告后它进入休眠

4)来自GPIO P0_5其唤醒再次执行上述步骤。

在这里,我用blearbone举例来检查我收到数据Thorugh Uart并通过BLE广告

对于休眠,我有问题所以我所做的?

1个月前

PM_DIALOG.

嗨vishaliotlynx,

为延迟道歉。

请在调用Arch_set_hibernation()的行中添加一个断点。

在调试模式下运行项目。

断点击中了吗?

如果您可以提供一些调试信息,这将是非常有帮助的,以便我能够理解出错了。

谢谢,PM_DIALOG.

1个月前

vishaliotlynx. 20分

我的休眠代码现在正在运作。

现在我想改变初始广告数据

我在Ble Barebone示例中完成了叶子的变化

#define user_advertise_data“”
///广告数据长度 - 最多28个字节,保留3个字节以设置
#define user_advertise_data_len(sizeof(user_advertise_data)-1)

///扫描响应数据
#define user_advertise_scan_response_data“”

///扫描响应数据长度 - 最多31个字节
#define user_advertise_scan_response_data_len(sizeof(user_advertise_scan_response_data)-1)

char avd_data [10] = {0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc};
void user_app_init(void)
{

ARCH_PRINTF(“\ n \ r%s”,__f功能__);
app_param_update_request_timer_used = easy_timer_invalid_timer;

//初始化制造商特定数据
mnf_data_init();

//初始化广告和扫描响应数据
memcpy(storage_adv_data,adv_data,10);
// memcpy(stordal_adv_data,user_advertise_data,user_advertise_data_len);
storage_add_data_len = 8;
memcpy(storage_scan_rsp_data,user_advertise_scan_response_data,user_advertise_scan_response_data_len);
storage_scan_rsp_data_len = user_advertise_scan_response_data_len;

default_app_on_init();
}

所以它不能在BLE广告中显示我的数据

1个月前

PM_DIALOG.

嗨vishaliotlynx,

很高兴休眠代码现在正在运作。广告数据应遵循特定格式 - 请查看以下教程以获取更多信息:

http://lpccs-docs.dialog-seminiondiond.com/da145xx_advertising_tutorial/changing_advertising_parameters.html#changing-the-advertising-data.

将user_advertise_data在app_easy_gap_undirected_advertise_start_create_msg()函数中复制到广告字符串中。您可以修改user_advertise_data宏以便更改广告数据。

由于此问题与初始帖子无关,因此我建议创建一个新的帖子。

谢谢,PM_DIALOG.