stm32的flash操作-HAL庫
阿新 • • 發佈:2021-12-08
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燈的亮滅狀況儲存,作為下一次上電使用