И так, задача: МК перезаписывает свою флеш. Здесь все функции RAM. Стирание всей флеши и запись первого байта (ПРОВЕРЕНО, МК ВИСНЕТ ИМЕННО ПОСЛЕ ЗАПИСИ 1го байта) дают зависание, вот код, помогите пожалуйста...
void Ram_Func_Program_Flash (void) { _DINT(); IE1 &= ~BIT0;//asm ("clr.b &0") ; // 0 = IE1 блокировка NMI, ACCV и OF прерываний UINT8 Buffer_1_Byte; // Стереть сразу всю флеш WDTCTL = WDTPW + WDTHOLD; // Выключим WDT //FCTL2 = ( FWKEY | FSSEL_1 | 16 ); // частота тактового генератора flash FCTL2 = ( FWKEY | FSSEL_1 | 16 ); // частота тактового генератора flash FCTL3 = FWKEY; // очистим LOCK разрешим программирование-стирание FCTL1 = FWKEY | MERAS; // Стереть сразу всю флеш *(UINT16*)(0x4000 ) = 0; // фиктивная запись для запуска процедуры стирания сегмента while ( (FCTL3 & BIT0)==1 ) _NOP(); //wait while busy flag is 1 FCTL3 = FWKEY | LOCK; // выполнено, установим LOCK обратно for (UINT8 Block_Num=0; Block_Num<6; Block_Num++) { //Пришла команда, // Пишем блоки со 2-го по шестой // использльзовать в RAM доступ к плис, ram-версия драйвера плис // Вычитываем из плис 8КБ данных и побайтно пишем их в // блоки, предварительно их стирая // использльзовать в RAM доступ к плис, ram-версия методов записи и чтения драйвера плис for (UINT16 i = 0; i <= 8192 - 1; i++) // Читаем из BAR1 очередную порцию(8К) от прошивки {
Buffer_1_Byte = Read_From_FPGA_Byte_RAM_Ptr_Global(DPM_MEMORY_WINDOW_OFFSET +offsetof( DPM_DATA_PACKET, ExtData) +offsetof (DPM_TM_WRITE_MEM_IN,Data) + i ); FCTL2 = ( FWKEY | FSSEL_1 | 16 ); // частота тактового генератора flash FCTL3 = FWKEY; // очистим LOCK разрешим программирование-стирание FCTL1 = FWKEY | WRT; // разрешение записи *(BYTE*)(0x4000 + Block_Num*8192 + i) = Buffer_1_Byte; // пишем байт //<------------------------------(ПРОВЕРЕНО, МК ВИСНЕТ ИМЕННО ПОСЛЕ ЗАПИСИ 1го байта) while ( (FCTL3 & BIT0)==1 ) _NOP(); //wait while busy flag is 1 FCTL1 = FWKEY; // выполнено, очистка WRT FCTL3 = FWKEY | LOCK; // выполнено, установим LOCK обратно } Write_To_FPGA_Byte_RAM_Ptr_Global(DPM_MEMORY_WINDOW_OFFSET + offsetof(DPM_DATA_PACKET, byExtDataStructType) ,EST_NONE); Write_To_FPGA_Byte_RAM_Ptr_Global(DPM_MEMORY_WINDOW_OFFSET ,DPM_STATUS_OK); // Выдать IRQ через ПЛИС к PCI-E Write_To_FPGA_Byte_RAM_Ptr_Global(DPM_CPU_INTERRUPT_ADDR, COMMAND_PROGRAMM_MCU_FLASH + Block_Num + 1); // Ожидание инкремнированной команды UINT8 Com = Read_From_FPGA_Byte_RAM_Ptr_Global(DPM_MCU_INTERRUPT_ADDR); while (Com != COMMAND_PROGRAMM_MCU_FLASH + Block_Num ) Com = Read_From_FPGA_Byte_RAM_Ptr_Global(DPM_MCU_INTERRUPT_ADDR); } [size=1] Спасибо Вам!
Сообщение отредактировал Bom_Shankar - Nov 6 2007, 13:58
|