解决不能擦除flash的问题

This commit is contained in:
ranchuan
2023-10-08 18:27:10 +08:00
parent 41b36f357e
commit 7f6efb9f5a
14 changed files with 156 additions and 48 deletions

View File

@@ -184,4 +184,8 @@
2023.10.7
添加iic模块升级相关命令
添加下载模块程序指令0xec
2023.10.8
发现gd32不能以地址0x00000000来擦除flash
修改擦除地址为0x08000000来解决无法写入的问题
添加设置总线电压cmd命令

View File

@@ -88,10 +88,13 @@ static int flash_erase(uint32_t sector)
s->mutex=rt_mutex_create("flash_mutex",RT_IPC_FLAG_FIFO);
}
rt_mutex_take(s->mutex,RT_WAITING_FOREVER);
//irq_disable();
FLASH_Unlock();
FLASH_CLEAR_FLAG();
// 对于f103 2048byte为一个扇区这里把扇区地址转化为flash地址
ret=FLASH_ErasePage(sector*2048);
ret=FLASH_ErasePage(FLASH_BASE+ sector*2048);
//FLASH_Lock();
//irq_enable();
rt_mutex_release(s->mutex);
if(ret!=FLASH_COMPLETE)
{
@@ -263,20 +266,24 @@ int flash_write(uint8_t *addr,const uint8_t *data,int len)
//DBG_LOG("write flash addr=%08x",flash_addr);
len+=3;// len不是4字节对齐时强行增加到4字节
//FLASH_Unlock();
for(int i=0;i<len/4;i++)
{
//FLASH_CLEAR_FLAG();
//irq_disable();
//state=FLASH_ProgramByte((uint32_t)addr,data[i]);
state=FLASH_ProgramWord(flash_addr,t[i]);
flash_addr+=4;
//FLASH_CLEAR_FLAG();
//irq_enable();
if(state!=FLASH_COMPLETE)
{
DBG_WARN("flash write failed.ret=%d",state);
DBG_WARN("FLASH->SR=%08X",FLASH->SR);
DBG_WARN("addr=%08X",flash_addr);
ret=-1;
break;
}
flash_addr+=4;
}
//FLASH_Lock();
if(memcmp(addr,data,(len/4)*4)!=0)
{
DBG_WARN("addr=%08x write/read data not equate.",addr);

View File

@@ -1,10 +1,12 @@
#include "elec_det.h"
#include "commend.h"
#include "mystring.h"
#include "mystdlib.h"
#include "hardware/jw3425iic.h"
#include "interface/BaseChecker.h"
#include "base/define.h"
#include "base/utility.h"
#include "interface/EWChecker.h"
// 电子模块相关调试命令
@@ -15,8 +17,9 @@ static int cmd_check(list_def *argv)
{
array_def *data=arr_creat();
cmd_print("start check.");
elec_check_with_scheme(data);
array_def *r=elec_check_with_scheme(data);
arr_delete(data);
cmd_print("check end,ret=%s.",str_temp(arr_string(r)));
return 0;
}
commend_export(check,cmd_check,"start check")
@@ -94,3 +97,21 @@ commend_export(iic_read,cmd_iic_read,"read mtp via iic,param:mtp_addr,data_lengt
// 设置总线电压
static int cmd_set_bus_power(list_def *argv)
{
if(list_length(argv)<2){
cmd_print("param num too less.");
return -1;
}
int bus_v=str_atoi(list_get_str(argv,1));
int ret=0;
checker_runcfg.params[0]=(uint16_t)bus_v;
checker_runcfg.param_count=1;
EW_Test_SetBusV();
ret=checker_runcfg.excue_rtv;
cmd_print("cmd end,ret=%d.",ret);
}
commend_export(bus_power,cmd_set_bus_power,"set bus power,param:bus_power")

View File

@@ -18,6 +18,7 @@
#include "interface/BaseChecker.h"
#include "interface/JQChecker.h"
#include "interface/XTChecker.h"
#include "interface/EWChecker.h"
#define PLAN_MAX_TASK 64
@@ -196,7 +197,7 @@ array_def *elec_check_with_scheme(array_def *uid_psw)
{
self_def *s=&g_self;
const uint8_t* ptaskindex = (uint8_t*)(APP_TEST_PLAN_ADDR+4);
CheckerTask *tasks_fun_table[]={jqtaskArray,xttaskArray};
CheckerTask *tasks_fun_table[]={jqtaskArray,xttaskArray,ewtaskArray};
CheckerTask_Info_st *task_par=0;
uint8_t chip_type=0;
uint8_t taskid=0;
@@ -205,10 +206,12 @@ array_def *elec_check_with_scheme(array_def *uid_psw)
array_def *r=arr_creat();
chip_type=(board_st.plan_id >> 12 ) & 0x0F;
if(s->scheme_inited==0){
DBG_WARN("scheme not init.");
arr_append(r,1);
return arr_temp(r);
}
if(chip_type>=LENGTH(tasks_fun_table)){
DBG_WARN("unknown chip type.");
arr_append(r,2);
return arr_temp(r);
}
@@ -225,14 +228,17 @@ array_def *elec_check_with_scheme(array_def *uid_psw)
checker_runcfg.excue_rtv = 0;
checker_runcfg.task_info.retry_time = 0;
if(taskid>=CHECKER_MAXID_COUNT){
DBG_WARN("tiskid out of bound.");
break;
}
task_par= s->task_info_array[task_index];
if(task_par==0){
DBG_WARN("can not find task params.");
break;
}
task_fun=tasks_fun_table[chip_type][taskid];
if(task_fun==0){
DBG_WARN("can not find task fun.");
break;
}

View File

@@ -6,7 +6,7 @@
#include "base/utility.h"
#include "hardware/power.h"
#include "hardware/timer_cfg.h"
#include "debug.h"
#define UPDATA_PACK_LEN 58
#define UPDATA_BASE_ADDR 0x1000
@@ -23,6 +23,7 @@ static uint8_t EW_Erease(void)
uint8_t ret=0;
DMod_SendBytesXor(data,2,1);
ret=DMod_ReadBytesXor(read,4,100);
DBG_LOG("ret=%d,dat=%02x,%02x,%02x,%02x,",ret,read[0],read[1],read[2],read[3]);
delay_ms(50);
return ret;
}
@@ -36,6 +37,7 @@ static uint8_t EW_Jump(void)
uint8_t ret=0;
DMod_SendBytesXor(data,2,1);
ret=DMod_ReadBytesXor(read,4,100);
DBG_LOG("ret=%d,dat=%02x,%02x,%02x,%02x,",ret,read[0],read[1],read[2],read[3]);
delay_ms(50);
return ret;
}
@@ -50,6 +52,7 @@ static uint8_t EW_Charg(void)
delay_ms(2000);
DMod_SendBytesXor(data,3,1);
ret=DMod_ReadBytesXor(read,4,100);
DBG_LOG("ret=%d,dat=%02x,%02x,%02x,%02x,",ret,read[0],read[1],read[2],read[3]);
delay_ms(5000);
return ret;
}
@@ -70,6 +73,7 @@ static uint8_t EW_Write(uint16_t addr,uint8_t *d,uint16_t len)
DMod_SendBytesXor(buf,len+2+2,1);
ret=DMod_ReadBytesXor(read,4,100);
rt_free(buf);
DBG_LOG("ret=%d,dat=%02x,%02x,%02x,%02x,",ret,read[0],read[1],read[2],read[3]);
delay_ms(50);
return ret;
}
@@ -89,6 +93,7 @@ static uint8_t EW_CheckCrc(uint16_t adr_start,uint16_t adr_end,uint32_t *crc)
*crc=(read[3])|(read[4]<<8)|(read[5]<<16)|(read[6]<<24);
}
}
DBG_LOG("ret=%d,dat=%02x,%02x,%02x,%02x,",ret,read[0],read[1],read[2],read[3]);
delay_ms(50);
return ret;
}
@@ -110,12 +115,23 @@ static uint8_t EW_Read(uint16_t adr,uint8_t *buf,uint16_t len)
{
rt_memcpy(buf,&read[3],len);
}
DBG_LOG("ret=%d,dat=%02x,%02x,%02x,%02x,",ret,read[0],read[1],read[2],read[3]);
delay_ms(50);
rt_free(read);
return ret;
}
// app:通信测试
static void EW_appCommTest(void)
{
uint8_t data[4]={0x11,0x22};
uint8_t ret;
ret=EW_CommTest(data,2,300);
DBG_LOG("ret=%d,dat=%02x,%02x,%02x,%02x,",ret,data[0],data[1],data[2],data[3]);
}
// 升级
void EW_Updata(void)
{
@@ -127,9 +143,11 @@ void EW_Updata(void)
uint8_t pack_len=UPDATA_PACK_LEN;
uint32_t crc=0;
uint32_t crc_module=0;
EW_appCommTest();
ret=EW_Charg();
if(ret) {ret=1;goto err;}
ret=EW_Erease();
//ret=EW_Jump();
if(ret) {ret=2;goto err;}
while(len>0){
pack_len=len>UPDATA_PACK_LEN?UPDATA_PACK_LEN:len;
@@ -156,6 +174,7 @@ void EW_Updata(void)
delay_ms(100);
err:
DBG_LOG("ret=%d",ret);
Checker_MaskResult(ret,checker_runcfg.task_info.runindex);
}
@@ -191,8 +210,9 @@ void EW_Test_SetBusV(void)
Checker_RunCfg_st *cfg=&checker_runcfg;
uint8_t uc_rtv = 0;
uint16_t us_h_v,us_m_v;
//us_h_v = cfg->params[0];
us_h_v = 240;
uint16_t power_old;
us_h_v = cfg->params[0];
power_old=us_h_v;
if(us_h_v < 55)
{
uc_rtv = 1;
@@ -207,6 +227,12 @@ void EW_Test_SetBusV(void)
us_h_v = Power_GetBousV();
Checker_SetRtv(&us_h_v,cfg->rtv_count);
}
if(uc_rtv){
DBG_WARN("bus power init failed.h");
}
if((us_h_v<power_old-10)||(us_h_v>power_old+10)){
DBG_WARN("power set fialed,want=%d,reality=%d.",power_old,us_h_v);
}
Checker_MaskResult(uc_rtv,cfg->task_info.runindex);
}

View File

@@ -10,6 +10,7 @@
extern CheckerTask ewtaskArray[CHECKER_MAXID_COUNT] ;
void EW_Test_SetBusV(void);

View File

@@ -87,7 +87,7 @@ static const uart_dtb g_uartdtb[]={
.uart=USART1,
.uart_clock_fun=RCC_APB2PeriphClockCmd,
.uart_rcc=RCC_APB2Periph_USART1,
.baudrate=115200,
.baudrate=57600,
.irq_channel=USART1_IRQn,
.gpio_tx_clock_fun=RCC_APB2PeriphClockCmd,

View File

@@ -6,7 +6,7 @@
#define BUILD_DATE "2023-10-07 22:39:04"
#define BUILD_DATE "2023-10-08 17:53:21"
#define SOFT_VERSION "0.03"