STM32 备份寄存器的使用

使用说明:
1)相关的备份寄存器主要依托于电池供电,如果电池没有电了,数据也会消失;
2)小容量的备份寄存器是10个,20个字节;大容量的是42个寄存器,84个字节;
3)主要两个函数BKP_ReadBackupRegister(BKP_DR1);和BKP_WriteBackupRegister(BKP_DR1, 0xaabb;
测试代码说明如下:
每串口发送一次数据,备份寄存器数据加1,并通过串口发送出去;如果是检测到PC13的入侵信号,则备份寄存器数据清零;
主函数代码如下:

#include "uart_dma.h"
#include "misc.h"
#include <string.h>
#include <stm32f10x_bkp.h>
#include <stm32f10x_pwr.h>
extern uint8_t uart2SendData[32];

void BKP_Configuration(void)
{
    //EXTI_InitTypeDef EXTI_InitStructure;
    //ÅäÖÃPWRºÍBKPʱÖÓ
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

    //ÔÊÐí·ÃÎʱ¸·ÝÓò
    PWR_BackupAccessCmd(ENABLE);
		BKP_TamperPinCmd(DISABLE);
		/* Disable Tamper interrupt */
		BKP_ITConfig(DISABLE);
		BKP_TamperPinLevelConfig(BKP_TamperPinLevel_Low);
    //ÇåÈëÇÖ¼ì²âʼþ(TE)¹ÒÆð±êÖ¾
    BKP_ClearFlag();
		BKP_ITConfig(ENABLE);
		BKP_TamperPinCmd(ENABLE);	
}

uint16_t tmp = 0;
int main(void)
{ 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	BKP_Configuration();
	Uart2Config();
	tmp = BKP_ReadBackupRegister(BKP_DR1);
	uart2SendData[30] = tmp>>8;
	uart2SendData[31] = tmp;

	while(1)
	{     	
		if(uart2RecvFlag == 1)
		{				
			uart2RecvFlag = 0; 
			uart2DmaClear();
			
		  	BKP_WriteBackupRegister(BKP_DR1, tmp);				
			uart2SendArray(uart2RecvData, uart2RecvLen);
			memset(uart2RecvData, '\0', sizeof(uart2RecvData)); 	
			tmp = BKP_ReadBackupRegister(BKP_DR1);
			uart2SendData[30] = tmp>>8;
			uart2SendData[31] = tmp;
			tmp++;
		}
		
		if(uart2SendFlag == 1)
		{
			uart2SendFlag = 0;  				
			Uart2RxEnable();
		}
	}
}

dma代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_usart.h"
#include "stm32f10x_dma.h"
#include "misc.h"

#include "systick.h"
#include "uart_dma.h"

uint8_t uart2RecvData[32] = {0}; 
uint8_t uart2RecvFlag = 0;  
uint8_t uart2RecvLen = 0;

uint8_t uart2SendData[32] = {0};
uint8_t uart2SendFlag = 0;
unsigned char u485RxBuf[255];

void Uart2TxEnable(void)
{
    GPIO_WriteBit(UART2_EN_PORT, UART2_EN_PIN, Bit_SET);
}

void Uart2RxEnable(void)
{
    GPIO_WriteBit(UART2_EN_PORT, UART2_EN_PIN, Bit_RESET);
}

void Uart2Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    DMA_InitTypeDef   DMA_InitStructure;
		NVIC_InitTypeDef NVIC_InitStructure;
	
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	//Config USART2 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
	  //	   ZIGEBB_SET---EN
	  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    //Configure USART2 Rx as input floating
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    //Configure USART2 Tx as 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    

	  USART_InitStructure.USART_BaudRate = 9600;
    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(USART2, &USART_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel =DMA1_Channel6_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority        =3;
    NVIC_Init(&NVIC_InitStructure);	
		
	/* Enable TAMPER IRQChannel */
	NVIC_InitStructure.NVIC_IRQChannel = TAMPER_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);

// DMA1 Channel6 (triggered by USART2 Rx event) Config  
    DMA_DeInit(DMA1_Channel6);     
    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART2->DR;   
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)uart2RecvData;  // U485BUFSIZE;   
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;   
    DMA_InitStructure.DMA_BufferSize = sizeof(uart2RecvData);
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;   
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;   
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;   
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;   
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; // DMA_Mode_Circular;   
    DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;// DMA_Priority_Low;   
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;   
    DMA_Init(DMA1_Channel6, &DMA_InitStructure); 
	DMA_ITConfig(DMA1_Channel6, DMA_IT_TC, ENABLE);
	DMA_Cmd(DMA1_Channel6, ENABLE);   
	
	// Enable USART2 DMA Rxrequest  
    USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE);   // USART_DMAReq_Tx

    //USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
    USART_Cmd(USART2, ENABLE);
		
		
    DMA_InitStructure.DMA_BufferSize = 0;  
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  
    DMA_InitStructure.DMA_MemoryBaseAddr =(uint32_t)uart2SendData;
    DMA_Init(DMA1_Channel7, &DMA_InitStructure);
     
    USART_DMACmd(USART2, USART_DMAReq_Tx | USART_DMAReq_Rx, ENABLE);
  
    DMA_Cmd(DMA1_Channel6, ENABLE);
    DMA_Cmd(DMA1_Channel7, ENABLE);
    
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel7_IRQn;
    NVIC_Init(&NVIC_InitStructure);
    
    DMA_ITConfig(DMA1_Channel6, DMA_IT_TC, ENABLE);
    DMA_ITConfig(DMA1_Channel7, DMA_IT_TC, ENABLE);
}

void uart2DmaClear(void)
{
    DMA_Cmd(DMA1_Channel6, DISABLE);
    DMA_SetCurrDataCounter(DMA1_Channel6, sizeof(uart2RecvData));
    DMA_Cmd(DMA1_Channel6, ENABLE);
}

void uart2SendArray(uint8_t *arr, uint8_t len)
{
    if(len == 0)
      return;
    
    uint8_t sendLen = len>sizeof(uart2SendData) ? sizeof(uart2SendData) : len;
    
    Uart2TxEnable();
    
    while (DMA_GetCurrDataCounter(DMA1_Channel7));
    if(arr) 
      memcpy(uart2SendData, arr, sendLen);
    
    DMA_Cmd(DMA1_Channel7, DISABLE);
    DMA_SetCurrDataCounter(DMA1_Channel7, sendLen);
    DMA_Cmd(DMA1_Channel7, ENABLE);   
}

中断控制函数代码如下:

#include "stm32f10x_it.h"
#include "stm32f10x_usart.h"
#include "stm32f10x_dma.h"
#include <stm32f10x_bkp.h>
#include <stm32f10x_pwr.h>
#include "uart_dma.h"

void DMA1_Channel6_IRQHandler(void)
{
    if(SET==DMA_GetITStatus(DMA1_IT_TC6))
	{
        DMA_ClearITPendingBit(DMA1_IT_TC6);
        uart2RecvFlag = 1;
        uart2RecvLen = sizeof(uart2RecvData) - DMA_GetCurrDataCounter(DMA1_Channel6);
    }
}

void DMA1_Channel7_IRQHandler(void)	
{
    if(DMA_GetITStatus(DMA1_IT_TC7) != RESET)
    {
        DMA_ClearITPendingBit(DMA1_IT_TC7);    
        DMA_Cmd(DMA1_Channel7, DISABLE);       
        DMA1_Channel7->CNDTR=0;                
        uart2SendFlag = 1; 
    }
}

void TAMPER_IRQHandler(void)
{
  if(BKP_GetITStatus() != RESET)
  { /* Tamper detection event occurred */

    /* Clear Tamper pin interrupt pending bit */
    BKP_ClearITPendingBit();
		
    /* Clear Tamper pin Event(TE) pending flag */
    BKP_ClearFlag();

    /* Disable Tamper pin */
    BKP_TamperPinCmd(DISABLE);
    if(BKP_ReadBackupRegister(BKP_DR1) == 0x0000)
	{
		uart2SendFlag = 1;
		uart2SendArray(uart2RecvData, uart2RecvLen);						
	}
    /* Enable Tamper pin */
    BKP_TamperPinCmd(ENABLE);      
  }
}

dma头文件代码如下:

#ifndef _UART_DAM_H_
#define _UART_DMA_H_

#include <stdint.h>

#define UART2_TX_PORT   GPIOA
#define UART2_TX_PIN    GPIO_Pin_2
#define UART2_RX_PORT   GPIOA
#define UART2_RX_PIN    GPIO_Pin_3
#define UART2_EN_PORT   GPIOD
#define UART2_EN_PIN    GPIO_Pin_1
#define BAUD_RATE       (9600)

extern uint8_t uart2RecvData[32];
extern uint8_t uart2RecvFlag;
extern uint8_t uart2RecvLen;
extern uint8_t uart2SendFlag;

void Uart2GpioInit(void);
void Uart2Config(void);
void uart2DmaClear(void);
void uart2SendArray(uint8_t *arr, uint8_t len);

void Uart2RxEnable(void);
void Uart2TxEnable(void);

#endif  /* uart_dma.h */

测试效果如下:
在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值