From a54c3e3a66205209441bb9f6397b5c0b2ef76bba Mon Sep 17 00:00:00 2001 From: eddyem Date: Thu, 5 Feb 2015 13:26:50 +0300 Subject: [PATCH] added flash support --- with_opencm3/README | 2 +- with_opencm3/flash.c | 151 ++++++++++++++++++++++++++++++++++ with_opencm3/flash.h | 46 +++++++++++ with_opencm3/hardware_ini.c | 20 +++-- with_opencm3/hardware_ini.h | 4 +- with_opencm3/ircontroller.bin | Bin 15804 -> 18472 bytes with_opencm3/main.c | 6 +- with_opencm3/main.h | 4 + with_opencm3/user_proto.c | 16 +++- 9 files changed, 231 insertions(+), 18 deletions(-) create mode 100644 with_opencm3/flash.c create mode 100644 with_opencm3/flash.h diff --git a/with_opencm3/README b/with_opencm3/README index d7d934b..a70646d 100644 --- a/with_opencm3/README +++ b/with_opencm3/README @@ -1,7 +1,7 @@ The work begins First PCB have been prodused, so I need "only" to solder elements & finish the code -Pinout of MCI is in file schematics/STM32_PINS +Pinout of MCU is in file schematics/STM32_PINS -- OLD -- diff --git a/with_opencm3/flash.c b/with_opencm3/flash.c new file mode 100644 index 0000000..2f26838 --- /dev/null +++ b/with_opencm3/flash.c @@ -0,0 +1,151 @@ +/* + * flash.c - functions to work with STM32 flash memory + * + * Copyright 2015 Edward V. Emelianov + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + +#include "flash.h" +#include + +/* + * this is a default values of stored data + * they could be changed by appropriate command + * align by 2k & make size 2k for using with high density devices + */ +#define FLASH_BLOCK_SIZE (2048) +#define FLASH_WRONG_DATA_WRITTEN 0x80 + +const uint8_t _flash_buffer[FLASH_BLOCK_SIZE] __attribute__ ((aligned(FLASH_BLOCK_SIZE))); + +/** + * 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 + 26, // shutter + 2 // power + }, + ._ADC_divisors = {1,1,1,1,1,1,1,1, // TRD + 25, // shutter + 7 // power + } +}; + +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; + 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(); + //Erasing page + flash_erase_page(page_address); +//DBG("erase flash "); +/* if(FLASH_SR_EOP != (ret = flash_get_status_flags())) + goto endoffunction; +*/ +//DBG("OK\nwrite"); + 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 + 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){ + uint16_t halfwords[2] = {0,0}, n = 1; + if(rem == 1) halfwords[0] = *((uint8_t*)dataptr); + else halfwords[0] = *((uint16_t*)dataptr); + 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; + goto endoffunction; + } + } + } +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)); +} + +/** + * printout all data stored in flash + */ +void dump_flash_data(sendfun s){ + int i; + 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); + print_int(ADC_multipliers[i], s); + } + P("\nADC divisors: ", s); + for(i = 0; i < ADC_CHANNELS_NUMBER; i++){ + if(i) P(", ", s); + print_int(ADC_divisors[i], s); + } + s('\n'); +} diff --git a/with_opencm3/flash.h b/with_opencm3/flash.h new file mode 100644 index 0000000..75bb3d9 --- /dev/null +++ b/with_opencm3/flash.h @@ -0,0 +1,46 @@ +/* + * flash.h + * + * Copyright 2015 Edward V. Emelianov + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + +#pragma once +#ifndef __FLASH_H__ +#define __FLASH_H__ + +#include "main.h" +#include "user_proto.h" + +#define FLASH_MAGICK ((uint32_t) 0xAA55A55A) + +typedef struct{ + 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]; +} flash_data; + +extern flash_data *Stored_Data; + +#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); + +#endif // __FLASH_H__ diff --git a/with_opencm3/hardware_ini.c b/with_opencm3/hardware_ini.c index 1885d68..59806bc 100644 --- a/with_opencm3/hardware_ini.c +++ b/with_opencm3/hardware_ini.c @@ -28,8 +28,8 @@ #include "main.h" #include "hardware_ini.h" #include "onewire.h" +#include "flash.h" -#define ADC_CHANNELS_NUMBER 10 /* * Due to inconvenient pins position on STM32F103VxT6 I had to make this strange location: * my channel # -> ADC1/2 channel # @@ -223,9 +223,10 @@ void ADC_calibrate_and_start(){ * ==> approximately this is equal to val*26/25 or val + val/25 */ int shutter_voltage(){ - int val = SHUTTER_SENSE_VALUE; - val += val/25; - return val; + uint32_t val = ADC_value[SHUTTER_SENSE_NUMBER]; // 8 + val *= ADC_multipliers[SHUTTER_SENSE_NUMBER]; + val /= ADC_divisors[SHUTTER_SENSE_NUMBER]; + return (int)val; } /** @@ -235,9 +236,10 @@ int shutter_voltage(){ * ==> approximately this is equal to val*2/7 */ int power_voltage(){ - int val = POWER_SENSE_VALUE * 2; - val /= 7; - return val; + uint32_t val = ADC_value[POWER_SENSE_NUMBER]; // 9 + val *= ADC_multipliers[POWER_SENSE_NUMBER]; + val /= ADC_divisors[POWER_SENSE_NUMBER]; + return (int)val; } /** @@ -248,8 +250,8 @@ int power_voltage(){ */ int TRD_value(uint8_t num){ uint32_t v = ADC_value[num]; - uint32_t r = 100000 * v; - r /= (uint32_t)(4096 - v); + uint32_t r = v * ADC_multipliers[num]; + r /= (uint32_t)(4096 - v) * ADC_divisors[num]; return (int) r; } diff --git a/with_opencm3/hardware_ini.h b/with_opencm3/hardware_ini.h index e6c14db..cea53de 100644 --- a/with_opencm3/hardware_ini.h +++ b/with_opencm3/hardware_ini.h @@ -128,8 +128,8 @@ void ADC_calibrate_and_start(); #define SHUTTER_OP_DELAY (200) // ADC_value[8] is U36, ADC_value[9] is U10 -#define SHUTTER_SENSE_VALUE (ADC_value[8]) -#define POWER_SENSE_VALUE (ADC_value[9]) +#define SHUTTER_SENSE_NUMBER (8) +#define POWER_SENSE_NUMBER (9) int shutter_voltage(); int power_voltage(); int TRD_value(uint8_t num); diff --git a/with_opencm3/ircontroller.bin b/with_opencm3/ircontroller.bin index 268f998677b595286da953a94fb87ad476060ce3..a7fef30d1b202c7e0eb168edc8c4cbc7e2e8504e 100755 GIT binary patch delta 8367 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 delta 5803 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 diff --git a/with_opencm3/main.c b/with_opencm3/main.c index bdf43c5..fe875e6 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; +uint32_t ad7794_on = 0, flash_status = 1; 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,6 +175,7 @@ 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 @@ -200,8 +201,7 @@ int main(){ if(Timer - Old_timer > 999){ // one-second cycle Old_timer += 1000; - if(Shutter_State == SHUTTER_NOTREADY) - shutter_init(); + // if(Shutter_State == SHUTTER_NOTREADY) shutter_init(); //OW_fill_ID(0); //gpio_toggle(GPIOC, GPIO12); // toggle LED //gpio_toggle(GPIO_BANK_SPI2_MOSI, GPIO_SPI2_MOSI); diff --git a/with_opencm3/main.h b/with_opencm3/main.h index 7af7ddd..285142f 100644 --- a/with_opencm3/main.h +++ b/with_opencm3/main.h @@ -37,7 +37,10 @@ #include #include +#define ADC_CHANNELS_NUMBER (10) + #include "sync.h" // mutexes +#include "flash.h" #include "user_proto.h" #include "AD7794.h" #include "onewire.h" @@ -52,6 +55,7 @@ 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 2a64c02..3a0db07 100644 --- a/with_opencm3/user_proto.c +++ b/with_opencm3/user_proto.c @@ -197,9 +197,19 @@ void parce_incoming_buf(char *buf, int len, sendfun s){ case 'o': // open shutter try_to_open_shutter(); break; - case 'z': // temporary: change delay - I = set_shtr_delay; - READINT(); + case 'F': // dump flash data + dump_flash_data(s); + break; + case 'd': // change ADC_divisor + ; + break; + case 'm': // change ADC_multiplier + ; + break; + case 'z': // temporary: refresh + flash_status = check_flash_data(); + print_int(flash_status, s); + s('\n'); break; case '\n': // show newline as is break;