Module Internet des Objets Lora de l'entrée à la maîtrise (9) Lecture et stockage Flash - conclusion

Introduction

        Ce sera le dernier article de la série "IoT Lora Modules from Beginner to Master". Je crois que tous les collègues ont maîtrisé la programmation des modules Lora grâce au partage des huit articles précédents. La lecture et le stockage de Flash dans cet article sera C'est le dernier élément du développement du module Lora, merci pour votre entreprise et votre soutien !

        J'espère que chacun pourra aller de plus en plus loin sur le chemin de l'apprentissage, sans oublier l'intention initiale, et aller de l'avant !

2. Mise en œuvre du code

        L'exigence de la tâche cette fois est d'enregistrer le nombre de redémarrages du programme.

        Dans les routines standard qui nous sont fournies, nous nous fournissons des méthodes pour faire fonctionner Flash, y compris la lecture et l'écriture. Ces méthodes sont incluses dans la bibliothèque 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个字节.
    }
}

        La puce utilisée par notre carte de développement est STM32F103C8T6.Selon le manuel de développement de la puce, notre adresse mémoire utilisable commence à partir de 0x0800E000, nous l'utilisons donc comme adresse pour écrire des données Flash.

        Selon la description de la fonction ci-dessus, nous déclarons d'abord un tableau de type uint32_t comme conteneur pour le stockage des données.

        Comme nous devons enregistrer le nombre de redémarrages du programme, nous devons d'abord écrire une valeur initiale de 0 à cette adresse.

        Ensuite, nous pouvons officiellement commencer notre travail de code, c'est-à-dire lire les données après la mise sous tension, effectuer une opération +1 sur les données et les stocker à nouveau dans Flash.

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

        Jusqu'à présent, nous avons terminé les opérations de lecture et de stockage de FLASH.

        Nous augmentons le contenu de la tâche, c'est-à-dire que vous pouvez utiliser les boutons pour contrôler l'augmentation, la diminution ou la suppression du nombre d'enregistrements.

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();
			}
    }
}

        Lors de la lecture et du stockage de Flash, en raison de certains facteurs incontrôlables, il est recommandé de lire le contenu de Flash avant d'écrire, puis de le modifier à nouveau, afin d'augmenter la stabilité du programme et d'éviter les accidents.

3. Résumé

        Jusqu'à présent, nous avons également terminé tout l'apprentissage du module Lora. Je continuerai à partager d'autres connaissances sur le développement de STM32 à l'avenir. Merci de votre attention.

Je suppose que tu aimes

Origine blog.csdn.net/qq_39724355/article/details/131157863
conseillé
Classement