1. 程式人生 > 其它 >stm32的flash操作-HAL庫

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燈的亮滅狀況儲存,作為下一次上電使用