stm32 Flash讀寫[庫函數]

來源:互聯網
上載者:User

標籤:style   io   ar   color   sp   for   on   資料   div   

stm32 的內建可程式化Flash在許多場合具有十分重要的意義。如其支援ICP特性使得開發人員對stm32可以警醒調試開發,可以通過JTAG和SWD介面對stm32進行程式燒寫;支援IAP特性使得開發人員可以在stm32運行程式的時候對其內部程式進行更新操作。對一些對資料安全有要求的場合,可程式化FLASH可以結合stm32內部唯一的身份標識實現各種各樣的防破解方案。並且stm32的FLASH在一些輕量級的防掉電儲存方案中也有立足之地。         stm32的FLASH分為主儲存塊和資訊塊。主儲存塊用於儲存具體的程式碼和使用者資料,資訊塊用於負責由stm32出廠是放置2KB的啟動程式(Bootloader)和512B的使用者配置資訊區。     主儲存塊是以頁為單位劃分的,一頁大小為1KB。範圍為從地址0x08000000開始的128KB內。     對Flash 的寫入操作要 “先擦除後寫入”的原則;    stm32的內建flash 編程操作都是以頁為單位寫入的,而寫入的操作必須要以16位半字寬度資料位元單位,允許跨頁寫,寫入非16位元據時將導致stm32內部匯流排錯誤。    進行內建flash讀寫時,必須要開啟內部Rc振蕩器。

#include "stm32f10x.h"
#include "stdio.h"

#define  PRINTF_ON  1

void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(void);

u32 count=0;

u16 data[5]={0x0001,0x0002,0x0003,0x0004,0x0005};

int main(void)
{
   RCC_Configuration();
 GPIO_Configuration();
 USART_Configuration();

 RCC_HSICmd(ENABLE);

 FLASH_Unlock();

 FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);

 FLASH_ErasePage(0x8002000);

 while(count < 5)
 {
  FLASH_ProgramHalfWord((0x8002000 +count*2),data[count]);  //flash  為一個位元組儲存,16位元據必須地址加2

  count++;
 
 }

 FLASH_Lock();

 count = 0;

 printf("\r\n The Five Data Is : \r\n");

 while(count < 5)
 {
  
  printf("\r %d \r",*(u8 *)(0x8002000 + count*2));   //讀取方法

  count++;
 

 }

 while(1);
 
}

void GPIO_Configuration(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   
   GPIO_Init(GPIOA , &GPIO_InitStructure); 
 
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   
   GPIO_Init(GPIOA , &GPIO_InitStructure); 
}

void RCC_Configuration(void)
{
 /* 定義枚舉類型變數 HSEStartUpStatus */
 ErrorStatus HSEStartUpStatus;

   /* 複位系統時鐘設定*/
   RCC_DeInit();
   /* 開啟HSE*/
   RCC_HSEConfig(RCC_HSE_ON);
   /* 等待HSE起振並穩定*/
   HSEStartUpStatus = RCC_WaitForHSEStartUp();
 /* 判斷HSE起是否振成功,是則進入if()內部 */
   if(HSEStartUpStatus == SUCCESS)
   {
     /* 選擇HCLK(AHB)時鐘源為SYSCLK 1分頻 */
     RCC_HCLKConfig(RCC_SYSCLK_Div1); 
     /* 選擇PCLK2時鐘源為 HCLK(AHB) 1分頻 */
     RCC_PCLK2Config(RCC_HCLK_Div1); 
     /* 選擇PCLK1時鐘源為 HCLK(AHB) 2分頻 */
     RCC_PCLK1Config(RCC_HCLK_Div2);
     /* 設定FLASH延時周期數為2 */
     FLASH_SetLatency(FLASH_Latency_2);
     /* 使能FLASH預取緩衝 */
     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
     /* 選擇鎖相環(PLL)時鐘源為HSE 1分頻,倍頻數為9,則PLL輸出頻率為 8MHz * 9 = 72MHz */
     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
     /* 使能PLL */ 
     RCC_PLLCmd(ENABLE);
     /* 等待PLL輸出穩定 */
     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
     /* 選擇SYSCLK時鐘源為PLL */
     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
     /* 等待PLL成為SYSCLK時鐘源 */
     while(RCC_GetSYSCLKSource() != 0x08);
   } 
   /* 開啟APB2匯流排上的GPIOA時鐘*/
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, ENABLE);

 //RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

 //RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
 //RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP|RCC_APB1Periph_WWDG, ENABLE);
  
}

 
void USART_Configuration(void)
{
 USART_InitTypeDef USART_InitStructure;
 USART_ClockInitTypeDef USART_ClockInitStructure;

 USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
 USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
 USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;                                                                                                                                                      
 USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
 USART_ClockInit(USART1 , &USART_ClockInitStructure);

 USART_InitStructure.USART_BaudRate = 9600;
 USART_InitStructure.USART_WordLength = USART_WordLength_8b;
 USART_InitStructure.USART_StopBits = USART_StopBits_1;
 USART_InitStructure.USART_Parity = USART_Parity_No;
 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
 USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
 USART_Init(USART1,&USART_InitStructure);

  USART_Cmd(USART1,ENABLE);
}

#if  PRINTF_ON

int fputc(int ch,FILE *f)
{
 USART_SendData(USART1,(u8) ch);
 while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);
 return ch;
}

#endif

stm32 Flash讀寫[庫函數]

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.