hex.pp.ua

Инициализация STM8. Option Bytes. Bootloader. EEPROM

Настройка работы микропрограммы STM8. Настройка Option Bytes, EEPROM и bootloader.




В этой заметке я упомяну некоторые особенности инициализации микроконтроллера STM8, которые оказывают влияние на всю программу в целом. Описанные приёмы относятся к компилятору Raisonance.

Частота, на которой работает микроконтроллер — важная вещь, от неё зависит, насколько быстро исполняется программа, энергопотребление устройства, работа с периферийными устройствами.

Частота

Микроконтроллер STM8 может брать частоту как из внутреннего источника, так и с внешнего кварцевого резонатора. В случае использования внутреннего источника максимальная частота работы микроконтроллера ограничена 16 МГц. Реальную частоту работы определяет ещё и предделитель. Предделитель можно настроить от 1 до 128.

/**
  * @brief Настройка тактовой частоты микроконтроллера
  * @par
  * Параметры отсутствуют
  * @retval
  * Возвращаемое значение отсутствует
*/
void Init_CPU(void)
{  
  // Сброс настроек
  CLK_DeInit();
  
  // Внутренний источник, 16 МГц  
  CLK_HSICmd(ENABLE);
  
  // предделитель может варьироваться от 1 до 8.
  // 8 = 2 МГц
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8);
}

В том случае, если используется внешний кварц, инициализация частоты микроконтроллера будет выглядеть так:

void Init_CPU(void)
{  
  u8 cnt = 0;
  CLK_DeInit();
  
  // Внешний источник, 20 МГц  
  CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);
  CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, 
                        DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE);
  
  // Ждать стабилизации частоты
  while (CLK_GetSYSCLKSource() != CLK_SOURCE_HSE)
  {
    if ( --cnt == 0 )
      return;
  }    
}

Часть с CLK_GetSYSCLKSource() является необязательной.

Следует помнить, что при задании внешней частоты программа сама не сможет определить, сколько МГц составляет эта частота. Где-то в программе нужно будет определить макрос HSE_VALUE, который будет содержать значение внешней частоты в Гц. Например, для 20 МГц:


#define HSE_VALUE ((u32)20000000)

Теперь это значение будет правильно возвращаться функцией CLK_GetClockFreq(), а эта функция используется при инициализации всей периферии. Если бы эта функция возвращала не то значение, периферия неправильно бы инициализировалась. Тогда перестанет правильно работать, к примеру, UART.

Проверить, правильно ли определяется текущая частота работы микроконтроллера можно так:

printf("Частота: %.3f МГц\r\n", ((float)CLK_GetClockFreq())/1000000.);

STM8 Option Bytes

В STM8 есть так называемые Option Bytes — настройки работы микроконтроллера, которые можно задавать при прошивке. Они располагаются в особой области памяти — в EEPROM. Обычно EEPROM доступна из программы только на чтение, так что менять option bytes можно только заранее, перед прошивкой. Однако, запись в EEPROM всё же можно разрешить, а значит, можно при необходимости, менять option byte прямо из программы.

EEPROM

Обычно, EEPROM используется для хранения констант, или для тех данных, которые должны сохраняться тогда, когда микроконтроллер отключен от питания. Слишком часто перезаписывать данные в EEPROM не стоит, так как у этого типа памяти ограничен ресурс перезаписи.

Первое, что надо сделать, это открыть запись в EEPROM. Делается это так:

  // Открыть возможность записи в EEPROM
  FLASH_DeInit();  
  FLASH_Unlock(FLASH_MEMTYPE_DATA); 

В EEPROM можно хранить собственные константы и переменные. Например, в обычных условиях, переменная, объявленная так:


u8 eeprom uBrightness = 0x10;
будет константой, изменить её нельзя. Однако, если возможность записи в EEPROM включена указанным выше способом, то можно.

Но при каждой перепрошивке микроконтроллера её значение будет вновь становится 0x10. Если нужно там хранить данные, которые должны сохраняться даже при перепрошивке, инициализацию (= 0x10) целесообразно убрать. Тогда компилятор будет выводить раздражающий warning о том, что у переменной неопределённое значение. На самом деле там будет то значение, которое последнее попало в эту область памяти последний раз: при перепрошивке ли, или значение было изменено из самой программы, не важно.

Чтобы warning не возникал, в этом месте его можно отключить:

#pragma WARNINGLEVEL(0) 
at 0x4000 u8 eeprom uBrightness;
#pragma WARNINGLEVEL(2) 

Директива at 0x4000 указывает, по какому точно адресу в памяти будет располагаться переменная. Это дополнительно гарантирует, что переменная не сменит адрес (и значение) между перепрошивками. Адрес 0x4000 это самое начало области EEPROM STM8.

STM8 Bootloader

Допустим, мы хотим из программы менять состояние того option byte, который отвечает за возможность прошивки микроконтроллера через RS-232. Если включить данную возможность, активируется Bootloader. Это встроенная в STM8 функция, которая будет активироваться при включении самой первой. В течение 1 секунды она будет ожидать активности на UART и если с другой стороны подключен по RS-232 компьютер с программой STMicroelectronics Flash Loader Demonstrator, то эта программа сможет прошить микроконтроллер. Если на UART нет активности, то запустится текущая прошивка.

Когда Bootloader не нужен, его можно отключить. Тогда при включении, микропрограмма запускается сразу, а не с задержкой в 1 секунду, а прошить STM8 можно только через интерфейс SWIM, например. Тогда понадобится программатор и специальный софт, например RFlasher7 или ST Visual Programmer (STVP).

Если запись в EEPROM доступна, тогда поменять option byte, отвечающий за включение и выключение Bootloader можно так:

#define BOOT_LDR_ADDR 0x487E

// Включить Bootloader для возможности прошивки через COM-порт.
// Требуется ещё раз включить-выключить, чтобы вступило в силу.    
if (FLASH_ReadOptionByte(BOOT_LDR_ADDR) != 0x55AA)
{
  FLASH_ProgramOptionByte(BOOT_LDR_ADDR, 0x55);
}

// Выключить Bootloader
if (FLASH_ReadOptionByte(BOOT_LDR_ADDR) != 0x00FF)
{
  FLASH_EraseOptionByte(BOOT_LDR_ADDR);      
}

Дополнительная проверка if нужна для того, чтобы не писать в EEPROM, если там и так уже есть нужное значение. Это нужно для того, чтобы не тратить попусту ресурс записи памяти.

Софт

Скачать STMicroelectronics Flash Loader Demonstrator: um0462.zip (7,72 Мб).

система комментирования CACKLE

Автор: амдф
Дата: 11.10.2012


Разделы сайта
Главная
Блог
Native API
NTFS и ReFS
Микроконтроллеры
Справочник NTDLL
Коды NTSTATUS
Разное

Избранное
NTFS Stream Explorer
Native Shell
Тенгвар

Остальное
nvpnhcknn (архив)
English pages
Контакты

Ленты atom
Лента Atom сайта Лента Atom блога



При копировании материалов хорошим тоном будет указание авторства и ссылка на сайт.