STM32CubeMX学习----Flash学习 HAL库 字符串写入Flash的方法

2021.1.31

本文使用HAL库中的函数进行Flash的读写操作。

1.Flash简介

Flash就是关于平常程序储存的地方,而sram一般是存放变量的地方。Flash中的数据不会因为断电而丢失,SRAM则会。

  • 为了保护数据的安全,Flash有安全锁,对Flash写入时先要解锁,擦除,写入,锁上。任何时候对任何型号的STm32都是这些操作

  • Flash中的内存分页,修改一页的内容中内容时,不支持只修改一部分,所以修改前要将整页擦除
  • 擦除数据,就是将整页数据变成1,而数据一16位的形式保存在Flash中,因此观察寄存器可以看见擦写过后的Flash的地址位0xFF。
  • 地址是32位

2.Flash的解锁和锁上函数

HAL_FLASH_Lock();

/****用户操作********/

HAL_FLASH_Unlock();

 

3.flash的擦除函数

创建错误返回参数  (参数2)

 

uint32_t FlashError=0;

正确擦除后,FlashError因该会返回值FFFFFFFF

4.flash写入函数

参数1为,写入数据的类型(8/16/32/64位)

参数2为,开始写入地址

参数3为,要写入的地址

5.读取函数    

自己建立一个函数,里面通过函数memcpy()进行复制

简单介绍以下memcpy()函数

注意到,

参数1为,数据需要复制到的地址

参数2为,数据原来所在的地址

参数3为,需要 复制的字节,对是字节,这就说明,不论,前两个参数是说明类型,这个函数就复制相应个字节数据,有很强的适用性。

6.创建工程

STM32C'ubeMX中直接生成一个工程即可

7.代码实现

首先要确定需要写入的地址:博主使用的STM32f103ZET6,512kFLASH内存,(不同型号的地址不同,自行在下面表中查找,这是STM32f10XX的,其他型号,在对应手册中应该有)照表选用最后一页的地址,防止对存在前面的程序产生影响。

uint32_t address=0x0807E000;

下面是将字符串写进Flash中的代码

注意以下几点

  • 字符串为8位数据,需要转化成32位类型,去接受数据。

  • 写入数据的时候,每写完一个数据,地址要前移,数组也要前移。

#define MAX  8//数据长度
uint8_t Bf_date[MAX]="dawn_zs";
//数据
uint8_t Af_date[MAX];//读取数据的数组
uint32_t address=0x0807E000;//地址
uint32_t FlashError=0;//擦除的反馈

void printfflash(void)//读取并打印,需要重定向printf,并且在建立工程的时候勾选一个串口
{
   memcpy((uint32_t *)Af_date,(void*)address,MAX);
     printf("%s",Af_date);

}

void FLASHWRITER(uint32_t addr,uint32_t* pdate, uint32_t len)//读数据函数
{
    
    uint32_t i=0;
       for(;i<len;i++)
// i个32位数据
    {
       HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,addr,*pdate);
       addr+=4;
//32位为4个字节所以地址加4
         pdate++;//因为为32位数组所以加1就行
    }

}


void FLASH_init(void)

{

HAL_FLASH_Unlock();
        FLASH_EraseInitTypeDef  FlashSet;
        FlashSet.TypeErase=FLASH_TYPEERASE_PAGES;
        FlashSet.PageAddress=address;
        FlashSet.NbPages=1;
        printfflash();
       HAL_FLASHEx_Erase(&FlashSet,&FlashError);
      printfflash();
     FLASHWRITER(address,(uint32_t*)Bf_date,MAX/4);
     printfflash();

HAL_FLASH_Lock();
}


int main(void)
{

  HAL_Init();


  SystemClock_Config();


  MX_GPIO_Init();
  MX_USART1_UART_Init();

 
   FLASH_init();

  while (1)
  {

   
  }
}

  • 7
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
STM32HAL库中,可以使用UART串口通信模块来接收字符串。UART串口通信模块在HAL库中提供了一系列API函数,可以方便地实现串口通信。下面是一个简单的接收字符串的示例代码: ```c #include "stm32f4xx_hal.h" #define RX_BUFFER_SIZE 128 uint8_t rx_buffer[RX_BUFFER_SIZE]; // 接收缓冲区 uint8_t rx_index = 0; // 缓冲区指针 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART1) // 如果是串口1接收到数据 { if (rx_buffer[rx_index] == '\n') // 如果接收到回车换行符 { rx_buffer[rx_index] = '\0'; // 将字符串结束符放在末尾 rx_index = 0; // 重置指针 // 处理接收到的字符串 // ... } else { rx_index++; // 指针加1 if (rx_index >= RX_BUFFER_SIZE) // 缓冲区溢出 { rx_index = 0; // 重置指针 } } HAL_UART_Receive_IT(&huart1, &rx_buffer[rx_index], 1); // 继续接收数据 } } int main(void) { // 初始化串口1 __HAL_RCC_USART1_CLK_ENABLE(); huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&huart1); // 开始接收数据 HAL_UART_Receive_IT(&huart1, &rx_buffer[rx_index], 1); while (1) { // 主循环 } } ``` 在这个示例代码中,我们定义了一个接收缓冲区rx_buffer和一个指针rx_index,指针rx_index用来指向缓冲区中下一个可写入数据的位置。当接收到数据时,如果是回车换行符,则将字符串结束符放在末尾,重置指针rx_index,并处理接收到的字符串。如果不是回车换行符,则将指针rx_index加1,如果缓冲区溢出则重置指针rx_index,并继续接收数据。在main函数中,我们初始化了串口1,并开始接收数据。在HAL_UART_RxCpltCallback回调函数中,我们继续调用HAL_UART_Receive_IT函数来继续接收数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值