mirror of
https://github.com/ttrftech/NanoVNA.git
synced 2025-12-06 03:31:59 +01:00
add save and restore dac value in flash
This commit is contained in:
parent
9f5259556c
commit
9037593831
|
|
@ -19,14 +19,14 @@
|
||||||
*/
|
*/
|
||||||
MEMORY
|
MEMORY
|
||||||
{
|
{
|
||||||
flash0 : org = 0x08000000, len = 124k
|
flash0 : org = 0x08000000, len = 96k
|
||||||
flash1 : org = 0x00000000, len = 0
|
flash1 : org = 0x00000000, len = 0
|
||||||
flash2 : org = 0x00000000, len = 0
|
flash2 : org = 0x00000000, len = 0
|
||||||
flash3 : org = 0x00000000, len = 0
|
flash3 : org = 0x00000000, len = 0
|
||||||
flash4 : org = 0x00000000, len = 0
|
flash4 : org = 0x00000000, len = 0
|
||||||
flash5 : org = 0x00000000, len = 0
|
flash5 : org = 0x00000000, len = 0
|
||||||
flash6 : org = 0x00000000, len = 0
|
flash6 : org = 0x00000000, len = 0
|
||||||
flash7 : org = 0x08018800, len = 30k
|
flash7 : org = 0x08018000, len = 32k
|
||||||
ram0 : org = 0x20000000, len = 16k
|
ram0 : org = 0x20000000, len = 16k
|
||||||
ram1 : org = 0x00000000, len = 0
|
ram1 : org = 0x00000000, len = 0
|
||||||
ram2 : org = 0x00000000, len = 0
|
ram2 : org = 0x00000000, len = 0
|
||||||
|
|
|
||||||
48
flash.c
48
flash.c
|
|
@ -76,13 +76,57 @@ checksum(void *start, size_t len)
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define FLASH_PAGESIZE 0x800
|
||||||
|
|
||||||
|
const uint32_t save_config_area = 0x08018000;
|
||||||
|
|
||||||
|
int
|
||||||
|
config_save(void)
|
||||||
|
{
|
||||||
|
uint16_t *src = (uint16_t*)&config;
|
||||||
|
uint16_t *dst = save_config_area;
|
||||||
|
int count = sizeof(config_t) / sizeof(uint16_t);
|
||||||
|
|
||||||
|
config.magic = CONFIG_MAGIC;
|
||||||
|
config.checksum = 0;
|
||||||
|
config.checksum = checksum(&config, sizeof config);
|
||||||
|
|
||||||
|
flash_unlock();
|
||||||
|
|
||||||
|
/* erase flash pages */
|
||||||
|
flash_erase_page((uint32_t)dst);
|
||||||
|
|
||||||
|
/* write to flahs */
|
||||||
|
while(count-- > 0) {
|
||||||
|
flash_program_half_word((uint32_t)dst, *src++);
|
||||||
|
dst++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
config_recall(void)
|
||||||
|
{
|
||||||
|
config_t *src = save_config_area;
|
||||||
|
void *dst = &config;
|
||||||
|
|
||||||
|
if (src->magic != CONFIG_MAGIC)
|
||||||
|
return -1;
|
||||||
|
if (checksum(src, sizeof(config_t)) != 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/* duplicated saved data onto sram to be able to modify marker/trace */
|
||||||
|
memcpy(dst, src, sizeof(config_t));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#define SAVEAREA_MAX 5
|
#define SAVEAREA_MAX 5
|
||||||
|
|
||||||
const uint32_t saveareas[] =
|
const uint32_t saveareas[] =
|
||||||
{ 0x08018800, 0x0801a000, 0x0801b800, 0x0801d000, 0x0801e8000 };
|
{ 0x08018800, 0x0801a000, 0x0801b800, 0x0801d000, 0x0801e8000 };
|
||||||
|
|
||||||
#define FLASH_PAGESIZE 0x800
|
|
||||||
|
|
||||||
int16_t lastsaveid = 0;
|
int16_t lastsaveid = 0;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
35
main.c
35
main.c
|
|
@ -156,14 +156,21 @@ static void cmd_dac(BaseSequentialStream *chp, int argc, char *argv[])
|
||||||
int value;
|
int value;
|
||||||
if (argc != 1) {
|
if (argc != 1) {
|
||||||
chprintf(chp, "usage: dac {value(0-4095)}\r\n");
|
chprintf(chp, "usage: dac {value(0-4095)}\r\n");
|
||||||
|
chprintf(chp, "current value: %d\r\n", config.dac_value);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
value = atoi(argv[0]);
|
value = atoi(argv[0]);
|
||||||
|
config.dac_value = value;
|
||||||
dacPutChannelX(&DACD2, 0, value);
|
dacPutChannelX(&DACD2, 0, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void cmd_saveconfig(BaseSequentialStream *chp, int argc, char *argv[])
|
||||||
|
{
|
||||||
|
(void)argc;
|
||||||
|
(void)argv;
|
||||||
|
config_save();
|
||||||
|
chprintf(chp, "Config saved.\r\n");
|
||||||
|
}
|
||||||
|
|
||||||
static struct {
|
static struct {
|
||||||
int16_t rms[2];
|
int16_t rms[2];
|
||||||
|
|
@ -1290,6 +1297,7 @@ static const ShellCommand commands[] =
|
||||||
{ "offset", cmd_offset },
|
{ "offset", cmd_offset },
|
||||||
{ "time", cmd_time },
|
{ "time", cmd_time },
|
||||||
{ "dac", cmd_dac },
|
{ "dac", cmd_dac },
|
||||||
|
{ "saveconfig", cmd_saveconfig },
|
||||||
{ "data", cmd_data },
|
{ "data", cmd_data },
|
||||||
{ "dump", cmd_dump },
|
{ "dump", cmd_dump },
|
||||||
{ "frequencies", cmd_frequencies },
|
{ "frequencies", cmd_frequencies },
|
||||||
|
|
@ -1325,7 +1333,7 @@ static const I2CConfig i2ccfg = {
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
static const DACConfig dac1cfg1 = {
|
static DACConfig dac1cfg1 = {
|
||||||
//init: 2047U,
|
//init: 2047U,
|
||||||
init: 1922U,
|
init: 1922U,
|
||||||
datamode: DAC_DHRM_12BIT_RIGHT
|
datamode: DAC_DHRM_12BIT_RIGHT
|
||||||
|
|
@ -1338,15 +1346,6 @@ int main(void)
|
||||||
|
|
||||||
chMtxObjectInit(&mutex);
|
chMtxObjectInit(&mutex);
|
||||||
|
|
||||||
/*
|
|
||||||
* Starting DAC1 driver, setting up the output pin as analog as suggested
|
|
||||||
* by the Reference Manual.
|
|
||||||
*/
|
|
||||||
//palSetPadMode(GPIOA, 5, PAL_MODE_INPUT_ANALOG);
|
|
||||||
//palSetPadMode(GPIOA, 5, PAL_MODE_OUTPUT_PUSHPULL);
|
|
||||||
//palSetPadMode(GPIOA, 5, PAL_MODE_INPUT);
|
|
||||||
dacStart(&DACD2, &dac1cfg1);
|
|
||||||
|
|
||||||
//palSetPadMode(GPIOB, 8, PAL_MODE_ALTERNATE(1) | PAL_STM32_OTYPE_OPENDRAIN);
|
//palSetPadMode(GPIOB, 8, PAL_MODE_ALTERNATE(1) | PAL_STM32_OTYPE_OPENDRAIN);
|
||||||
//palSetPadMode(GPIOB, 9, PAL_MODE_ALTERNATE(1) | PAL_STM32_OTYPE_OPENDRAIN);
|
//palSetPadMode(GPIOB, 9, PAL_MODE_ALTERNATE(1) | PAL_STM32_OTYPE_OPENDRAIN);
|
||||||
i2cStart(&I2CD1, &i2ccfg);
|
i2cStart(&I2CD1, &i2ccfg);
|
||||||
|
|
@ -1380,7 +1379,17 @@ int main(void)
|
||||||
*/
|
*/
|
||||||
plot_init();
|
plot_init();
|
||||||
|
|
||||||
/* restore config and calibration data from flash memory */
|
/* restore config */
|
||||||
|
config_recall();
|
||||||
|
|
||||||
|
dac1cfg1.init = config.dac_value;
|
||||||
|
/*
|
||||||
|
* Starting DAC1 driver, setting up the output pin as analog as suggested
|
||||||
|
* by the Reference Manual.
|
||||||
|
*/
|
||||||
|
dacStart(&DACD2, &dac1cfg1);
|
||||||
|
|
||||||
|
/* restore frequencies and calibration properties from flash memory */
|
||||||
caldata_recall(0);
|
caldata_recall(0);
|
||||||
|
|
||||||
/* initial frequencies */
|
/* initial frequencies */
|
||||||
|
|
|
||||||
|
|
@ -275,6 +275,9 @@ extern properties_t current_props;
|
||||||
int caldata_save(int id);
|
int caldata_save(int id);
|
||||||
int caldata_recall(int id);
|
int caldata_recall(int id);
|
||||||
|
|
||||||
|
int config_save(void);
|
||||||
|
int config_recall(void);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ui.c
|
* ui.c
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
28
ui.c
28
ui.c
|
|
@ -354,10 +354,14 @@ menu_calop_cb(int item)
|
||||||
static void
|
static void
|
||||||
menu_caldone_cb(int item)
|
menu_caldone_cb(int item)
|
||||||
{
|
{
|
||||||
|
extern const menuitem_t menu_save[];
|
||||||
|
extern const menuitem_t menu_cal[];
|
||||||
(void)item;
|
(void)item;
|
||||||
cal_done();
|
cal_done();
|
||||||
draw_cal_status();
|
draw_cal_status();
|
||||||
menu_move_back();
|
menu_move_back();
|
||||||
|
menu_push_submenu(menu_cal);
|
||||||
|
menu_push_submenu(menu_save);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
@ -550,10 +554,21 @@ const menuitem_t menu_calop[] = {
|
||||||
{ MT_NONE, NULL, NULL } // sentinel
|
{ MT_NONE, NULL, NULL } // sentinel
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const menuitem_t menu_save[] = {
|
||||||
|
{ MT_CALLBACK, "0", menu_save_cb },
|
||||||
|
{ MT_CALLBACK, "1", menu_save_cb },
|
||||||
|
{ MT_CALLBACK, "2", menu_save_cb },
|
||||||
|
{ MT_CALLBACK, "3", menu_save_cb },
|
||||||
|
{ MT_CALLBACK, "4", menu_save_cb },
|
||||||
|
{ MT_CANCEL, "BACK", NULL },
|
||||||
|
{ MT_NONE, NULL, NULL } // sentinel
|
||||||
|
};
|
||||||
|
|
||||||
const menuitem_t menu_cal[] = {
|
const menuitem_t menu_cal[] = {
|
||||||
{ MT_CALLBACK, "RESET", menu_cal2_cb },
|
{ MT_CALLBACK, "RESET", menu_cal2_cb },
|
||||||
{ MT_CALLBACK, "OFF", menu_cal2_cb },
|
{ MT_CALLBACK, "OFF", menu_cal2_cb },
|
||||||
{ MT_CALLBACK, "ON", menu_cal2_cb },
|
{ MT_CALLBACK, "ON", menu_cal2_cb },
|
||||||
|
{ MT_SUBMENU, "SAVE", menu_save },
|
||||||
{ MT_CANCEL, "BACK", NULL },
|
{ MT_CANCEL, "BACK", NULL },
|
||||||
{ MT_NONE, NULL, NULL } // sentinel
|
{ MT_NONE, NULL, NULL } // sentinel
|
||||||
};
|
};
|
||||||
|
|
@ -621,7 +636,7 @@ const menuitem_t menu_stimulus[] = {
|
||||||
{ MT_CALLBACK, "STOP", menu_stimulus_cb },
|
{ MT_CALLBACK, "STOP", menu_stimulus_cb },
|
||||||
{ MT_CALLBACK, "CENTER", menu_stimulus_cb },
|
{ MT_CALLBACK, "CENTER", menu_stimulus_cb },
|
||||||
{ MT_CALLBACK, "SPAN", menu_stimulus_cb },
|
{ MT_CALLBACK, "SPAN", menu_stimulus_cb },
|
||||||
{ MT_CALLBACK, "CW", menu_stimulus_cb },
|
{ MT_CALLBACK, "CW FREQ", menu_stimulus_cb },
|
||||||
{ MT_CALLBACK, "PAUSE", menu_stimulus_cb },
|
{ MT_CALLBACK, "PAUSE", menu_stimulus_cb },
|
||||||
{ MT_CANCEL, "BACK", NULL },
|
{ MT_CANCEL, "BACK", NULL },
|
||||||
{ MT_NONE, NULL, NULL } // sentinel
|
{ MT_NONE, NULL, NULL } // sentinel
|
||||||
|
|
@ -657,23 +672,12 @@ const menuitem_t menu_recall[] = {
|
||||||
{ MT_NONE, NULL, NULL } // sentinel
|
{ MT_NONE, NULL, NULL } // sentinel
|
||||||
};
|
};
|
||||||
|
|
||||||
const menuitem_t menu_save[] = {
|
|
||||||
{ MT_CALLBACK, "0", menu_save_cb },
|
|
||||||
{ MT_CALLBACK, "1", menu_save_cb },
|
|
||||||
{ MT_CALLBACK, "2", menu_save_cb },
|
|
||||||
{ MT_CALLBACK, "3", menu_save_cb },
|
|
||||||
{ MT_CALLBACK, "4", menu_save_cb },
|
|
||||||
{ MT_CANCEL, "BACK", NULL },
|
|
||||||
{ MT_NONE, NULL, NULL } // sentinel
|
|
||||||
};
|
|
||||||
|
|
||||||
const menuitem_t menu_top[] = {
|
const menuitem_t menu_top[] = {
|
||||||
{ MT_SUBMENU, "DISPLAY", menu_display },
|
{ MT_SUBMENU, "DISPLAY", menu_display },
|
||||||
{ MT_SUBMENU, "MARKER", menu_marker },
|
{ MT_SUBMENU, "MARKER", menu_marker },
|
||||||
{ MT_SUBMENU, "STIMULUS", menu_stimulus },
|
{ MT_SUBMENU, "STIMULUS", menu_stimulus },
|
||||||
{ MT_CALLBACK, "CAL", menu_cal_cb },
|
{ MT_CALLBACK, "CAL", menu_cal_cb },
|
||||||
{ MT_SUBMENU, "RECALL", menu_recall },
|
{ MT_SUBMENU, "RECALL", menu_recall },
|
||||||
{ MT_SUBMENU, "SAVE", menu_save },
|
|
||||||
{ MT_CLOSE, "CLOSE", NULL },
|
{ MT_CLOSE, "CLOSE", NULL },
|
||||||
{ MT_NONE, NULL, NULL } // sentinel
|
{ MT_NONE, NULL, NULL } // sentinel
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue