日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

stm32 Flash读写[库函数]

發布時間:2025/3/17 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 stm32 Flash读写[库函数] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
stm32 的內置可編程Flash在許多場合具有十分重要的意義。如其支持ICP特性使得開發人員對stm32可以警醒調試開發,可以通過JTAG和SWD接口對stm32進行程序燒寫;支持IAP特性使得開發人員可以在stm32運行程序的時候對其內部程序進行更新操作。對一些對數據安全有要求的場合,可編程FLASH可以結合stm32內部唯一的身份標識實現各種各樣的防破解方案。并且stm32的FLASH在一些輕量級的防掉電存儲方案中也有立足之地。 ? 一. stm32的FLASH分為 1.主存儲塊:用于保存具體的程序代碼用戶數據,主存儲塊是以頁為單位劃分的,       一頁大小為1KB。范圍為從地址0x08000000開始的128KB內。 2.信息塊 ? :用于負責由stm32出廠是放置2KB的啟動程序(Bootloader)和512B的用戶配置信息區 二.操作原則 對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);//Enables or disables the Internal High Speed oscillator (HSI).

?FLASH_Unlock();  /* Unlocks the FLASH Program Erase Controller.*/

/*將flash三個標志位全清*/

?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读写[库函数]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。