СОВРЕМЕННАЯ ЭЛЕКТРОНИКА №3/2014

ЭЛЕМЕНТЫ И КОМПОНЕНТЫ 24 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 3 2014 этого разряда производится запи- сью 1 в разряд CTE. Состояния разря- да означают: 0 – нет событий сигнала TAMPER, 1 – произошло событие сиг- нала TAMPER. Разряд TPIE разрешает прерыва- ния от сигнала TAMPER. Сброс разря- да в состояние «0» запрещает преры- вания от сигнала TAMPER, а установка в состояние «1» – разрешает. В этом слу- чае должен быть установлен разряд TPE регистра BKP_CR. Разряд CTI очищает прерывание сиг- нала TAMPER, когда устанавливает- ся в состояние «1». При этом он также сбрасывает флаг TIF. Разряд CTE при установке его в состо- яние «1» очищает события сигнала. Более подробное описание назна- чения регистров BKP можно найти в источнике [2]. П РОГРАММИРОВАНИЕ Для инициализации блока BKP и работы с ним необходимо выпол- нить следующие действия: ● разрешить тактирование и доступ к резервной области данных; ● разрешить доступ к области резерв- ных данных для записи; ● произвести операции чтения или записи данных; ● запретить доступ к области резерв- ных данных для записи. Рассмотрим конкретный пример программы обращения к регистрам резервных данных BKP (см. листинг 1). Первая команда данной программы обеспечивает подачу тактовых импуль- сов для BKP. Без этого область BKP будет недоступна. Перед записью данных в область BKP сначала разрешается доступ к области резервных данных для записи, а после записи BKP вновь блокируется, что позволяет защитить эти данные. Для удобства разработки программ в листинге 2 приведён набор функ- ций, позволяющих выполнить все необходимые операции для работы с BKP. Представленные готовые функции позволяют избавиться от необходи- мости запоминания названия специ- альных регистров и упрощают работу с блоком ВКР. Л ИТЕРАТУРА 1. https://www.st.com. 2. www.st.com/web/en/resource/tech- nical/document/reference_manual/ CD00246267.pdf. Листинг 1 uint16_t t; // Вспомогательная переменная t // Разрешить тактирование управления питанием и управления резервной областью RCC->APB1ENR |= RCC_APB1ENR_PWREN | RCC_APB1ENR_BKPEN; t = BKP->DR4; // Читать регистр данных DR4 t++; // Увеличить прочтенное значение на 1 PWR->CR |= PWR_CR_DBP; // Разрешить запись в область BKP BKP->DR4 = t; // Записать новое значение в регистр DR4 PWR->CR & = ~PWR_CR_DBP; // Запретить запись в область BKP Листинг 2 //-------------------------------- // Функция инициализации блока BKP //-------------------------------- void Init_BKP(void) { // Разрешить тактирование управления питанием и управления резервной областью RCC->APB1ENR |= RCC_APB1ENR_PWREN | RCC_APB1ENR_BKPEN; } //------------------------------------------------- // Функция табличного получения физического адреса // данных блока BKP по адресу смещения 1...42 //------------------------------------------------- uint32_t BKP_GetAdr(uint8_t adr) { static uint32_t t[]= {BKP_BASE+0x00, BKP_BASE+0x04, BKP_BASE+0x08, BKP_BASE+0x0c, BKP_BASE+0x10, BKP_BASE+0x14, BKP_BASE+0x18, BKP_BASE+0x1c,\ BKP_BASE+0x20, BKP_BASE+0x24, BKP_BASE+0x28, BKP_BASE+0x40, BKP_BASE+0x44, BKP_BASE+0x48, BKP_BASE+0x4c, BKP_BASE+0x50,\ BKP_BASE+0x54, BKP_BASE+0x58, BKP_BASE+0x5c, BKP_BASE+0x60, BKP_BASE+0x64, BKP_BASE+0x68, BKP_BASE+0x6c, BKP_BASE+0x70,\ BKP_BASE+0x74, BKP_BASE+0x78, BKP_BASE+0x7c, BKP_BASE+0x80, BKP_BASE+0x84, BKP_BASE+0x88, BKP_BASE+0x8c, BKP_BASE+0x90,\ BKP_BASE+0x92, BKP_BASE+0x94, BKP_BASE+0x98, BKP_BASE+0x9c, BKP_BASE+0xa0, BKP_BASE+0xa4, BKP_BASE+0xa8, BKP_BASE+0xac,\ BKP_BASE+0xb0, BKP_BASE+0xb4, BKP_BASE+0xb8, BKP_BASE+0xbc}; if(adr<=42) return t[adr]; // Вернуть данные else return 0; } //---------------------------------------------------- // Функция чтения данных из блока BKP по адресу 1...42 //---------------------------------------------------- uint16_t BKP_Rd(uint8_t adr) { return (*(__IO uint32_t*) BKP_GetAdr(adr)); } //------------------------------------------- // Функция записи данных в блок BKP по адресу //------------------------------------------- void BKP_Wr(uint8_t adr, uint16_t data) { PWR->CR |= PWR_CR_DBP; // Разрешить запись в область BKP *(__IO uint16_t*)BKP_GetAdr(adr) = (uint16_t)data; PWR->CR &= ~PWR_CR_DBP; // Запретить запись в область BKP } © СТА-ПРЕСС

RkJQdWJsaXNoZXIy MTQ4NjUy