STM32f030f4p6内部flash打包读写

STM32f030f4p6内部flash打包读写
最近做到的项⽬在运⾏需要把⼀组uint8_t(unsigned char)的数据进⾏掉电储存,想到单⽚机STM32f030f4p6内部flash可以直接由程序操作,写了以下代码⽤于uint8_t数据打包保存和读取
1、程序清单与测试结果
本程序包含5个⽂件,分别是:
1、Flash.c:内部flash读取储存相关函数
2、Flash.h:flash头⽂件
3、USART1.c:STM32F030F4P6的串⼝驱动,串⼝仅⽤于打印数据观察。
4、USART1.h:串⼝头⽂件
5、main.c:防⽌程序主⼊⼝
1、Flash.c
#include "Flash.h"
#include "USART1.h"
/*******************************************************************************
* Function Name  : doseFlashHasPackedMessage
* Description    : Does flash has packed messages
* Input          : None
* Output        :
* Return        : ture/false
*******************************************************************************/
bool doseFlashHasPackedMessage(void)
{
uint16_t length;
uint16_t getHead;
/*Is head matched*/
getHead = (uint16_t)(*(uint16_t*)(STM32F0xx_FLASH_PAGE15_STARTADDR ));
if( EEPPROM_PACKAGEHEAD != getHead )
{
return false;
}
/*Is length zero*/
length = (*(uint16_t*)(STM32F0xx_FLASH_PAGE15_STARTADDR+2));
if( 0 == length)
{
return false;
}
return true;
}
/*******************************************************************************
* Function Name  : getValuablePackedMessageLengthofFlash
* Description    : Get valuable packed message length of flash
* Input          : None
* Output        :
* Return        : valuable length
*******************************************************************************/
uint16_t getValuablePackedMessageLengthofFlash( void )
{
uint16_t length;
/*Is head matched*/
if( EEPPROM_PACKAGEHEAD != (*(uint16_t*)(STM32F0xx_FLASH_PAGE15_STARTADDR )) )    {
return0;
}
/*Get length*/
length = (uint16_t)(*(uint16_t*)(STM32F0xx_FLASH_PAGE15_STARTADDR+2));
return length;
}
/*******************************************************************************
* Function Name  : readPackedMessageFromFlash
* Description    : Read packed message form flash
* Input          : buff:point to first location of received buffer.length:Maxmum length of reception
* Output        :
* Return        : reception length
*******************************************************************************/
uint16_t readPackedMessageFromFlash( uint8_t *buff , uint16_t length)
{
int i;
uint16_t getLength;
if( !doseFlashHasPackedMessage() )
return0;
/*Get valuable length*/
getLength = getValuablePackedMessageLengthofFlash();
/*Read out message*/
for(i=0;i<MIN(getLength,length);i++)
{
buff[i]= *(uint8_t*)(STM32F0xx_FLASH_PAGE15_STARTADDR+4+i);
}
return MIN(getLength,length);
}
/*******************************************************************************
* Function Name  : isItOddNumber
* Description    : is input data an odd number?
* Input          : number:input data
* Output        :
* Return        : true/false
*******************************************************************************/
bool isItOddNumber(uint16_t number)
{
if(0 != number%2)
{
return true;
}
return false;
}
/*******************************************************************************
* Function Name  : Flash_eeprom_WriteWithPacked
* Description    : Write a group of datas to flash.
* Input          : buff:pointer of first data, length: write length
* Output        :
* Return        : true/false
*******************************************************************************/
bool writeMessageToFlash( uint8_t *buff , uint16_t length)
{
uint16_t temp;
int i;
/*Protection*/
if( (length+4) > STM32F0xx_PAGE_SIZE )
{
return false;
}
FLASH_Unlock(  );
/*Clear all flags*/
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR );
/*Erase first . Do not rember.*/
if(FLASH_COMPLETE != FLASH_ErasePage(STM32F0xx_FLASH_PAGE15_STARTADDR))//°üº¬Á˵ȴýbusy    {
return false;
}
/*Write head*/
FLASH_ProgramHalfWord( STM32F0xx_FLASH_PAGE15_STARTADDR, EEPPROM_PACKAGEHEAD );
/*Write length*/
FLASH_ProgramHalfWord( STM32F0xx_FLASH_PAGE15_STARTADDR+2 , length );
/*Write datas*/
for(i=0 ;i<length/2 ;i++)
{
temp = buff[2*i]|(uint16_t)buff[2*i+1]<<8;
FLASH_ProgramHalfWord( STM32F0xx_FLASH_PAGE15_STARTADDR+4+2*i , temp);
}
if( isItOddNumber(length) )//Write one more if length is odd number.
{
temp = (uint16_t)buff[length-1];
FLASH_ProgramHalfWord( STM32F0xx_FLASH_PAGE15_STARTADDR+4+(length-1) , temp);
}
/*Read out and check*/
for(i=0 ;i<length ;i++)
{
if( *(uint8_t*)(STM32F0xx_FLASH_PAGE15_STARTADDR+4+i) != buff[i] )
{
FLASH_Lock();
return false;
}
}
FLASH_Lock();
return true;
}
/*******************************************************************************
* Function Name  : flashReadWriteTest
* Description    : Flash read write test.
* Input          : None
* Output        : None
* Return        : None
*******************************************************************************/
void flashReadWriteTest( void )
{
#define testReadWriteNumber  200
uint8_t buff_write[testReadWriteNumber]={0};
uint8_t buff_read[testReadWriteNumber]={0};
uint16_t length;
int i;
for( i=0;i<testReadWriteNumber;i++)
{
buff_write[i]=i;
}
writeMessageToFlash( buff_write , testReadWriteNumber);
length = readPackedMessageFromFlash( buff_read , testReadWriteNumber);
printf("length=%d\r\n",length);
for(i=0;i<length;i++)
{
printf("read[%d]=%d\r\n",i,buff_read[i]);
}
while(1);
}
View Code
2、Flash.h
#ifndef __FLASH_H
#define __FLASH_H
#include "stm32f0xx.h"
#include <stdbool.h>
//Message head
#define EEPPROM_PACKAGEHEAD 0xAA55//
//Flash page head
#define STM32F0xx_PAGE_SIZE 0x400
#define STM32F0xx_FLASH_PAGE0_STARTADDR 0x8000000
#define STM32F0xx_FLASH_PAGE1_STARTADDR (STM32F0xx_FLASH_PAGE0_STARTADDR+STM32F0xx_PAGE_SIZE)
#define STM32F0xx_FLASH_PAGE2_STARTADDR (STM32F0xx_FLASH_PAGE0_STARTADDR+2*STM32F0xx_PAGE_SIZE) #define STM32F0xx_FLASH_PAGE3_STARTADDR (STM32F0xx_FLASH_PAGE0_STARTADDR+3*STM32F0xx_PAGE_SIZE) #define STM32F0xx_FLASH_PAGE4_STARTADDR (STM32F0xx_FLASH_PAGE0_STARTADDR+4*STM32F0xx_PAGE_SIZE) #define STM32F0xx_FLASH_PAGE5_STARTADDR (STM32F0xx_FLASH_PAGE0_STARTADDR+5*STM32F0xx_PAGE_SIZE) #define STM32F0xx_FLASH_PAGE6_STARTADDR (STM32F0xx_FLASH_PAGE0_STARTADDR+6*STM32F0xx_PAGE_SIZE) #define STM32F0xx_FLASH_PAGE7_STARTADDR (STM32F0xx_FLASH_PAGE0_STARTADDR+7*STM32F0xx_PAGE_SIZE) #define STM32F0xx_FLASH_PAGE8_STARTADDR (STM32F0xx_FLASH_PAGE0_STARTADDR+8*STM32F0xx_PAGE_SIZE) #define STM32F0xx_FLASH_PAGE9_STARTADDR (STM32F0xx_FLASH_PAGE0_STARTADDR+9*STM32F0xx_PAGE_SIZE) #define STM32F0xx_FLASH_PAGE10_STARTADDR (STM32F0xx_FLASH_PAGE0_STARTADDR+10*STM
32F0xx_PAGE_SIZE) #define STM32F0xx_FLASH_PAGE11_STARTADDR (STM32F0xx_FLASH_PAGE0_STARTADDR+11*STM32F0xx_PAGE_SIZE) #define STM32F0xx_FLASH_PAGE12_STARTADDR (STM32F0xx_FLASH_PAGE0_STARTADDR+12*STM32F0xx_PAGE_SIZE) #define STM32F0xx_FLASH_PAGE13_STARTADDR (STM32F0xx_FLASH_PAGE0_STARTADDR+13*STM32F0xx_PAGE_SIZE) #define STM32F0xx_FLASH_PAGE14_STARTADDR (STM32F0xx_FLASH_PAGE0_STARTADDR+14*STM32F0xx_PAGE_SIZE) #define STM32F0xx_FLASH_PAGE15_STARTADDR (STM32F0xx_FLASH_PAGE0_STARTADDR+15*STM32F0xx_PAGE_SIZE)
#define MIN(A,B) (A<B?A:B)
void flashReadWriteTest( void ) ;
#endif
View Code
3、USART1.c
#include "USART1.h"
void USART1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
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_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
}
void USART1_IRQHandler(void)
{
}
/**
* @brief  Retargets the C library printf function to the USART.
* @param  None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the USART */
USART_SendData(USART1, (uint8_t) ch);
/* Loop until the end of transmission */
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
{}
return ch;
}

本文发布于:2024-09-20 16:24:15,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/90119.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   读取   储存   程序   打包   结果
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议