Пн мар 11, 2019 12:47:27
Ср мар 24, 2021 12:16:04
// Чтение из флеш памяти от adr_start, до adr_end в массив ID_RKU_R
// Значения adr_start и adr_end должны быть кратны 2, и adr_start должно быть меньше adr_end
void Read_FLASH_MEMORY(unsigned int adr_start, unsigned int adr_end)
{
unsigned short *Flash_ptr = (unsigned short *)adr_start;// Начальный адрес флэш-памяти
unsigned int d0;
if ((adr_start < adr_end) && ((adr_end-adr_start) != 1)) // Защита от дурака
{
for (d0=0; d0<=(adr_end-adr_start)/2; d0++)
{
unsigned int a = adr_start+(d0*2); // Адрес ячейки памяти = "a"
*Flash_ptr = a; // Указываем на адрес ячейки памяти Flash_ptr откуда нужно читать
ID_RKU_R[d0] = *Flash_ptr; // Читаем в "ID_RKU[d0]" данные хранящиеся в ячейке памяти "Flash_ptr"
}
}
}
// Запись во флеш память от adr_start, до adr_end массив данных flash_data
// Значения adr_start и adr_end должны быть кратны 2, и adr_start должно быть меньше adr_end
void Write_FLASH_MEMORY(unsigned int adr_start, unsigned int adr_end)
{
unsigned short *Flash_ptr = (unsigned short *)adr_start;// Начальный адрес флэш-памяти
unsigned int d0;
__disable_interrupt(); // Глобальное запрещение прерываний
if ((adr_start < adr_end) && ((adr_end-adr_start) != 1)) // Защита от дурака
{
for (d0=0; d0<=(adr_end-adr_start)/2; d0++)
{
FCTL3 = FWKEY; // Снимаем блокирующий бит
FCTL1 = FWKEY + ERASE; // Разрешаем стирание
*Flash_ptr = 0; // Фиктивная запись для стирания флеш-сегмента
FCTL1 = FWKEY + WRT; // Установить бит WRT для операции записи
*Flash_ptr = flash_data[d0];// Записываем значение flash_data во флеш память с адресом Flash_ptr
FCTL1 = FWKEY; // Сбросить бит записи
FCTL3 = FWKEY + LOCK; // Устанавливаем бит блокировки
ID_RKU_W[d0] = *Flash_ptr; // Читаем в "ID_RKU[d0]" значение "flash_data" хранящееся в "Flash_ptr" (проверка)
*Flash_ptr++;
}
}
__enable_interrupt(); // Глобальное разрешение прерываний
}
Read_FLASH_MEMORY(0x8000, 0x8400);
Write_FLASH_MEMORY(0xA000, 0xA400);
Ср мар 24, 2021 23:35:44
Чт мар 25, 2021 13:14:26
Пн мар 29, 2021 11:17:43
unsigned short *Flash_ptr = (unsigned short *)0x8000;// Начальный адрес флэш-памяти
/**
* main.c
*/
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
FCTL3 = FWKEY; // Снимаем блокирующий бит
FCTL1 = FWKEY + ERASE; // Разрешаем стирание
*Flash_ptr = 0; // Фиктивная запись для стирания флеш-сегмента
FCTL1 = FWKEY + WRT; // Установить бит WRT для операции записи
*Flash_ptr = 0x4303;// Записываем значение flash_data во флеш память с адресом Flash_ptr (nop)
*Flash_ptr++;
*Flash_ptr = 0x1300;// Записываем значение flash_data во флеш память с адресом Flash_ptr (reti)
FCTL1 = FWKEY; // Сбросить бит записи
FCTL3 = FWKEY + LOCK; // Устанавливаем бит блокировки
//__asm (" MOV.W #0x8000,R15 ");
//__asm (" CALL &R15");
$0x8000:
((void(*)() )0x8000)(); // Переход по адресу 0х8000
__no_operation();
__no_operation();
__no_operation();
__no_operation();
__no_operation();
goto $0x8000;