Skip to content

Commit 9037593

Browse files
committed
add save and restore dac value in flash
1 parent 9f52595 commit 9037593

File tree

5 files changed

+89
-29
lines changed

5 files changed

+89
-29
lines changed

STM32F072xB.ld

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@
1919
*/
2020
MEMORY
2121
{
22-
flash0 : org = 0x08000000, len = 124k
22+
flash0 : org = 0x08000000, len = 96k
2323
flash1 : org = 0x00000000, len = 0
2424
flash2 : org = 0x00000000, len = 0
2525
flash3 : org = 0x00000000, len = 0
2626
flash4 : org = 0x00000000, len = 0
2727
flash5 : org = 0x00000000, len = 0
2828
flash6 : org = 0x00000000, len = 0
29-
flash7 : org = 0x08018800, len = 30k
29+
flash7 : org = 0x08018000, len = 32k
3030
ram0 : org = 0x20000000, len = 16k
3131
ram1 : org = 0x00000000, len = 0
3232
ram2 : org = 0x00000000, len = 0

flash.c

+46-2
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,57 @@ checksum(void *start, size_t len)
7676
return value;
7777
}
7878

79+
80+
#define FLASH_PAGESIZE 0x800
81+
82+
const uint32_t save_config_area = 0x08018000;
83+
84+
int
85+
config_save(void)
86+
{
87+
uint16_t *src = (uint16_t*)&config;
88+
uint16_t *dst = save_config_area;
89+
int count = sizeof(config_t) / sizeof(uint16_t);
90+
91+
config.magic = CONFIG_MAGIC;
92+
config.checksum = 0;
93+
config.checksum = checksum(&config, sizeof config);
94+
95+
flash_unlock();
96+
97+
/* erase flash pages */
98+
flash_erase_page((uint32_t)dst);
99+
100+
/* write to flahs */
101+
while(count-- > 0) {
102+
flash_program_half_word((uint32_t)dst, *src++);
103+
dst++;
104+
}
105+
106+
return 0;
107+
}
108+
109+
int
110+
config_recall(void)
111+
{
112+
config_t *src = save_config_area;
113+
void *dst = &config;
114+
115+
if (src->magic != CONFIG_MAGIC)
116+
return -1;
117+
if (checksum(src, sizeof(config_t)) != 0)
118+
return -1;
119+
120+
/* duplicated saved data onto sram to be able to modify marker/trace */
121+
memcpy(dst, src, sizeof(config_t));
122+
return 0;
123+
}
124+
79125
#define SAVEAREA_MAX 5
80126

81127
const uint32_t saveareas[] =
82128
{ 0x08018800, 0x0801a000, 0x0801b800, 0x0801d000, 0x0801e8000 };
83129

84-
#define FLASH_PAGESIZE 0x800
85-
86130
int16_t lastsaveid = 0;
87131

88132

main.c

+22-13
Original file line numberDiff line numberDiff line change
@@ -156,14 +156,21 @@ static void cmd_dac(BaseSequentialStream *chp, int argc, char *argv[])
156156
int value;
157157
if (argc != 1) {
158158
chprintf(chp, "usage: dac {value(0-4095)}\r\n");
159+
chprintf(chp, "current value: %d\r\n", config.dac_value);
159160
return;
160161
}
161162
value = atoi(argv[0]);
163+
config.dac_value = value;
162164
dacPutChannelX(&DACD2, 0, value);
163165
}
164166

165-
166-
167+
static void cmd_saveconfig(BaseSequentialStream *chp, int argc, char *argv[])
168+
{
169+
(void)argc;
170+
(void)argv;
171+
config_save();
172+
chprintf(chp, "Config saved.\r\n");
173+
}
167174

168175
static struct {
169176
int16_t rms[2];
@@ -1290,6 +1297,7 @@ static const ShellCommand commands[] =
12901297
{ "offset", cmd_offset },
12911298
{ "time", cmd_time },
12921299
{ "dac", cmd_dac },
1300+
{ "saveconfig", cmd_saveconfig },
12931301
{ "data", cmd_data },
12941302
{ "dump", cmd_dump },
12951303
{ "frequencies", cmd_frequencies },
@@ -1325,7 +1333,7 @@ static const I2CConfig i2ccfg = {
13251333
0
13261334
};
13271335

1328-
static const DACConfig dac1cfg1 = {
1336+
static DACConfig dac1cfg1 = {
13291337
//init: 2047U,
13301338
init: 1922U,
13311339
datamode: DAC_DHRM_12BIT_RIGHT
@@ -1338,15 +1346,6 @@ int main(void)
13381346

13391347
chMtxObjectInit(&mutex);
13401348

1341-
/*
1342-
* Starting DAC1 driver, setting up the output pin as analog as suggested
1343-
* by the Reference Manual.
1344-
*/
1345-
//palSetPadMode(GPIOA, 5, PAL_MODE_INPUT_ANALOG);
1346-
//palSetPadMode(GPIOA, 5, PAL_MODE_OUTPUT_PUSHPULL);
1347-
//palSetPadMode(GPIOA, 5, PAL_MODE_INPUT);
1348-
dacStart(&DACD2, &dac1cfg1);
1349-
13501349
//palSetPadMode(GPIOB, 8, PAL_MODE_ALTERNATE(1) | PAL_STM32_OTYPE_OPENDRAIN);
13511350
//palSetPadMode(GPIOB, 9, PAL_MODE_ALTERNATE(1) | PAL_STM32_OTYPE_OPENDRAIN);
13521351
i2cStart(&I2CD1, &i2ccfg);
@@ -1380,7 +1379,17 @@ int main(void)
13801379
*/
13811380
plot_init();
13821381

1383-
/* restore config and calibration data from flash memory */
1382+
/* restore config */
1383+
config_recall();
1384+
1385+
dac1cfg1.init = config.dac_value;
1386+
/*
1387+
* Starting DAC1 driver, setting up the output pin as analog as suggested
1388+
* by the Reference Manual.
1389+
*/
1390+
dacStart(&DACD2, &dac1cfg1);
1391+
1392+
/* restore frequencies and calibration properties from flash memory */
13841393
caldata_recall(0);
13851394

13861395
/* initial frequencies */

nanovna.h

+3
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,9 @@ extern properties_t current_props;
275275
int caldata_save(int id);
276276
int caldata_recall(int id);
277277

278+
int config_save(void);
279+
int config_recall(void);
280+
278281
/*
279282
* ui.c
280283
*/

ui.c

+16-12
Original file line numberDiff line numberDiff line change
@@ -354,10 +354,14 @@ menu_calop_cb(int item)
354354
static void
355355
menu_caldone_cb(int item)
356356
{
357+
extern const menuitem_t menu_save[];
358+
extern const menuitem_t menu_cal[];
357359
(void)item;
358360
cal_done();
359361
draw_cal_status();
360362
menu_move_back();
363+
menu_push_submenu(menu_cal);
364+
menu_push_submenu(menu_save);
361365
}
362366

363367
static void
@@ -550,10 +554,21 @@ const menuitem_t menu_calop[] = {
550554
{ MT_NONE, NULL, NULL } // sentinel
551555
};
552556

557+
const menuitem_t menu_save[] = {
558+
{ MT_CALLBACK, "0", menu_save_cb },
559+
{ MT_CALLBACK, "1", menu_save_cb },
560+
{ MT_CALLBACK, "2", menu_save_cb },
561+
{ MT_CALLBACK, "3", menu_save_cb },
562+
{ MT_CALLBACK, "4", menu_save_cb },
563+
{ MT_CANCEL, "BACK", NULL },
564+
{ MT_NONE, NULL, NULL } // sentinel
565+
};
566+
553567
const menuitem_t menu_cal[] = {
554568
{ MT_CALLBACK, "RESET", menu_cal2_cb },
555569
{ MT_CALLBACK, "OFF", menu_cal2_cb },
556570
{ MT_CALLBACK, "ON", menu_cal2_cb },
571+
{ MT_SUBMENU, "SAVE", menu_save },
557572
{ MT_CANCEL, "BACK", NULL },
558573
{ MT_NONE, NULL, NULL } // sentinel
559574
};
@@ -621,7 +636,7 @@ const menuitem_t menu_stimulus[] = {
621636
{ MT_CALLBACK, "STOP", menu_stimulus_cb },
622637
{ MT_CALLBACK, "CENTER", menu_stimulus_cb },
623638
{ MT_CALLBACK, "SPAN", menu_stimulus_cb },
624-
{ MT_CALLBACK, "CW", menu_stimulus_cb },
639+
{ MT_CALLBACK, "CW FREQ", menu_stimulus_cb },
625640
{ MT_CALLBACK, "PAUSE", menu_stimulus_cb },
626641
{ MT_CANCEL, "BACK", NULL },
627642
{ MT_NONE, NULL, NULL } // sentinel
@@ -657,23 +672,12 @@ const menuitem_t menu_recall[] = {
657672
{ MT_NONE, NULL, NULL } // sentinel
658673
};
659674

660-
const menuitem_t menu_save[] = {
661-
{ MT_CALLBACK, "0", menu_save_cb },
662-
{ MT_CALLBACK, "1", menu_save_cb },
663-
{ MT_CALLBACK, "2", menu_save_cb },
664-
{ MT_CALLBACK, "3", menu_save_cb },
665-
{ MT_CALLBACK, "4", menu_save_cb },
666-
{ MT_CANCEL, "BACK", NULL },
667-
{ MT_NONE, NULL, NULL } // sentinel
668-
};
669-
670675
const menuitem_t menu_top[] = {
671676
{ MT_SUBMENU, "DISPLAY", menu_display },
672677
{ MT_SUBMENU, "MARKER", menu_marker },
673678
{ MT_SUBMENU, "STIMULUS", menu_stimulus },
674679
{ MT_CALLBACK, "CAL", menu_cal_cb },
675680
{ MT_SUBMENU, "RECALL", menu_recall },
676-
{ MT_SUBMENU, "SAVE", menu_save },
677681
{ MT_CLOSE, "CLOSE", NULL },
678682
{ MT_NONE, NULL, NULL } // sentinel
679683
};

0 commit comments

Comments
 (0)