Módulo Lora de Internet de las cosas desde la entrada hasta la competencia (9) Lectura y almacenamiento de Flash - conclusión

I. Introducción

        Este será el último artículo de la serie "Módulos IoT Lora de principiante a maestro". Creo que todos los colegas han dominado la programación de los módulos Lora al compartir los ocho artículos anteriores. La lectura y el almacenamiento de Flash en este artículo será Es la última pieza del desarrollo del módulo Lora, ¡gracias por su compañía y apoyo!

        ¡Espero que todos puedan avanzar más y más en el camino del aprendizaje, sin olvidar la intención original y seguir adelante!

2. Implementación del código

        El requisito de la tarea esta vez es registrar el número de reinicios del programa.

        En las rutinas estándar que se nos proporcionan, nos brindan métodos para operar Flash, incluidas la lectura y la escritura. Estos métodos están incluidos en la biblioteca flash.c:

/**********************************************************************************************
*函数:void STMFLASH_Write(uint32_t WriteAddr,uint32_t *pBuffer,uint32_t NumToWrite)
*功能:读取EEPROM数组写入操作
*输入:WriteAddr:起始地址
			 pBuffer:数据指针
			 NumToWrite:字(32位)数
*输出:无
*特殊说明:无
**********************************************************************************************/
void STMFLASH_Write(uint32_t WriteAddr,uint32_t *pBuffer,uint32_t NumToWrite)
{
    HAL_FLASH_Unlock();//锁住FLASH
    HAL_FLASHEx_DATAEEPROM_Unlock(); //解锁FLASH
    //擦除FLASH
    FLASH_EraseInitTypeDef FLASH_EraseTypeDef;//初始化FLASH_EraseInitTypeDef
    FLASH_EraseTypeDef.TypeErase = FLASH_TYPEERASE_PAGES;
    FLASH_EraseTypeDef.PageAddress = WriteAddr;
    FLASH_EraseTypeDef.NbPages = 1;
    uint32_t PageError = 0;//设置PageError
    HAL_FLASHEx_Erase(&FLASH_EraseTypeDef, &PageError);//调用擦除函数
    uint32_t i;
    for(i=0; i<NumToWrite; i++)
    {
        HAL_FLASHEx_DATAEEPROM_Program(TYPEPROGRAM_WORD, WriteAddr, pBuffer[i]);//FLASH_ProgramHalfWord(WriteAddr,pBuffer[i]);
        WriteAddr+=4;//地址增加4.
    }
    HAL_FLASHEx_DATAEEPROM_Lock();//锁住FLASH
    HAL_FLASH_Lock();//锁住FLASH
}

//从指定地址开始读出指定长度的数据
//ReadAddr:起始地址
//pBuffer:数据指针
//NumToWrite:字(32位)数
void STMFLASH_Read(uint32_t ReadAddr,uint32_t *PBuffer,uint32_t NumToRead)
{
    uint32_t i;
    for(i=0; i<NumToRead; i++)
    {
        PBuffer[i]=STMFLASH_ReadWord(ReadAddr);//读取4个字节.
        ReadAddr+=4;//偏移4个字节.
    }
}

        El chip utilizado por nuestra placa de desarrollo es STM32F103C8T6. De acuerdo con el manual de desarrollo del chip, nuestra dirección de memoria operativa comienza desde 0x0800E000, por lo que la usamos como dirección para escribir datos Flash.

        De acuerdo con la descripción de la función anterior, primero declaramos una matriz de tipo uint32_t como contenedor para el almacenamiento de datos.

        Como necesitamos registrar el número de reinicios del programa, primero debemos escribir un valor inicial de 0 en esta dirección.

        Luego, podemos comenzar oficialmente nuestro trabajo de código, es decir, leer los datos después del encendido, realizar la operación +1 en los datos y almacenarlos en Flash nuevamente.

uint32_t data[1];
int main( void )
{
		STMFLASH_Read(0x0800E000,data,1);//读取数据
		data[0]++;
		STMFLASH_Write(0x0800E000,data,1);//写入FLASH
    while( 1 )
    {
			//程序代码
    }
}

        Hasta ahora, hemos completado las operaciones de lectura y almacenamiento de FLASH.

        Aumentamos el contenido de la tarea, es decir, puede usar los botones para controlar el aumento, la disminución o borrar la cantidad de registros.

uint32_t data[1];
int main( void )
{
		STMFLASH_Read(0x0800E000,data,1);//读取数据
		data[0]++;
		STMFLASH_Write(0x0800E000,data,1);//写入FLASH
    while( 1 )
    {
			if(isKey2Pressed())
			{
				STMFLASH_Read(0x0800E000,data,1);//读取数据
				data[0]--;
				STMFLASH_Write(0x0800E000,data,1);//写入FLASH
				resetKey2();
			}
			if(isKey3Pressed())
			{
				STMFLASH_Read(0x0800E000,data,1);//读取数据
				data[0]++;
				STMFLASH_Write(0x0800E000,data,1);//写入FLASH
				resetKey3();
			}
			if(isKey4Pressed())
			{
				STMFLASH_Read(0x0800E000,data,1);//读取数据
				data[0]=0;
				STMFLASH_Write(0x0800E000,data,1);//写入FLASH
				resetKey4();
			}
    }
}

        En la lectura y almacenamiento de Flash, debido a algunos factores incontrolables, se recomienda leer el contenido en Flash antes de escribir y luego cambiarlo nuevamente, para aumentar la estabilidad del programa y evitar accidentes.

3. Resumen

        Hasta ahora, también hemos completado todo el aprendizaje del módulo Lora. Continuaré compartiendo otros conocimientos sobre el desarrollo de STM32 en el futuro. Gracias por su atención.

Supongo que te gusta

Origin blog.csdn.net/qq_39724355/article/details/131157863
Recomendado
Clasificación