|
запись во флеш/чтение на atxmega32d4, +IAR |
|
|
|
Oct 20 2012, 13:36
|
Знающий
   
Группа: Участник
Сообщений: 679
Регистрация: 9-08-06
Пользователь №: 19 422

|
Здравствуйте Пытаюсь использовать код от Атмела под ИАР для записи/чения флеш памяти К сожалению чтото не выходит на этапе загрузчи буфера все виснет Вот мой код Код #include "sp_driver.h" /* Temporary storage used for NVM-workaround. */ uint8_t sleepCtr; uint8_t statusStore; uint8_t pmicStore; uint8_t globalInt; uint8_t spmintStore; unsigned short y;
#pragma vector = NVM_SPM_vect __interrupt void NVM_SPM_vectint(void) { /* Disable the SPM interrupt */ NVM.INTCTRL = (NVM.INTCTRL & ~NVM_SPMLVL_gm); /* Restore sleep settings */ SLEEP.CTRL = sleepCtr; /* Restore PMIC status and control registers */ PMIC.STATUS = statusStore; PMIC.CTRL = pmicStore; /* Restore SPM interruptsettings */ NVM.INTCTRL = spmintStore; /* Restore global interrupt settings */ SREG = globalInt; return; }
/* Temporary storage used for NVM-workaround. */
/* Set interrupt vector location to boot section of flash */ void PMIC_SetVectorLocationToBoot( void ) { uint8_t temp = PMIC.CTRL | PMIC_IVSEL_bm; CCP = CCP_IOREG_gc; PMIC.CTRL = temp; }
/*Set interrupt vector location to application section of flash */ void PMIC_SetVectorLocationToApplication( void ) { uint8_t temp = PMIC.CTRL & ~PMIC_IVSEL_bm; CCP = CCP_IOREG_gc; PMIC.CTRL = temp; }
/* Save register settings before entering sleep mode */ void Prepare_to_Sleep( void ) { sleepCtr = SLEEP.CTRL; /* Set sleep mode to IDLE */ SLEEP.CTRL = 0x00; /* Save the PMIC Status and control registers */ statusStore = PMIC.STATUS; pmicStore = PMIC.CTRL; /* Enable only the highest level of interrupts */ PMIC.CTRL = (PMIC.CTRL & ~(PMIC_MEDLVLEN_bm | PMIC_LOLVLEN_bm)) | PMIC_HILVLEN_bm; /* Save SREG for later use */ globalInt = SREG; /* Enable global interrupts */ sei(); /* Save SPM interrupt settings for later */ spmintStore = NVM.INTCTRL; }
/* New function declarations used for the NVM-workaround */ void EraseApplicationPage(uint32_t address) { /*Set the correct settings and store critical registers before NVM-workaround*/ Prepare_to_Sleep(); /*Assembly "function" to preform page erase*/ SP_EraseApplicationPage(address); }
void EraseWriteApplicationPage(uint32_t address) { /*Set the correct settings and store critical registers before NVM-workaround*/ Prepare_to_Sleep(); /*Assembly "function" to preform page erase-write*/ SP_EraseWriteApplicationPage(address); }
void ClearFlashBuffer(void) { /*Set the correct settings and store critical registers before NVM-workaround*/ Prepare_to_Sleep(); /*Assembly "function" to erase flash buffer*/ SP_EraseFlashBuffer(); }
void LoadFlashWord(uint32_t address, uint16_t word) { /*Set the correct settings and store critical registers before NVM-workaround*/ Prepare_to_Sleep(); /*Assembly "function" to load flash buffer*/ SP_LoadFlashWord(address, word); }
void main()
{ __enable_interrupt(); PMIC_SetVectorLocationToBoot(); ClearFlashBuffer(); for(y=0;y<(128);y+=2) { LoadFlashWord(y,0xAAAA); SP_WaitForSPM(); } EraseWriteApplicationPage(16000); if(SP_ReadByte(0x3E00)==0x55) { PORTD_OUT |= 0x40; } for(;;) {} } Прошу подсказать что не так кто уже пользовал иаровский код Заранее благодарен
|
|
|
|
|
 |
Ответов
|
Oct 20 2012, 14:16
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(addi @ Oct 20 2012, 16:36)  Код for(y=0;y<(128);y+=2) { LoadFlashWord(y,0xAAAA); SP_WaitForSPM(); } EraseWriteApplicationPage(16000); if(SP_ReadByte(0x3E00)==0x55) { PORTD_OUT |= 0x40; } for(;;) {} } Что-то не понял смысла вашего кода... Вы пишете во flash начиная с адреса 16000(0x3E 80) числа 0xAAAA и потом надеетесь прочитать из 0x3E 00 0x55?
|
|
|
|
|
Oct 20 2012, 14:45
|
Знающий
   
Группа: Участник
Сообщений: 679
Регистрация: 9-08-06
Пользователь №: 19 422

|
Цитата(_Артём_ @ Oct 20 2012, 18:16)  Что-то не понял смысла вашего кода... Вы пишете во flash начиная с адреса 16000(0x3E80) числа 0xAAAA и потом надеетесь прочитать из 0x3E00 0x55? спасибо за поддержку Это результат постоянного корректирования кода, но к сожелению чтение флеш не дает ни AA ни 55, пробовал и так и так, все FF. Цитата(addi @ Oct 20 2012, 18:41)  спасибо за поддержку
Это результат постоянного корректирования кода, но к сожелению чтение флеш не дает ни AA ни 55, пробовал и так и так, все FF. попробовал на отладчике посмотреть где я останавливаюсь, оказаолось после кодманды SLEEP, т.е получается что я невыходу из слипа вследствии того что почемуто нет SP прерывания. В инииализации микроконтролера ставлю PMIC.CNTRL = 0x04 - приоритет только hi как требуется Не могу найти в мануале где влючаются непосредственно SP прерывания...
|
|
|
|
|
Oct 20 2012, 15:00
|
Знающий
   
Группа: Участник
Сообщений: 679
Регистрация: 9-08-06
Пользователь №: 19 422

|
Цитата(addi @ Oct 20 2012, 18:45)  спасибо за поддержку
Это результат постоянного корректирования кода, но к сожелению чтение флеш не дает ни AA ни 55, пробовал и так и так, все FF.
попробовал на отладчике посмотреть где я останавливаюсь, оказаолось после кодманды SLEEP, т.е получается что я невыходу из слипа вследствии того что почемуто нет SP прерывания. В инииализации микроконтролера ставлю PMIC.CNTRL = 0x04 - приоритет только hi как требуется Не могу найти в мануале где влючаются непосредственно SP прерывания... NVM.INTCTRL = (NVM.INTCTRL | NVM_SPMLVL_gm); в инициализации микроконтроллера тоже не выводит из сна ((( Цитата(addi @ Oct 20 2012, 18:55)  NVM.INTCTRL = (NVM.INTCTRL | NVM_SPMLVL_gm); в инициализации микроконтроллера тоже не выводит из сна ((( моя инициализация микроконтроллера Код unsigned h,n; //g=0; unsigned char k=0; OSC.XOSCCTRL=0x8b; OSC.CTRL =OSC_XOSCEN_bm; while (!(OSC.STATUS & OSC_XOSCRDY_bm) ); //////////////////////////////////////////// OSC.PLLCTRL = 0xC4; // Fcpu = 29.4912 Mhz OSC.CTRL = OSC.CTRL|0x10; // enable while((OSC.STATUS & 0x10) ==0); //////////////////////////////////////////// CCP = CCP_IOREG_gc; //CLK.CTRL =CLK_SCLKSEL_XOSC_gc; CLK.CTRL =CLK_SCLKSEL_PLL_gc; OSC.CTRL = OSC.CTRL & 0xFE; ///////////////////////////////////////////////// init_timer1(); PORTD_OUT &= ~0x40;
PMIC.CTRL = 0x04; //////////////// //////// PORTD_OUT &= ~0x40;
PORTE.DIR=0xff; PORTE_OUT = 0xff; PORTD_DIR |= 0xC0; PORTD_DIR |= 0x08; PORTD_OUT |= 0x80; PWM_init2(); NVM.INTCTRL = (NVM.INTCTRL | NVM_SPMLVL_gm); __enable_interrupt();
|
|
|
|
|
Oct 20 2012, 15:02
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(addi @ Oct 20 2012, 17:55)  NVM.INTCTRL = (NVM.INTCTRL | NVM_SPMLVL_gm); в инициализации микроконтроллера тоже не выводит из сна ((( Странно...попробуйте запустить какую-нибудь другую команды при настроенном прерывании NVM. Прерывания разрешены? Может проблемы с расположением бута? Там ли таблица векторов находится? Проект выложте - гадать можно долго.
|
|
|
|
|
Oct 20 2012, 15:15
|
Знающий
   
Группа: Участник
Сообщений: 679
Регистрация: 9-08-06
Пользователь №: 19 422

|
Цитата(_Артём_ @ Oct 20 2012, 19:02)  Странно...попробуйте запустить какую-нибудь другую команды при настроенном прерывании NVM. Прерывания разрешены? Может проблемы с расположением бута? Там ли таблица векторов находится?
Проект выложте - гадать можно долго. спасибо за поддержку, наверна все так как Вы говорите, потому как я ничего ни делал с бутом, тем более нигде никакие операции по его расположению не делал, потому что думал что стандартного xcl хватит Высылаю проект
Сообщение отредактировал addi - Oct 20 2012, 15:15
|
|
|
|
|
Oct 20 2012, 15:30
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(addi @ Oct 20 2012, 18:15)  ни делал с бутом, тем более нигде никакие операции по его расположению не делал, потому что думал что стандартного xcl хватит Но где-то должны быть настройки линкера для бута: стандарный xcl расположит код от 0. Посмотрите в отладчике по каким адресам таблица векторов и программа. Цитата(addi @ Oct 20 2012, 18:15)  Высылаю проект Открыть не получается - мои версии ИАРа видимо устарели (6.10).
|
|
|
|
|
Oct 20 2012, 15:40
|
Знающий
   
Группа: Участник
Сообщений: 679
Регистрация: 9-08-06
Пользователь №: 19 422

|
Цитата(_Артём_ @ Oct 20 2012, 19:30)  Но где-то должны быть настройки линкера для бута: стандарный xcl расположит код от 0. Посмотрите в отладчике по каким адресам таблица векторов и программа.
Открыть не получается - мои версии ИАРа видимо устарели (6.10). к сожалению в ИАРе опцию для задания бута не нашел, вероятно придется както редактировать сам xcl Проект более новый, у меня 6.12
|
|
|
|
|
Oct 20 2012, 15:46
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(addi @ Oct 20 2012, 18:40)  к сожалению в ИАРе опцию для задания бута не нашел, Думаю такой опции нет и никогда не было. Цитата(addi @ Oct 20 2012, 18:40)  вероятно придется както редактировать сам xcl Придётся...или взять готовый у Атмела или взять пример бута для другой xmeg-и и поменять адреса в соответствии с нужным размером flash. Цитата(addi @ Oct 20 2012, 18:40)  вероятно придется както редактировать сам xcl Проект более новый, у меня 6.12 Как-то получилось открыть ваш выходнойц файл в симуляторе... Программ расположена с 0, а вектора у вас переключаются на бут область. Значит самопрограммирование работать не будет - прошивка flash возможна только из области бута.
|
|
|
|
|
Oct 21 2012, 06:57
|
Знающий
   
Группа: Участник
Сообщений: 679
Регистрация: 9-08-06
Пользователь №: 19 422

|
Цитата(_Артём_ @ Oct 20 2012, 19:46)  Думаю такой опции нет и никогда не было.
Придётся...или взять готовый у Атмела или взять пример бута для другой xmeg-и и поменять адреса в соответствии с нужным размером flash.
Как-то получилось открыть ваш выходнойц файл в симуляторе... Программ расположена с 0, а вектора у вас переключаются на бут область. Значит самопрограммирование работать не будет - прошивка flash возможна только из области бута. никак не могу понять куда писать адресс бута в xcl файле, там даже такого примитива нет(..... Пожалуйста кто значет подскажите
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|