ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
28 ноября
190276
replicater (18.04.2010 10:14, просмотров: 4115)
MSP430F2274 - Не удается записать в SegmentB при частоте ядра 16 Мгц (SMCLK). которую получаю из опорного кварца 32768 Гц (LFXT1), подав на DCO. С MSP430 работал 5 лет назад потому всех тонкостей не помню. Для программирования использую код: void Flash_wb( char *Data_ptr, char byte ) { FCTL3 = FWKEY; /* Lock = 0 */ FCTL1 = FWKEY + WRT; /* WRT = 1 */ *Data_ptr=byte; /* program Flash word */ FCTL1 = FWKEY; /* WRT = 0 */ FCTL3 = FWKEY + LOCK; /* Lock = 1 */ } void Flash_clr( int *Data_ptr) { FCTL3 = FWKEY; /* Lock = 0 */ FCTL1 = FWKEY + ERASE; /* ERASE = 1 */ *Data_ptr=0; /* program Flash word */ FCTL1 = FWKEY; /* ERASE = 0 */ FCTL3 = FWKEY + LOCK; /* Lock = 1 */ } // объявление области, куда пишем #pragma memory = constseg(INFOB) static const char Dat[]={255}; #pragma memory = default // сохранение void flash_save() { char temp; char *to, *from; __bic_SR_register(GIE); temp = IE1; IE1 = 0; to = (char*)Dat; from = (char*)&option; Flash_clr((int*)to); option.angSens = angSens; option.volume = volume; option.bandPass = bandPass; option.magic = 221; option.fake = 255; for (char i = 0; i < sizeof(option); i++, to++, from++) Flash_wb(to, *from); IE1 = temp; __bis_SR_register(GIE); } // загрузка настроек void flash_load() { char *to, *from; to = (char*)&option; from = (char*)Dat; for (char i = 0; i < sizeof(option); i++, to++, from++) *to = *from; if (option.magic == 221) { angSens = option.angSens; volume = option.volume; bandPass = option.bandPass; } else { angSens = 21; volume = 8; bandPass = 0; option.angSens = angSens; option.volume = volume; option.bandPass = bandPass; } } При отладке (использую ez430-F2013), в области INFO - данные поменялись. МК не зависает, не сбрасывается, продолжает работать. После сброса МК, видно, что значения вычитываются как 0xff. При частоте ядра 8МГц все отрабатывает корректно. Данные пишутся, читаются. Понимаю, что нужно понизить тактовую, но почему? Ведь при записи во флэш, ядро переходит в idle режим и ждет окончания записи.