Пт апр 06, 2012 21:23:20
Пт апр 06, 2012 22:45:09
Пт апр 06, 2012 23:47:30
Сб апр 07, 2012 11:37:43
Сб апр 07, 2012 12:54:01
demiurg301 писал(а):Подскажите где почитать про С для IAR
Сб апр 07, 2012 12:56:05
demiurg301 писал(а):В хелпе чото ничего нету... или не так ищу.
т.е. для avr я писал flash uint8_t P; - а тут как?
__flash не пашет... Хотя везде вроде так советуют...
Сб апр 07, 2012 13:34:25
Satyr писал(а):В кортекс-м3 фон нейманская архитектуры, в отличии от гарварда в АВР, тут работа с находящемся во флеше идет на равных с озу, никаких спец изысканий и специнструкций не надо.
Сб апр 07, 2012 13:53:29
demiurg301 писал(а):а как быть с eeprom?
Сб апр 07, 2012 14:00:49
Микроконтроллер STM32L152RBT6
Ядро Cortex-M3, 128 KB Flash, 16 KB RAM, 4 KB EEPROM
Сб апр 07, 2012 20:44:51
Сб апр 07, 2012 20:53:54
Пн апр 16, 2012 09:03:53
Пн апр 16, 2012 09:25:58
Пн апр 16, 2012 09:36:17
mvm писал(а):неужели что-то типа
GPIO.08=1;
не была бы читабельней?
Вопрос к знатокам: нафига такое городить? И бывает-ли проще (типа примера, что я привел)? Если да, то в где прочитать?
Пн апр 16, 2012 09:39:29
mvm писал(а):ткните носом где прочитать, что такое GPIO_BSRR_BS8 или RCC_APB2ENR_AFIOEN, даже не что такое, а где оно документировано? Ну не с неба же люди эти записи берут!
Пн апр 16, 2012 10:46:17
при старте дублируйте структуры в RAM, и записывайте обратно при необходимости, действия в общем элементарные, независимо от типа контроллераа как быть с eeprom?
Пн апр 16, 2012 11:11:54
Пн апр 16, 2012 11:29:46
для конфига хватит и страницы обычного флеша. А если и не хватит - тем лучше, клиент быстрее прибежит за ремонтом/заменойSatyr писал(а):Работать куда гибче, шустрее, ресурс выше
Пн апр 16, 2012 11:36:00
qwerky писал(а):для конфига хватит и страницы обычного флеша. А если и не хватит - тем лучше, клиент быстрее прибежит за ремонтом/заменойSatyr писал(а):Работать куда гибче, шустрее, ресурс выше
Пн апр 16, 2012 12:15:41
страницу еще можно поделить на куски равные размеру конфига, и выровненные по 4байтам, тогда можно стирать по заполнению всех кусков - количество циклов перезаписи сразу увеличится как для реального EEPROM.для сохранения ~200 байт данных, которые еще и переписываются не целиком, но довольно часто
#define FLASH_START_ADDR 0x08000000UL
#define FLASH_PAGE_SIZE 1024
#define FLASH_PAGES 16
#define FLASH_WORD_SIZE 4UL
#define FLASH_ERASED_STATE 0xFF
#define CONFIG_START_ADDR (FLASH_START_ADDR + ((FLASH_PAGES - 1) * FLASH_PAGE_SIZE))
#define CONFIG_WORDS (CONFIG_RECORD_SIZE / FLASH_WORD_SIZE)
#define CONFIG_RECORD_SIZE ((sizeof(config) + FLASH_WORD_SIZE - 1) & (~(FLASH_WORD_SIZE - 1)))
#define CONFIG_RECORDS (FLASH_PAGE_SIZE / CONFIG_RECORD_SIZE)
#define CONFIG_RECORD_ADDR(N) ((struct config_struct *)(CONFIG_START_ADDR + ((N) * CONFIG_RECORD_SIZE)))
U16 config_record;
//calculate config CRC
U16 config_calc_crc(void *addr) {
return crc16_modbus_buf((U8 *)addr, sizeof(config)-sizeof(config.crc), CRC16_MODBUS_INIT);
}
//check config validity
U8 config_check_crc(void *addr) {
return (((struct config_struct *)addr)->crc == config_calc_crc(addr));
}
//find last used (valid) record. If not found, returns 0xFFFF;
U16 config_last_record(void) {
struct config_struct *cfg = (void *)CONFIG_START_ADDR;
for (U16 i=0; i<CONFIG_RECORDS; i++) {
if (!config_check_crc(cfg)) return i - 1;
cfg++;
}
return CONFIG_RECORDS - 1;
}
//clear configuration (fill with default values)
void config_clear(void) {
memset(&config, 0, sizeof(config));
}
//read last valid configuration from EEPROM
U8 config_read(void) {
if (config_record == 0xFFFF) {
config_clear();
return 0;
} else {
config = *CONFIG_RECORD_ADDR(config_record);
return 1;
}
}
//write config to next record
void config_write(void) {
config.crc = config_calc_crc(&config);
FLASH_Unlock();
config_record++;
if (config_record >= CONFIG_RECORDS) {
config_record = 0;
FLASH_ErasePage(CONFIG_START_ADDR);
}
U32 *source_addr = (void *)&config;
U32 *dest_addr = (void *)CONFIG_RECORD_ADDR(config_record);
for (U16 i=0; i<CONFIG_WORDS; i++) {
FLASH_ProgramWord((U32 )dest_addr, *source_addr);
source_addr++;
dest_addr++;
}
FLASH_Lock();
}
void setup_config(void) {
config_record = config_last_record(); //find last record
config_read(); //read last record
}