сайт для палких паяльників

15. STM32. Программирование STM32F103. BKP
(на русском языке)

Backup registers (BKP)

У попередній статті ми познайомились з годинником реального часу RTC. Там я згадав про Backup Domain – частину мікроконтролера, що живиться від додаткової батарейки. Окрім годинника, Backup Domain містить Backup registers (BKP). У кожного мікроконтролера їх кількість може бути різною. У STM32F103C8 їх 42 (BKP_DR1 … BKP_DR42). Це 16-бітні регістри пам’яті, які зберігають своє значення після відключення основного живлення мікроконтролера. Це не Flash і не EEPROM, це звичайна пам’ять, яка живиться від батарейки. Якщо розцінювати батарейку годинника, як резервне живлення, стане зрозуміло, чому ці регістри мають назву Backup registers. Якщо вимкнути живлення мікроконтролера і резервне живлення (батарейку), дані регістрів будуть втрачені. Тому ці регістри не можна вважати енергонезалежною пам’яттю.

Ці регістри можна використовувати для своїх задач. У наступному прикладі при кожному старті програми (включенні живлення мікроконтролера або при перезавантаженні по сигналу Reset) зчитується регістр BKP_DR1, інкрементується, записується, а його поточне значення виводиться у порт USART. Таким чином, ми отримали лічильник кількості запуску програми мікроконтролера. Щоб скинути лічильника, можна просто відключити батарейку.

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_pwr.h"
#include "stm32f10x_usart.h"
#include "stm32f10x_bkp.h"
#include "stdio.h"
#include "misc.h"

void usart_init(void)
{
	/* Enable USART1 and GPIOA clock */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

	/* Configure the GPIOs */
	GPIO_InitTypeDef GPIO_InitStructure;

	/* Configure USART1 Tx (PA.09) as alternate function push-pull */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	/* Configure USART1 Rx (PA.10) as input floating */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	/* Configure the USART1 */
	USART_InitTypeDef USART_InitStructure;

	/* USART1 configuration ------------------------------------------------------*/
	/* USART1 configured as follow:
	          - BaudRate = 115200 baud
	          - Word Length = 8 Bits
	          - One Stop Bit
	          - No parity
	          - Hardware flow control disabled (RTS and CTS signals)
	          - Receive and transmit enabled
	          - USART Clock disabled
	          - USART CPOL: Clock is active low
	          - USART CPHA: Data is captured on the middle
	          - USART LastBit: The clock pulse of the last data bit is not output to
	                           the SCLK pin
	 */
	USART_InitStructure.USART_BaudRate = 115200;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

	USART_Init(USART1, &USART_InitStructure);

	/* Enable USART1 */
	USART_Cmd(USART1, ENABLE);
}

void USARTSend(char *pucBuffer)
{
    while (*pucBuffer)
    {
        USART_SendData(USART1, *pucBuffer++);
        while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
        {
        }
    }
}

int main(void)
{
	uint16_t reload_counter = 0;
	char buffer[80] = {'\0'};

	usart_init();

	// Дозволити тактування модулів управління живленням і управлінням резервної областю
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
	// Дозволити доступ до області резервних даних
	PWR_BackupAccessCmd(ENABLE);

	// Читаємо регістр BKP_DR1. Всього їх у STM32F103С8 42
	reload_counter = BKP_ReadBackupRegister(BKP_DR1);
	// Збільшуємо на 1
	reload_counter++;
	// Пишемо у той же регістр
	BKP_WriteBackupRegister(BKP_DR1, reload_counter);

	// Виводимо у USART поточне значення регістра
	sprintf(buffer, " BKP_DR1: %d\r\n", reload_counter);
	USARTSend(buffer);

    while(1)
    {
    }
}

Не забувайте, що Backup registers (BKP) – 16-бітні регістри. Відповідно, максимальне число, до якого може дорахувати такий лічильник, – 65535.

Бажаю успіхів!

Дивись також:

Translate
Архіви

© 2011-2017 Андрій Корягін, Кременчук - Київ, Україна