Современная электроника №9/2020
ИНЖЕНЕРНЫЕ РЕШЕНИЯ 36 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 9 2020 4 (например, В[4]) с числом с плаваю- щей запятой (например, F), как показа- но в листинге 1, т.е. для записи исполь- зовать 4-байтный массив KWR.B, а для чтения – массив KRD.B, то эта проблема решается очень просто (см. листинг 1) Здесь необходимо напомнить, что совмещение (union) двух разнотипных элементов (в данном случае – 4-байт- ного числа с плавающей запятой и 4-х байтного массива) означает, что эти элементы занимают один и тот же участок в памяти. Причём в этом слу- чае число с плавающей запятой может быть полностью восстановлено по зна- чениям массива и наоборот. Пользуясь вышеописанными подпро- граммами, перед записью 4-х байтно- го массива в память требуется очистить для них место (т.е. стереть как минимум 4 байта, начиная с того адреса, с которо- го будет производиться запись). Одна- ко, как это ни странно, стереть 4 байта нельзя, а вот стереть целую страни- цу памяти размером 512 байт можно. Для этого используется подпрограм- ма стирания страницы памяти (FLASH_ PageErase). Но при калибровке нуля и полной шкалы используются два раз- ных коэффициента, причём при кали- бровке полной шкалы используется коэффициент, полученный при кали- бровке нуля. Поэтому адреса, по кото- рым записываются эти коэффициен- ты, должны отличаться между собой по крайней мере на 512 байт, иначе, например при калибровке полной шкалы, можно стереть записанный в память коэффициент калибровки нуля (при использовании стирания страни- цы памяти FLASH_PageErase). Необходимо отметить, что програм- мы под общим названием EFM8LB1_ Flash работают при частоте внутрен- него генератора 24,5 МГц (HFOSC0). Кроме того, в справочном листке на микроконтроллер EFM8LB12 приведе- но время записи и стирания страницы памяти при условии работы микро- контроллера также при частоте 24,5 МГц. Но настоящая программа воль- тметра использует внутренний гене- ратор частотой 72 МГц (HFOSC1, см. рис. 10). Будет ли работать запись во флеш-память и чтение из неё на часто- те 72 МГц? Для этого можно попро- бовать установить настройку време- ни чтения флеш-памяти (Flash Read Timing) в состояние «SYSCLK is below 75 MHz», т.е. чтобы системная такто- вая частота была меньше 75 МГц. Этот параметр задаётся в основном меню, в разделе Core (см. рис. 8). В качестве проверки работоспособности такого подхода можно взять число с плаваю- щей запятой, например 1,23456, запи- сать его в память, затем прочитать и вывести на дисплей. Такой экспери- мент был проведён, и он полностью подтвердил, что запись во флеш- память и чтение из неё на частоте 72 МГц работают безупречно. Листинг 1 //------------------------------------------------------------------- -------- union { // KWR.F - 4-х байтное float число - коэффициент K для записи. unsigned char B[4]; // KWR.B[0]- Самый ст.б. float F; // KWR.B[1]- Ст.б. }KWR; // KWR.B[2]- Ср.б. // KWR.B[3]- Мл.б. //------------------------------------------------------------------- -------- union { // KRD.F - 4-х байтное float число - коэффициент K для чтения. unsigned char B[4]; // KRD.B[0]- Самый ст.б. float F; // KRD.B[1]- Ст.б. }KRD; // KRD.B[2]- Ср.б. // KRD.B[3]- Мл.б. //------------------------------------------------------------------ -------- Листинг 2 //------------------------------------------------------------------- ---------- // Global Variables //------------------------------------------------------------------- ---------- SI_LOCATED_VARIABLE_NO_INIT(flash_write_array[512], uint8_t, const SI_SEG_CODE, START_ADDRESS_B); SI_LOCATED_VARIABLE_NO_INIT(flash_write_array1[512], uint8_t, const SI_SEG_CODE, START_ADDRESS_K); SI_LOCATED_VARIABLE_NO_INIT(flash_write_array2[512], uint8_t, const SI_SEG_CODE, START_ADDRESS_P); //------------------------------------------------------------------- ---------- В связи с этим адрес массива для записи/чтения коэффициента кали- бровки нуля выбран 1A00h (6656 10 ), адрес массива для записи/чтения коэф- фициента калибровки полной шкалы выбран (как в примере EFM8LB1_Flash) 1600h (5632 10 ), разница между ними составляет 6656 - 5632 = 1024, что заве- домо больше 512 байт. Адрес числа с плавающей запятой для тестирования правильности записи/чтения выбран 1200h (4608 10 ), он на 1024 байт мень- ше адреса 1600h: #define START_ADDRESS_B 0x1A00 // для кал. 0 #define START_ADDRESS_K 0x1600 // для кал. 1 #define START_ADDRESS_P 0x1200 // для проверки Для работы подпрограмм требуется завести три глобальные переменные, использующие вышеуказанные адреса (START_ADDRESS_B, START_ADDRESS_К и START_ADDRESS_P) (см. листинг 2). После этого для записи во флеш- память, например, коэффициента кали- бровки полной шкалы необходимо использовать следующие два оператора: FLASH_PageErase(START_ ADDRESS_K);//Стирание страницы флеш-памяти 512 байт. FLASH_Write(START_ADDRESS_K, KWR.B, sizeof(KWR.B));//Запись KWR.F во флеш-память. Для чтения – оператор: FLASH_Read(KRD.B, START_ ADDRESS_K, sizeof(KRD.B)); //Чтение KRD.F из флеш-памяти . Аналогично в программе исполь- зуется запись и чтение коэффициен- та калибровки нуля (это числа соот- ветственно BWR.B и BRD.B), а также запись и чтение проверочного числа (PWR.F и PRD.F). Текст основной программы для воль- тметра и все дополнительные файлы, требующиеся для её работы, а также оттранслированная и готовая к загруз- ке программа в hex-формате приведены в дополнительных материалах к статье. Запрограммировать микроконтрол- лер EFM8LB12, как указывалось выше, можно двумя способами. По интерфейсу C2 с помощью USB- DEBUG адаптера. Для этого потребует- ся изготовить кабель, который одним концом подключается к выходному разъёму USB-DEBUG адаптера, а на вто- ром его конце распаян 3-контактный разъём, на который выведены сигналы интерфейса C2: RST/C2CK, C2D и «зем- ля». Схему такого кабеля можно найти
RkJQdWJsaXNoZXIy MTQ4NjUy