From 3c6450b9d4da78fed9317f6b6cc84d89d98aa7e1 Mon Sep 17 00:00:00 2001 From: eddyem Date: Fri, 6 Feb 2015 14:23:56 +0300 Subject: [PATCH] fixed errors in flash write module --- with_opencm3/README | 2 + with_opencm3/flash.c | 85 +++++++++++++++------------------- with_opencm3/flash.h | 12 +++-- with_opencm3/hardware_ini.c | 1 + with_opencm3/ircontroller.bin | Bin 18472 -> 20960 bytes with_opencm3/main.c | 3 +- with_opencm3/main.h | 1 - with_opencm3/user_proto.c | 47 ++++++++++++++++--- 8 files changed, 88 insertions(+), 63 deletions(-) diff --git a/with_opencm3/README b/with_opencm3/README index a70646d..783cfce 100644 --- a/with_opencm3/README +++ b/with_opencm3/README @@ -3,6 +3,8 @@ First PCB have been prodused, so I need "only" to solder elements & finish the c Pinout of MCU is in file schematics/STM32_PINS +USE FUNCTION rat() in GNU/octave to calculate rational approximation to ADC conversion coefficients + -- OLD -- diff --git a/with_opencm3/flash.c b/with_opencm3/flash.c index 2f26838..c112022 100644 --- a/with_opencm3/flash.c +++ b/with_opencm3/flash.c @@ -21,6 +21,7 @@ #include "flash.h" #include +#include /* * this is a default values of stored data @@ -29,13 +30,29 @@ */ #define FLASH_BLOCK_SIZE (2048) #define FLASH_WRONG_DATA_WRITTEN 0x80 +/* + .bss._flash_buffer + 0x20001000 0x800 mk/flash.o + 0x20001000 _flash_buffer +*/ -const uint8_t _flash_buffer[FLASH_BLOCK_SIZE] __attribute__ ((aligned(FLASH_BLOCK_SIZE))); +//const uint8_t _flash_buffer[FLASH_BLOCK_SIZE] __attribute__ ((aligned(FLASH_BLOCK_SIZE))); +const flash_data Stored_Data __attribute__ ((aligned(FLASH_BLOCK_SIZE))) = { + //.magick = FLASH_MAGICK, + ._ADC_multipliers = {100000,100000,100000,100000,100000,100000,100000,100000, // TRD + 26, // shutter + 2 // power + }, + ._ADC_divisors = {1,1,1,1,1,1,1,1, // TRD + 25, // shutter + 7 // power + } +}; /** * these are default values * they can be changed in runtime to change data stored in flash - */ + * flash_data Default_stored_data = { .magick = FLASH_MAGICK, ._ADC_multipliers = {100000,100000,100000,100000,100000,100000,100000,100000, // TRD @@ -48,49 +65,28 @@ flash_data Default_stored_data = { } }; -flash_data *Stored_Data = (flash_data*) _flash_buffer; +*/ +//flash_data *Stored_Data = (flash_data*) _flash_buffer; -uint32_t flash_write_data(uint8_t *var, uint8_t *data, uint16_t datalen){ - uint32_t start_address = (uint32_t)var, page_address = (uint32_t)Stored_Data; - uint32_t *dataptr = (uint32_t*)data; +uint32_t flash_write_data(uint32_t *dataptr, uint16_t datalen){ + uint32_t start_address = (uint32_t)&Stored_Data; uint16_t i, rem; uint32_t ret = 0; - // check start address - it should be inside - if((start_address - page_address) >= FLASH_BLOCK_SIZE){ -// DBG("bad starting address\n"); - return 1; - } - flash_unlock(); + DBG("erase\n"); //Erasing page - flash_erase_page(page_address); -//DBG("erase flash "); -/* if(FLASH_SR_EOP != (ret = flash_get_status_flags())) - goto endoffunction; -*/ -//DBG("OK\nwrite"); + flash_erase_page(start_address); rem = datalen % 4; // remainder datalen /= 4; // round to 4 -/* -print_int(datalen, lastsendfun); -DBG(" blocks of 4 bytes\n"); -*/ // copy data by blocks of four for(i = 0; i < datalen; i++, dataptr++, start_address += 4){ // write data word flash_program_word(start_address, *dataptr); -/* if(FLASH_SR_EOP != (ret = flash_get_status_flags())) - goto endoffunction; -*/ //verify + //verify if(*((uint32_t*)start_address) != *dataptr){ ret = FLASH_WRONG_DATA_WRITTEN; goto endoffunction; } -/* -DBG("Written: "); -print_int((int32_t)(uint32_t*)dataptr, lastsendfun); -lastsendfun('\n'); -*/ } // remainder if(rem){ @@ -100,8 +96,6 @@ lastsendfun('\n'); if(rem == 3){ halfwords[1] = *((uint8_t*)dataptr+3); n = 2;} for(i = 0; i < n; i++, start_address += 2){ flash_program_half_word(start_address, halfwords[i]); - if(FLASH_SR_EOP != (ret = flash_get_status_flags())) - goto endoffunction; //verify if(*((uint16_t*)start_address) != halfwords[i]){ ret = FLASH_WRONG_DATA_WRITTEN; @@ -109,25 +103,20 @@ lastsendfun('\n'); } } } + DBG("ok written\n"); endoffunction: flash_lock(); -/* -DBG("end, status: "); -print_int(ret, lastsendfun); -lastsendfun('\n'); -*/ return ret; } - -/** - * checks magick in start of data block and fill block with default data - * if flash is uninitialized - */ -uint32_t check_flash_data(){ - if(Stored_Data->magick == FLASH_MAGICK) return 0; - DBG("copy data\n"); - return flash_write_data((uint8_t*)Stored_Data, (uint8_t*)&Default_stored_data, sizeof(flash_data)); +uint32_t flash_store_U32(uint32_t addr, uint32_t *data){ + flash_data Saved_Data; + uint32_t sz, ptrdiff; + sz = (uint32_t)&Stored_Data.last_addr - (uint32_t)&Stored_Data; + ptrdiff = addr - (uint32_t)&Stored_Data; + memcpy((void*)&Saved_Data, (void*)&Stored_Data, sz); + memcpy((void*)((uint32_t)&Saved_Data + ptrdiff), (void*)data, 4); + return flash_write_data((uint32_t*)&Saved_Data, sz); } /** @@ -135,8 +124,8 @@ uint32_t check_flash_data(){ */ void dump_flash_data(sendfun s){ int i; - P("magick: ", s); - print_int(Stored_Data->magick, s); +// P("magick: ", s); +// print_int(Stored_Data.magick, s); P("\nADC multipliers: ", s); for(i = 0; i < ADC_CHANNELS_NUMBER; i++){ if(i) P(", ", s); diff --git a/with_opencm3/flash.h b/with_opencm3/flash.h index 75bb3d9..d6b9874 100644 --- a/with_opencm3/flash.h +++ b/with_opencm3/flash.h @@ -29,18 +29,20 @@ #define FLASH_MAGICK ((uint32_t) 0xAA55A55A) typedef struct{ - uint32_t magick; // magick value + //uint32_t magick; // magick value // A-D value[x] = ADU * ADC_multipliers[x] / ADC_divisors[x] uint32_t _ADC_multipliers[ADC_CHANNELS_NUMBER]; uint32_t _ADC_divisors[ADC_CHANNELS_NUMBER]; + char last_addr[0]; + char struct_end[0] __attribute__ ((aligned(2048))); } flash_data; -extern flash_data *Stored_Data; +extern const flash_data Stored_Data; -#define ADC_multipliers Stored_Data->_ADC_multipliers -#define ADC_divisors Stored_Data->_ADC_divisors +#define ADC_multipliers Stored_Data._ADC_multipliers +#define ADC_divisors Stored_Data._ADC_divisors -uint32_t check_flash_data(); void dump_flash_data(sendfun s); +uint32_t flash_store_U32(uint32_t addr, uint32_t *data); #endif // __FLASH_H__ diff --git a/with_opencm3/hardware_ini.c b/with_opencm3/hardware_ini.c index 59806bc..38bb4af 100644 --- a/with_opencm3/hardware_ini.c +++ b/with_opencm3/hardware_ini.c @@ -234,6 +234,7 @@ int shutter_voltage(){ * 3.3V == 4096 ADU, 10..12V comes to ADC in through resistor divider 4.7k:12k, so * U10(V/100) = Uadc(ADU) * 167/47 * 33/40960 * 100 = Uadc(ADU) * 5511 / 19251 * ==> approximately this is equal to val*2/7 + * (real: approx 17/58) */ int power_voltage(){ uint32_t val = ADC_value[POWER_SENSE_NUMBER]; // 9 diff --git a/with_opencm3/ircontroller.bin b/with_opencm3/ircontroller.bin index a7fef30d1b202c7e0eb168edc8c4cbc7e2e8504e..8123110019b57f99fa111f8cb0099f29640b55ce 100755 GIT binary patch delta 7054 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 delta 6555 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 b9SCeHvm39PgcTunBSq#SGnw-(!s!11)q;kH diff --git a/with_opencm3/main.c b/with_opencm3/main.c index fe875e6..35186b4 100644 --- a/with_opencm3/main.c +++ b/with_opencm3/main.c @@ -31,7 +31,7 @@ usbd_device *usbd_dev; uint8_t ADC_monitoring = 0; // ==1 to make continuous monitoring -uint32_t ad7794_on = 0, flash_status = 1; +uint32_t ad7794_on = 0; uint32_t ad7794_values[TRD_NO]; uint8_t doubleconv = 1; // ==0 to single conversion; 1 to double (with currents reversing) #define ADC_direct() setup_AD7794(EXTREFIN_1 | REF_DETECTION | UNIPOLAR_CODING, IEXC_DIRECT | IEXC_1MA) @@ -175,7 +175,6 @@ int main(){ usb_connect(); // turn on USB shutter_init(); - flash_status = check_flash_data(); // init flash block if uninitialized while(1){ usbd_poll(usbd_dev); if(usbdatalen){ // there's something in USB buffer diff --git a/with_opencm3/main.h b/with_opencm3/main.h index 285142f..311fd96 100644 --- a/with_opencm3/main.h +++ b/with_opencm3/main.h @@ -55,7 +55,6 @@ extern uint32_t ad7794_values[]; // array with ADC data extern uint8_t doubleconv; // single/double ADC conversion extern uint32_t ad7794_on; // ==1 after AD7794 initialisation -extern uint32_t flash_status; // == 0 if flash OK, or == FLASH_SR/FLASH_SR2 extern uint8_t ADC_monitoring; // ==1 to make continuous monitoring void AD7794_init(); diff --git a/with_opencm3/user_proto.c b/with_opencm3/user_proto.c index 3a0db07..54fa6d2 100644 --- a/with_opencm3/user_proto.c +++ b/with_opencm3/user_proto.c @@ -23,6 +23,7 @@ #include "main.h" #include "uart.h" #include "hardware_ini.h" +#include "flash.h" // integer value given by user static volatile int32_t User_value = 0; @@ -71,20 +72,53 @@ void set_shtr_delay(int32_t v, sendfun s){ print_int(d, s); } + +int adc_channel = -1; +int div_mul = 0; // 0 - multip., !0 - div. +void ch_divmul(int32_t v, sendfun s){ + uint32_t val = (uint32_t) v; + if(adc_channel == -1) return; + if(div_mul){ // != 0 - divisors + flash_store_U32((uint32_t)&ADC_divisors[adc_channel], &val); + }else{ // == 0 - mul + flash_store_U32((uint32_t)&ADC_multipliers[adc_channel], &val); + } + adc_channel = -1; + P("stored\n", s); +} +/** + * Change divisor + * @param v - user value (sensor number) + * @param s - active sendfunction + */ +void try_ch_divmul(int32_t v, sendfun s){ + if(v > ADC_CHANNELS_NUMBER || v < 0){ + P("wrong channel number\n", s); + adc_channel = -1; + return; // error + } + adc_channel = v; + I = ch_divmul; + read_int(NULL, 0); //start reading next int +} + void parce_incoming_buf(char *buf, int len, sendfun s){ uint8_t command; + //uint32_t utmp; int i = 0, j, m; lastsendfun = s; if(Uval_ready == UVAL_START){ // we are in process of user's value reading i += read_int(buf, len); } if(Uval_ready == UVAL_ENTERED){ + P("confirm entered value (+/-): ", s); print_int(User_value, s); // printout readed integer value for error control Uval_ready = UVAL_PRINTED; } if(I && Uval_ready == UVAL_CHECKED){ Uval_ready = UVAL_BAD; // clear Uval_ready I(User_value, s); + return; } for(; i < len; i++){ command = buf[i]; @@ -201,15 +235,14 @@ void parce_incoming_buf(char *buf, int len, sendfun s){ dump_flash_data(s); break; case 'd': // change ADC_divisor - ; + div_mul = 1; //divisors + I = try_ch_divmul; + READINT(); break; case 'm': // change ADC_multiplier - ; - break; - case 'z': // temporary: refresh - flash_status = check_flash_data(); - print_int(flash_status, s); - s('\n'); + div_mul = 0; // multipliers + I = try_ch_divmul; + READINT(); break; case '\n': // show newline as is break;