stm32的flash操作-HAL庫


HAL庫手冊上都有寫

 

 

 

 

 

 把一般會用到的,就那幾個函數,上鎖,解鎖,擦除,讀,寫

 

uint32_t addr=0x08005000;

確定好讀寫的地址,注意是32位單片機,變量的類型選對

 

不同單片機有不同的Sector/Page/Bank等概念,這些概念涉及到一次性所能清除區域的大小

 

void FLASH_W(uint32_t addr,uint16_t flash_read){//傳入了需要寫的flash地址,及寫入的內容

       FLASH_EraseInitTypeDef My_Flash;  //聲明 FLASH_EraseInitTypeDef 結構體為 My_Flash
       HAL_FLASH_Unlock();               //解鎖Flash

       My_Flash.TypeErase = FLASH_TYPEERASE_PAGES;  //標明Flash執行頁面只做擦除操作
       My_Flash.PageAddress = addr;  //聲明要擦除的地址
       My_Flash.NbPages = 1;                        //說明要擦除的頁數,此參數必須是Min_Data = 1和Max_Data =(最大頁數-初始頁的值)之間的值

       uint32_t PageError = 0;                    //設置PageError,如果出現錯誤這個變量會被設置為出錯的FLASH地址
       HAL_FLASHEx_Erase(&My_Flash, &PageError);  //調用擦除函數擦除

//       uint16_t Write_Flash_Data = my_add;

       HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, addr, flash_read);//這里要注意寫入的大小范圍,半字?字?雙字?


        HAL_FLASH_Lock(); //鎖住Flash
}

寫的操作涉及到flash的解鎖與上鎖

 

uint16_t flash_read = *(__IO uint16_t*)( addr );

讀的操作就很簡單了,直接取值就行。這里取到的值是半字的,2字節的

 

void FLASH_W(uint32_t addr,uint16_t flash_read){
//  uint32_t Robot_Num_Flash_Add = 0x08005000;

       FLASH_EraseInitTypeDef My_Flash;  //聲明 FLASH_EraseInitTypeDef 結構體為 My_Flash
       HAL_FLASH_Unlock();               //解鎖Flash

       My_Flash.TypeErase = FLASH_TYPEERASE_PAGES;  //標明Flash執行頁面只做擦除操作
       My_Flash.PageAddress = addr;  //聲明要擦除的地址
       My_Flash.NbPages = 1;                        //說明要擦除的頁數,此參數必須是Min_Data = 1和Max_Data =(最大頁數-初始頁的值)之間的值

       uint32_t PageError = 0;                    //設置PageError,如果出現錯誤這個變量會被設置為出錯的FLASH地址
       HAL_FLASHEx_Erase(&My_Flash, &PageError);  //調用擦除函數擦除

//       uint16_t Write_Flash_Data = my_add;

       HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, addr, flash_read);


        HAL_FLASH_Lock(); //鎖住Flash
}
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
    uint32_t addr=0x08005000;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  uint16_t flash_read = *(__IO uint16_t*)( addr );
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, flash_read);
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
      //有鎖存
      if(!HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)){
          HAL_Delay(20);
          if(!HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)){
              //HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
              flash_read=~flash_read;
              HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, flash_read);
              FLASH_W(addr,flash_read);
              while(!HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0));
          }
      }
  }
  /* USER CODE END 3 */
}

實現功能,每次上電讀取特定地址里的值,作為led燈的亮滅取值。且每次按鈕按下,將led燈的亮滅狀況保存,作為下一次上電使用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM