近幾天抽空研究了一下STM32的內部Flash操作,總的來說還是比較簡單的。需要注意的是,先了解下STM32內部的地址分配,我使用的是STM32F103RB這個型號,其他型號可參見《STM32參考手冊》,該芯片的地址分配如下:
還需要說明的一點是,我使用的是STM32的庫開發,所以具體的Flash操作也是調用官方的API函數來實現,該接口基本不需要配置,只要保證把庫文件包含在工程中,就可以實現調用了,編寫程序時不需要額外配置相關寄存器什么的。下面是簡單的函數實現,通過簡單的移植即可實現flash的讀寫操作,有任何疑問歡迎交流討論,共同學習。
/****************************************************************
*Function: STM32F103系列內部Flash讀寫操作
*Author: ValerianFan
*Date: 2014/04/09
*E-Mail: fanwenjingnihao@163.com
*Other: 該程序不能直接編譯運行,只包含了Flash讀寫操作
****************************************************************/
#include "stm32f10x.h"
#include "stm32f10x_flash.h" //flash操作接口文件(在庫文件中),必須要包含
#define STARTADDR 0x08010000 //STM32F103RB 其他型號基本適用,未測試
volatile FLASH_Status FLASHStatus = FLASH_COMPLETE; //Flash操作狀態變量
/****************************************************************
*Name: ReadFlashNBtye
*Function: 從內部Flash讀取N字節數據
*Input: ReadAddress:數據地址(偏移地址)ReadBuf:數據指針 ReadNum:讀取字節數
*Output: 讀取的字節數
*Author: ValerianFan
*Date: 2014/04/09
*E-Mail: fanwenjingnihao@163.com
*Other:
****************************************************************/
int ReadFlashNBtye(uint32_t ReadAddress, uint8_t *ReadBuf, int32_t ReadNum)
{
int DataNum = 0;
ReadAddress = (uint32_t)STARTADDR + ReadAddress;
while(DataNum < ReadNum)
{
*(ReadBuf + DataNum) = *(__IO uint8_t*) ReadAddress++;
DataNum++;
}
return DataNum;
}
/****************************************************************
*Name: WriteFlashOneWord
*Function: 向內部Flash寫入32位數據
*Input: WriteAddress:數據地址(偏移地址)WriteData:寫入數據
*Output: NULL
*Author: ValerianFan
*Date: 2014/04/09
*E-Mail: fanwenjingnihao@163.com
*Other:
****************************************************************/
void WriteFlashOneWord(uint32_t WriteAddress,uint32_t WriteData)
{
FLASH_UnlockBank1();
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
FLASHStatus = FLASH_ErasePage(STARTADDR);
if(FLASHStatus == FLASH_COMPLETE)
{
FLASHStatus = FLASH_ProgramWord(STARTADDR + WriteAddress, WriteData); //flash.c 中API函數
//FLASHStatus = FLASH_ProgramWord(StartAddress+4, 0x56780000); //需要寫入更多數據時開啟
//FLASHStatus = FLASH_ProgramWord(StartAddress+8, 0x87650000); //需要寫入更多數據時開啟
}
FLASH_LockBank1();
}
/****************************************************************
*Name: USART1_Send_One
*Function: USART1發送一個字節數據
*Input: Data:待發送數據
*Output: NULL
*Author: ValerianFan
*Date: 2014/04/09
*E-Mail: fanwenjingnihao@163.com
*Other:
****************************************************************/
void USART1_Send_One(u8 Data)
{
USART_SendData(USART1, Data);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
}
/****************************************************************
*Name: main
*Function: 寫入讀取內部flash
*Input: NULL
*Output: NULL
*Author: ValerianFan
*Date: 2014/04/09
*E-Mail: fanwenjingnihao@163.com
*Other:
****************************************************************/
void main(void)
{
uint8_t Temp_Data[20] = {0};
unsigned char Temp = 0;
int ReadNum = 0;
int i = 0;
Dveice_Init(72); //系統初始化,設置時鐘為72M
MCU_USART_Init();
WriteFlashOneWord(0,0x12345678); //寫入數據
Delay_Ms(10);
ReadNum = ReadFlashNBtye(0, Temp_Data,4); //讀取數據
Temp = (unsigned char)ReadNum;
USART1_Send_One(Temp); //發送讀取的字節數
Delay_Ms(10);
while(1)
{
for(i = 0;i < ReadNum;i++)
{
USART1_Send_One(Temp_Data[i]); //發送讀取到的數據,可觀測數據的存儲格式
Delay_Ms(100);
}
}
}
上一篇:flash讀寫簡析(以stm32f107vct6為例)
下一篇:【stm32f103學習筆記】字、半字、字節和sizeof()
推薦閱讀
史海拾趣
博通集成深知技術創新是企業發展的核心動力。因此,公司始終保持高額的研發投入,不斷推動技術創新和產品研發。公司擁有一支專業的研發團隊,具備強大的研發實力和創新能力。通過持續的研發投入和技術創新,博通集成在無線連接芯片設計領域取得了顯著的成果和進展。
隨著產品線的不斷豐富和技術實力的日益增強,GStek開始積極拓展國內外市場。公司采取多元化的市場策略,針對不同客戶群體提供定制化的解決方案。同時,GStek還注重品牌建設,通過參加各類行業展會、舉辦技術研討會等方式,加強與業界的交流與合作,提升品牌知名度和影響力。這些努力使得GStek的產品廣泛應用于各類電子產品中,包括智能手機、平板電腦、筆記本電腦等移動設備以及家電、工控等領域。
GStek登豐微電子成立于2007年,正值中國電子產業快速發展之際。公司自創立之初便明確了其在電源管理領域的戰略定位,專注于為市場提供高效、可靠的電源管理解決方案。通過深入研究市場需求和技術趨勢,GStek迅速開發出包括線性穩壓IC、PWM控制IC、電池保護IC及照明裝置驅動IC在內的核心產品,奠定了其在行業內的技術基礎。這一時期,GStek積極與國內外知名企業建立合作關系,不斷拓展其市場份額。
面對電子行業快速變化的市場環境和日益激烈的競爭態勢,GStek始終保持清醒的頭腦和敏銳的洞察力。公司密切關注行業動態和技術發展趨勢,及時調整戰略方向和產品布局。同時,GStek還注重內部管理和團隊建設,不斷提升員工的綜合素質和專業技能。這些努力使得GStek能夠在復雜多變的市場環境中保持穩健的發展態勢,為實現其成為全球主要電源管理IC設計公司的愿景而不斷努力。
進入21世紀第二個十年,電子行業迎來了前所未有的變革。新技術、新產品的不斷涌現,給傳統企業帶來了巨大挑戰。遠陽公司敏銳地意識到這一點,迅速啟動了轉型升級戰略。公司加大了對新技術、新工藝的研發投入,不斷提升產品的技術含量和附加值。同時,遠陽還積極探索智能制造、綠色生產等新模式,推動企業向高質量發展邁進。這一系列的舉措,使遠陽在激烈的市場競爭中保持了領先地位。
本人在調 CE5.0 + 2410 的 I2C 流驅動,其中 I2C 中斷的 ISR 部分有些看不懂,如下: // // IIC Interrupt // else if ( IntP ...… 查看全部問答∨ |
各位: 我的FLASH是32M 以前NK大小一直是26M,啟動系統后FLASH盤可以識別 現在加的東西多了,我把NK在config.bib中改成28M 啟動系統后看不到FLASH 我添加了組件:FAT 、 ...… 查看全部問答∨ |
本人初二 從小對電子、機械非常感興趣 我現在想學單片機和pcb 求一個師傅叫我 給我引路 我有一個小的51單片機 還有郭天祥的教程 其余的沒什么存貨 父親是做醫療影響的 可以拆東西 如果需要什么 我可以去科技市場買 謝謝了 我想做一個搖搖棒時鐘 ...… 查看全部問答∨ |
|
有些開發人員需要一個便攜的SVN服務器,能夠在不同地點享受到防火墻內的SVN服務。假設有這樣一個小設備:在任何地方,將它接上電源插入網線,外殼上會顯示SVN服務器的IP,然后在你的開發環境中連接到這個IP的SVN就可以檢出或者提交代碼到SVN了^ ^預 ...… 查看全部問答∨ |
快來加入TI 吧! TI上海研發中心招募系統工程師! (Hot) 【支持之外】快來加入TI吧! TI上海研發中心招募系統工程師! (Hot) 您具備下面的工作經驗嗎?您想加入TI大家庭嗎?如果是,別等了,快來申請吧。。。我們期待您的加入! 工作職位:Job ID 5960BR - System Engineer (location: Shanghai R&D c ...… 查看全部問答∨ |