99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

第二十九章 讀寫內(nèi)部FLASH

W55MH32 ? 來源:W55MH32 ? 作者:W55MH32 ? 2025-06-20 14:09 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

單芯片解決方案,開啟全新體驗(yàn)——W55MH32 高性能以太網(wǎng)單片機(jī)

W55MH32是WIZnet重磅推出的高性能以太網(wǎng)單片機(jī),它為用戶帶來前所未有的集成化體驗(yàn)。這顆芯片將強(qiáng)大的組件集于一身,具體來說,一顆W55MH32內(nèi)置高性能Arm? Cortex-M3核心,其主頻最高可達(dá)216MHz;配備1024KB FLASH與96KB SRAM,滿足存儲(chǔ)與數(shù)據(jù)處理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP協(xié)議棧、內(nèi)置MAC以及PHY,擁有獨(dú)立的32KB以太網(wǎng)收發(fā)緩存,可供8個(gè)獨(dú)立硬件socket使用。如此配置,真正實(shí)現(xiàn)了All-in-One解決方案,為開發(fā)者提供極大便利。

在封裝規(guī)格上,W55MH32 提供了兩種選擇:QFN100和QFN68。

W55MH32L采用QFN100封裝版本,尺寸為12x12mm,其資源豐富,專為各種復(fù)雜工控場(chǎng)景設(shè)計(jì)。它擁有66個(gè)GPIO、3個(gè)ADC、12通道DMA、17個(gè)定時(shí)器、2個(gè)I2C、5個(gè)串口、2個(gè)SPI接口(其中1個(gè)帶I2S接口復(fù)用)、1個(gè)CAN、1個(gè)USB2.0以及1個(gè)SDIO接口。如此豐富的外設(shè)資源,能夠輕松應(yīng)對(duì)工業(yè)控制中多樣化的連接需求,無論是與各類傳感器、執(zhí)行器的通信,還是對(duì)復(fù)雜工業(yè)協(xié)議的支持,都能游刃有余,成為復(fù)雜工控領(lǐng)域的理想選擇。 同系列還有QFN68封裝的W55MH32Q版本,該版本體積更小,僅為8x8mm,成本低,適合集成度高的網(wǎng)關(guān)模組等場(chǎng)景,軟件使用方法一致。更多信息和資料請(qǐng)進(jìn)入網(wǎng)站或者私信獲取。

此外,本W(wǎng)55MH32支持硬件加密算法單元,WIZnet還推出TOE+SSL應(yīng)用,涵蓋TCP SSL、HTTP SSL以及 MQTT SSL等,為網(wǎng)絡(luò)通信安全再添保障。

為助力開發(fā)者快速上手與深入開發(fā),基于W55MH32L這顆芯片,WIZnet精心打造了配套開發(fā)板。開發(fā)板集成WIZ-Link芯片,借助一根USB C口數(shù)據(jù)線,就能輕松實(shí)現(xiàn)調(diào)試、下載以及串口打印日志等功能。開發(fā)板將所有外設(shè)全部引出,拓展功能也大幅提升,便于開發(fā)者全面評(píng)估芯片性能。

若您想獲取芯片和開發(fā)板的更多詳細(xì)信息,包括產(chǎn)品特性、技術(shù)參數(shù)以及價(jià)格等,歡迎訪問官方網(wǎng)頁,我們期待與您共同探索W55MH32的無限可能。

wKgZPGgbOfaANhwzACodXd3sVzg463.png

第二十九章 讀寫內(nèi)部FLASH

1 W55MH32的內(nèi)部FLASH簡(jiǎn)介

在W55MH32芯片內(nèi)部有一個(gè)FLASH存儲(chǔ)器,它主要用于存儲(chǔ)代碼,我們?cè)?a href="http://www.socialnewsupdate.com/v/tag/1247/" target="_blank">電腦上編寫好應(yīng)用程序后,使用下載器把編譯后的代碼文件燒錄到該內(nèi)部FLASH中, 由于FLASH存儲(chǔ)器的內(nèi)容在掉電后不會(huì)丟失,芯片重新上電復(fù)位后,內(nèi)核可從內(nèi)部FLASH中加載代碼并運(yùn)行, 見下圖,W55MH32的內(nèi)部框架圖:

wKgZPGgxkfmAS3iZAAK3fTAcTqw989.png

除了使用外部的工具(如下載器)讀寫內(nèi)部FLASH外,W55MH32芯片在運(yùn)行的時(shí)候,也能對(duì)自身的內(nèi)部FLASH進(jìn)行讀寫,因此, 若內(nèi)部FLASH存儲(chǔ)了應(yīng)用程序后還有剩余的空間,我們可以把它像外部SPI-FLASH那樣利用起來,存儲(chǔ)一些程序運(yùn)行時(shí)產(chǎn)生的需要掉電保存的數(shù)據(jù)。

由于訪問內(nèi)部FLASH的速度要比外部的SPI-FLASH快得多,所以在緊急狀態(tài)下常常會(huì)使用內(nèi)部FLASH存儲(chǔ)關(guān)鍵記錄;為了防止應(yīng)用程序被抄襲, 有的應(yīng)用會(huì)禁止讀寫內(nèi)部FLASH中的內(nèi)容,或者在第一次運(yùn)行時(shí)計(jì)算加密信息并記錄到某些區(qū)域,然后刪除自身的部分加密代碼,這些應(yīng)用都涉及到內(nèi)部FLASH的操作。

1.1 內(nèi)部FLASH的構(gòu)成

W55MH32的內(nèi)部FLASH包含主存儲(chǔ)器、系統(tǒng)存儲(chǔ)器以及選項(xiàng)字節(jié)區(qū)域, 它們的地址分布及大小見下表,W55MH32大容量產(chǎn)品內(nèi)部FLASH的構(gòu)成:

模塊 名稱 地址 大小
主存儲(chǔ)塊 頁 0 0x0800 0000 - 0x0800 07FF 2K
頁 1 0x0800 0800 - 0x0800 0FFF 2K
頁 2 0x0800 1000 - 0x0800 17FF 2K
頁 3 0x0800 1800 - 0x0800 1FFF 2K
頁 255 0x0807 F800 - 0x0807 FFFF 2K
信息塊 系統(tǒng)存儲(chǔ)器 0x1FFF F000 - 0x1FFF F7FF 2K
選擇字節(jié) 0x1FFF F000 - 0x1FFF F7FF 16
閃存存儲(chǔ)器接口寄存器 FLASH_ACR 0x4002 2000 - 0x4002 2003 4
FALSH_KEYR 0x4002 2004 - 0x4002 2007 4
FLASH_OPTKEYR 0x4002 2008 - 0x4002 200B 4
FLASH_SR 0x4002 200C - 0x4002 200F 4
FLASH_CR 0x4002 2010 - 0x4002 2013 4
FLASH_AR 0x4002 2014 - 0x4002 2017 4
保留 0x4002 2018 - 0x4002 201F 4
FLASH_OBR 0x4002 201C - 0x4002 201F 4
FLASH_WRPR 0x4002 2020 - 0x4002 2023 4

主存儲(chǔ)

型號(hào) W55MH32L W55MH32Q
Flash (KB) 1024 1024
SRAM (KB) 96 96
定時(shí)器
高級(jí) 2 2
通用 10 10
基本 2 2
通信接口
SPI 2 2
I2C 2 2
USART/UART 5 3
USB 1 1
CAN 1 1
SDIO 1 -
Ethernet 1 1
GPIO 端口 66 36
12 位 ADC (通道數(shù)) 3(12 個(gè)通道) 3(12 個(gè)通道)
12 位 DAC (通道數(shù)) 2(2 個(gè)通道) 2(2 個(gè)通道)
隨機(jī)數(shù)模塊 支持 支持
硬件加密算法單元 支持 支持
頁大小 (K 字節(jié)) 4 4
CPU 頻率 216M 216M
工作電壓 2.0-3.6V 2.0-3.6V
工作溫度 -40-+85℃ -40-+85℃

系統(tǒng)存儲(chǔ)區(qū)

系統(tǒng)存儲(chǔ)區(qū)是用戶不能訪問的區(qū)域,它在芯片出廠時(shí)已經(jīng)固化了啟動(dòng)代碼,它負(fù)責(zé)實(shí)現(xiàn)串口、USB以及CAN等ISP燒錄功能。

選項(xiàng)字節(jié)

選項(xiàng)字節(jié)用于配置FLASH的讀寫保護(hù)、待機(jī)/停機(jī)復(fù)位、軟件/硬件看門狗等功能,這部分共16字節(jié)??梢酝ㄟ^修改FLASH的選項(xiàng)控制寄存器修改。

2 對(duì)內(nèi)部FLASH的寫入過程

2.1 解鎖

由于內(nèi)部FLASH空間主要存儲(chǔ)的是應(yīng)用程序,是非常關(guān)鍵的數(shù)據(jù),為了防止誤操作修改了這些內(nèi)容,芯片復(fù)位后默認(rèn)會(huì)給控制寄存器FLASH_CR上鎖, 這個(gè)時(shí)候不允許設(shè)置FLASH的控制寄存器,從而不能修改FLASH中的內(nèi)容。

2.2 頁擦除

在寫入新的數(shù)據(jù)前,需要先擦除存儲(chǔ)區(qū)域,W55MH32提供了頁(扇區(qū))擦除指令和整個(gè)FLASH擦除(批量擦除)的指令,批量擦除指令僅針對(duì)主存儲(chǔ)區(qū)。

頁擦除的過程如下:

檢查 FLASH_SR 寄存器中的“忙碌寄存器位 BSY”,以確認(rèn)當(dāng)前未執(zhí)行任何 Flash 操作;

在 FLASH_CR 寄存器中,將“激活頁擦除寄存器位PER ”置 1;

用FLASH_AR寄存器選擇要擦除的頁;

將 FLASH_CR 寄存器中的“開始擦除寄存器位 STRT ”置 1,開始擦除;

等待 BSY 位被清零時(shí),表示擦除完成。

2.3 寫入數(shù)據(jù)

擦除完畢后即可寫入數(shù)據(jù),寫入數(shù)據(jù)的過程并不是僅僅使用指針向地址賦值,賦值前還還需要配置一系列的寄存器,步驟如下:

檢查 FLASH_SR 中的 BSY 位,以確認(rèn)當(dāng)前未執(zhí)行任何其它的內(nèi)部 Flash 操作;

將 FLASH_CR 寄存器中的 “激活編程寄存器位PG” 置 1;

向指定的FLASH存儲(chǔ)器地址執(zhí)行數(shù)據(jù)寫入操作,每次只能以16位的方式寫入;

等待 BSY 位被清零時(shí),表示寫入完成。

3 查看工程的空間分布

由于內(nèi)部FLASH本身存儲(chǔ)有程序數(shù)據(jù),若不是有意刪除某段程序代碼,一般不應(yīng)修改程序空間的內(nèi)容, 所以在使用內(nèi)部FLASH存儲(chǔ)其它數(shù)據(jù)前需要了解哪一些空間已經(jīng)寫入了程序代碼,存儲(chǔ)了程序代碼的扇區(qū)都不應(yīng)作任何修改。 通過查詢應(yīng)用程序編譯時(shí)產(chǎn)生的“*.map”后綴文件,可以了解程序存儲(chǔ)到了哪些區(qū)域, 它在工程中的打開方式見下圖,打開工程的map文件 , 也可以到工程目錄中的“Listing”文件夾中找到,關(guān)于map文件的詳細(xì)說明可參考《MDK的編譯過程及文件類型》章節(jié)。

wKgZPGgxkfmAXuU6AAHJXtT-GG4757.png

3.1 程序ROM的加載與執(zhí)行空間

上述說明中有兩段分別以“Load Region LR_ROM1”及“Execution Region ER_IROM1”開頭的內(nèi)容, 它們分別描述程序的加載及執(zhí)行空間。 在芯片剛上電運(yùn)行時(shí),會(huì)加載程序及數(shù)據(jù),例如它會(huì)從程序的存儲(chǔ)區(qū)域加載到程序的執(zhí)行區(qū)域,還把一些已初始化的全局變量從ROM復(fù)制到RAM空間, 以便程序運(yùn)行時(shí)可以修改變量的內(nèi)容。加載完成后,程序開始從執(zhí)行區(qū)域開始執(zhí)行。

在上面map文件的描述中,我們了解到加載及執(zhí)行空間的基地址(Base)都是0x08000000,它正好是W55MH32內(nèi)部FLASH的首地址, 即W55MH32的程序存儲(chǔ)空間就直接是執(zhí)行空間;它們的大小(Size)分別為0x000017a8及0x0000177c, 執(zhí)行空間的ROM比較小的原因就是因?yàn)椴糠諶W-data類型的變量被拷貝到RAM空間了; 它們的最大空間(Max)均為0x00080000,即512K字節(jié),它指的是內(nèi)部FLASH的最大空間。

計(jì)算程序占用的空間時(shí),需要使用加載區(qū)域的大小進(jìn)行計(jì)算,本例子中應(yīng)用程序使用的內(nèi)部FLASH是從0x08000000至(0x08000000+0x000017a8)地址的空間區(qū)域。

3.2 ROM空間分布表

在加載及執(zhí)行空間總體描述之后,緊接著一個(gè)ROM詳細(xì)地址分布表,它列出了工程中的各個(gè)段(如函數(shù)、常量數(shù)據(jù))所在的地址BaseAddr及占用的空間Size, 列表中的Type說明了該段的類型,CODE表示代碼,DATA表示數(shù)據(jù),而PAD表示段之間的填充區(qū)域,它是無效的內(nèi)容, PAD區(qū)域往往是為了解決地址對(duì)齊的問題。

觀察表中的最后一項(xiàng),它的基地址是0x0800175c,大小為0x00000020,可知它占用的最高的地址空間為0x0800177c,跟執(zhí)行區(qū)域的最高地址0x0000177c一樣, 但它們比加載區(qū)域說明中的最高地址0x80017a8要小,所以我們以加載區(qū)域的大小為準(zhǔn)。 對(duì)比表 W55MH32大容量產(chǎn)品內(nèi)部FLASH的構(gòu)成 的內(nèi)部FLASH頁地址分布表, 可知僅使用頁0至頁2就可以完全存儲(chǔ)本應(yīng)用程序,所以從頁3(地址0x08001800)后的存儲(chǔ)空間都可以作其它用途,使用這些存儲(chǔ)空間時(shí)不會(huì)篡改應(yīng)用程序空間的數(shù)據(jù)。

4 操作內(nèi)部FLASH的庫函數(shù)

為簡(jiǎn)化編程,W55MH32標(biāo)準(zhǔn)庫提供了一些庫函數(shù),它們封裝了對(duì)內(nèi)部FLASH寫入數(shù)據(jù)操作寄存器的過程。

4.1 FLASH解鎖、上鎖函數(shù)

對(duì)內(nèi)部FLASH解鎖、上鎖的函數(shù)見代碼清單:FLASH-2:

代碼清單:FLASH-2 FLASH解鎖、上鎖

#define FLASH_KEY1               ((uint32_t)0x45670123)
#define FLASH_KEY2               ((uint32_t)0xCDEF89AB)
/**
* @brief  對(duì)FLASH控制寄存器解鎖,使能訪問
* @param  None
* @retval None
*/
void FLASH_Unlock(void)
{
    if ((FLASH->CR & FLASH_CR_LOCK) != RESET) {
        /* 寫入確認(rèn)驗(yàn)證碼 */
        FLASH->KEYR = FLASH_KEY1;
        FLASH->KEYR = FLASH_KEY2;
    }
}

/**
* @brief  對(duì)FLASH控制寄存器上鎖,禁止訪問
* @param  None
* @retval None
*/
void FLASH_Lock(void)
{
    /* 設(shè)置FLASH寄存器的LOCK位 */
    FLASH->CR |= FLASH_CR_LOCK;
}

解鎖的時(shí)候,它對(duì)FLASH_KEYR寄存器寫入兩個(gè)解鎖參數(shù),上鎖的時(shí)候,對(duì)FLASH_CR寄存器的FLASH_CR_LOCK位置1。

4.2 設(shè)置操作位數(shù)及頁擦除

解鎖后擦除扇區(qū)時(shí)可調(diào)用FLASH_EraseSector完成,見代碼清單:FLASH-3:

代碼清單:FLASH-3 擦除扇區(qū)

/**
* @brief  擦除指定的頁
* @param  Page_Address: 要擦除的頁地址.
* @retval FLASH Status:
            可能的返回值: FLASH_BUSY, FLASH_ERROR_PG,
*           FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
*/
FLASH_Status FLASH_ErasePage(uint32_t Page_Address)
{
    FLASH_Status status = FLASH_COMPLETE;
    /* 檢查參數(shù) */
    assert_param(IS_FLASH_ADDRESS(Page_Address));
    /*...此處省略XL超大容量芯片的控制部分*/
    /* 等待上一次操作完成 */
    status = FLASH_WaitForLastOperation(EraseTimeout);

    if (status == FLASH_COMPLETE) {
        /* 若上次操作完成,則開始頁擦除 */
        FLASH->CR|= CR_PER_Set;
        FLASH->AR = Page_Address;
        FLASH->CR|= CR_STRT_Set;

        /* 等待操作完成 */
        status = FLASH_WaitForLastOperation(EraseTimeout);

        /* 復(fù)位 PER 位 */
        FLASH->CR &= CR_PER_Reset;
    }

    /* 返回擦除結(jié)果 */
    return status;
}

本函數(shù)包含一個(gè)輸入?yún)?shù)用于設(shè)置要擦除的頁地址,即目標(biāo)頁的在內(nèi)部FALSH的首地址,函數(shù)獲取地址后,根據(jù)前面的流程檢查狀態(tài)位、 向控制寄存器FLASH_CR及地址寄存器FLASH_AR寫入?yún)?shù),配置開始擦除后,需要等待一段時(shí)間,函數(shù)中使用使用FLASH_WaitForLastOperation()等待, 擦除完成的時(shí)候才會(huì)退出FLASH_EraseSector()函數(shù)。

4.3 寫入數(shù)據(jù)

對(duì)內(nèi)部FLASH寫入數(shù)據(jù)不像對(duì)SDRAM操作那樣直接指針操作就完成了,還要設(shè)置一系列的寄存器, 利用FLASH_ProgramWord()和FLASH_ProgramHalfWord()函數(shù)可按字、半字的單位單位寫入數(shù)據(jù), 見代碼清單:FLASH-4:

代碼清單:FLASH-4 寫入數(shù)據(jù)

/**
* @brief  向指定的地址寫入一個(gè)字的數(shù)據(jù)(32位)
* @param  Address: 要寫入的地址
* @param  Data: 要寫入的數(shù)據(jù)
* @retval FLASH Status:
        可能的返回值: FLASH_ERROR_PG,
*           FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
*/
FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data)
{
    FLASH_Status status = FLASH_COMPLETE;
    __IO uint32_t tmp = 0;

    /* 檢查參數(shù) */
    assert_param(IS_FLASH_ADDRESS(Address));
    /*...此處省略XL超大容量芯片的控制部分*/
    /* Wait for last operation to be completed */
    status = FLASH_WaitForLastOperation(ProgramTimeout);

    if (status == FLASH_COMPLETE) {
        /* 若上次操作完成,則開始頁入低16位的數(shù)據(jù)(輸入?yún)?shù)的第1部分) */
        FLASH->CR |= CR_PG_Set;

        *(__IO uint16_t*)Address = (uint16_t)Data;
        /* 等待上一次操作完成 */
        status = FLASH_WaitForLastOperation(ProgramTimeout);

        if (status == FLASH_COMPLETE) {
            /* 若上次操作完成,則開始頁入高16位的數(shù)據(jù)(輸入?yún)?shù)的第2部分) */
            tmp = Address + 2;

            *(__IO uint16_t*) tmp = Data >> 16;

            /* 等待操作完成 */
            status = FLASH_WaitForLastOperation(ProgramTimeout);

            /* 復(fù)位 PG 位  */
            FLASH->CR &= CR_PG_Reset;
        } else {
            /* 復(fù)位 PG 位 */
            FLASH->CR &= CR_PG_Reset;
        }
    }

    /* 返回寫入結(jié)果 */
    return status;
}

從函數(shù)代碼可了解到,它設(shè)置FLASH->CR 寄存器的PG位允許寫入后,使用16位的指針往指定的地址寫入數(shù)據(jù),由于每次只能按16位寫入, 所以這個(gè)按字寫入的過程使用了兩次指針賦值,分別寫入指定數(shù)據(jù)的低16位和高16位,每次賦值操作后,調(diào)用FLASH_WaitForLastOperation()函數(shù)等待寫操作完畢。 標(biāo)準(zhǔn)庫里還提供了FLASH_ProgramHalfWord()函數(shù)用于每次寫入半個(gè)字,即16位,該函數(shù)內(nèi)部的執(zhí)行過程類似。

5 讀寫內(nèi)部FLASH

5.1 代碼分析

1.宏定義

#define FLASH_TEST_ADDR (0x0800F400) // 測(cè)試用Flash地址(32KB處)

地址選擇:需確保該地址未被程序代碼占用,且屬于可擦寫區(qū)域。

2.主函數(shù)邏輯

int main(void)
{
    // 初始化系統(tǒng)時(shí)鐘、串口等
    delay_init();
    UART_Configuration(115200);
    printf("系統(tǒng)時(shí)鐘信息...");

    while (1)
    {
        FLASH_EraseProgram(number++); // 執(zhí)行擦除編程測(cè)試
        if (number == 0xFFFFFFFF)    // 防止溢出,結(jié)束測(cè)試
        {
            printf("Test Endn");
            while (1);
        }
    }
}

無限循環(huán):持續(xù)測(cè)試,直到number溢出。

3.FLASH 擦除與編程函數(shù)

void FLASH_EraseProgram(uint32_t number)
{
    // 1. 擦除頁測(cè)試
    SYSTICK_Reset();
    FLASH_ErasePage(FLASH_TEST_ADDR);
    if (擦除成功)
        printf("擦除時(shí)間:%d msn", 計(jì)算時(shí)間);
    else
        進(jìn)入死循環(huán);

    // 2. 編程半字測(cè)試
    SYSTICK_Reset();
    for (i = 0; i < 512; i++)
        FLASH_ProgramHalfWord(地址+i*2, 0x5A5A);
    if (編程成功)
        printf("編程時(shí)間:%d msn", 計(jì)算時(shí)間);
    else
        進(jìn)入死循環(huán);
}

擦除操作:使用FLASH_ErasePage擦除整頁(通常為 2KB)。

編程操作:逐個(gè)半字寫入0x5A5A,驗(yàn)證寫入正確性。

4.時(shí)間測(cè)量函數(shù)

void SYSTICK_Reset(void)
{
    SysTick->CTRL = 0;          // 停止定時(shí)器
    SysTick->LOAD = 0xFFFFFF;   // 最大計(jì)數(shù)值
    SysTick->VAL = 0;           // 清零當(dāng)前值
    SysTick->CTRL = 0x05;       // 使能定時(shí)器,選擇HCLK時(shí)鐘
}

時(shí)間計(jì)算:通過0xFFFFFF - SysTick->VAL得到操作耗時(shí)(單位:時(shí)鐘周期)。

5. 串口配置函數(shù)

void UART_Configuration(uint32_t bound)
{
    // 使能USART1和GPIOA時(shí)鐘
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

    // 配置TX引腳(PA9)為復(fù)用推挽輸出
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 初始化USART1參數(shù)(波特率、數(shù)據(jù)位等)
    USART_Init(USART_TEST, &USART_InitStructure);
    USART_Cmd(USART_TEST, ENABLE);
}

功能:配置 USART1 為 115200 波特率,用于調(diào)試輸出。

5.2 下載驗(yàn)證

wKgZPGgxkfmAdwIdAACWkz8UPsQ191.png

6 FLASH_Eeprom

6.1 代碼分析

1.主函數(shù) main()

int main(void) {
    uint8_t datatemp[SIZE], i;
    delay_init();
    UART_Configuration(115200);
    // 打印系統(tǒng)時(shí)鐘信息
    RCC_GetClocksFreq(&clocks);
    printf("SYSCLK: %3.1fMhz...n", ...);
    printf("FLASH EEPROM Tset.n");
    // 循環(huán)讀寫FLASH
    while (1) {
        WIZFLASH_Write(FLASH_SAVE_ADDR, (u16 *)TEXT_Buffer, SIZE); // 寫入數(shù)據(jù)
        WIZFLASH_Read(FLASH_SAVE_ADDR, (u16 *)datatemp, SIZE);    // 讀取數(shù)據(jù)
        // 打印錯(cuò)誤(應(yīng)逐個(gè)字符處理)
        for (i = 0; i < SIZE; i++) {
            printf("%sn", datatemp);         }
        memset(datatemp, 0x00, sizeof(datatemp)); // 清空數(shù)組
        delay_ms(1000); // 延時(shí)
    }
}

2.串口配置 UART_Configuration

void UART_Configuration(uint32_t bound) {
    // 使能時(shí)鐘
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
    // 配置串口引腳
    GPIO_Init(GPIOA, &GPIO_InitStructure); // PA9(發(fā)送)復(fù)用推挽,PA10(接收)浮空輸入
    // 配置串口參數(shù):115200波特率、8位數(shù)據(jù)等
    USART_Init(USART1, &USART_InitStructure);
    USART_Cmd(USART1, ENABLE); // 使能串口
}

配置 USART1,用于輸出調(diào)試信息。

3.串口重定向

int SER_PutChar(int ch) {
    while (!USART_GetFlagStatus(USART1, USART_FLAG_TC)); // 等待發(fā)送完成
    USART_SendData(USART1, (uint8_t)ch);
    return ch;
}
int fputc(int c, FILE *f) {
    if (c == 'n') SER_PutChar('r'); // 換行處理
    return SER_PutChar(c); // 實(shí)現(xiàn)printf通過串口輸出
}

4. FLASH 操作

依賴eeprom.h的WIZFLASH_Write和WIZFLASH_Read,需確保其實(shí)現(xiàn) FLASH 底層操作(擦除、讀寫等)。

地址:FLASH_SAVE_ADDR 0X08008000,需在可用 FLASH 空間內(nèi)。

6.2 下載驗(yàn)證

wKgZO2gxkfmAQcJlAACl42trMJs297.png

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6067

    文章

    44967

    瀏覽量

    649072
  • FlaSh
    +關(guān)注

    關(guān)注

    10

    文章

    1675

    瀏覽量

    151387
  • 存儲(chǔ)器
    +關(guān)注

    關(guān)注

    38

    文章

    7644

    瀏覽量

    166913
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3298

    瀏覽量

    117645
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    【ZYNQ Ultrascale+ MPSOC FPGA教程】第二十九章PL端AXI GPIO的使用

    使用zynq最大的疑問就是如何把PS和PL結(jié)合起來使用,在其他的SOC芯片中一般都會(huì)有GPIO,本實(shí)驗(yàn)使用一個(gè)AXI GPIO的IP核,讓PS端通過AXI總線控制PL端的LED燈,實(shí)驗(yàn)雖然簡(jiǎn)單,不過可以讓我們了解PL和PS是如何結(jié)合的。
    的頭像 發(fā)表于 02-01 10:06 ?7258次閱讀
    【ZYNQ Ultrascale+ MPSOC FPGA教程】<b class='flag-5'>第二十九章</b>PL端AXI GPIO的使用

    《DNK210使用指南 -CanMV版 V1.0》第二十九章 音頻錄制實(shí)驗(yàn)

    第二十九章 音頻錄制實(shí)驗(yàn) 本章將介紹CanMV下的音頻錄制通過CanMV提供的模塊便能快速地實(shí)現(xiàn)音頻錄制。通過本章的學(xué)習(xí),讀者將學(xué)習(xí)到CanMV下控制I2S獲取音頻數(shù)和audio模塊的使用。本章分為
    發(fā)表于 10-26 14:16

    PCB設(shè)計(jì)規(guī)范2010最新版

    設(shè)備內(nèi)部的布線第十六篇屏蔽電纜的接地第十七篇如何提高電子產(chǎn)品的抗干擾能力和電磁兼容性第十八篇DSP 系統(tǒng)的降噪技術(shù) 第十九篇PowerPCB 在印制電路板設(shè)計(jì)中的應(yīng)用技術(shù)第二十篇PCB 互連設(shè)計(jì)過程中
    發(fā)表于 04-29 17:50

    眾想科技-劉洋邊講邊寫STM32視頻教程 15.RS232串口通訊實(shí)驗(yàn)

    時(shí)鐘實(shí)驗(yàn) 錄制完成 第二十八講 STM32低功耗的工作原理與實(shí)驗(yàn) 錄制完成 第二十九講 STM32內(nèi)部溫度傳感器工作原理與實(shí)驗(yàn) 錄制完成 第三十講 STM32獨(dú)立看門狗的工作原理與實(shí)驗(yàn) 錄制完成 第三十
    發(fā)表于 10-12 11:16

    《BOSCH汽車電氣與電子 》(中文第一版)(完整版)

    的信號(hào)處理第二十八章 氣車上的數(shù)據(jù)處理第二十九章 各電子系統(tǒng)間的數(shù)據(jù)傳輸?shù)谌?縮略語后記 補(bǔ)充內(nèi)容 (2018-11-1 22:22): 需要下載等朋友,麻煩點(diǎn)個(gè)贊,留個(gè)言在走,謝謝`
    發(fā)表于 10-30 23:58

    「正點(diǎn)原子Linux連載」第二十九章LCD背光調(diào)節(jié)實(shí)驗(yàn)

    1)實(shí)驗(yàn)平臺(tái):正點(diǎn)原子Linux開發(fā)板2)摘自《正點(diǎn)原子I.MX6U嵌入式Linux驅(qū)動(dòng)開發(fā)指南》關(guān)注官方微信號(hào)公眾號(hào),獲取更多資料:正點(diǎn)原子第二十九章LCD背光調(diào)節(jié)實(shí)驗(yàn) 不管是使用顯示器還是手機(jī)
    發(fā)表于 01-15 10:52

    「正點(diǎn)原子STM32Mini板資料連載」第二十九章 無線通信實(shí)驗(yàn)

    號(hào),獲取更多資料:正點(diǎn)原子第二十九章 無線通信實(shí)驗(yàn)ALIENTKEMiniSTM32 開發(fā)板帶有一個(gè) 2.4G 無線模塊(NRF24L01 模塊)通信接口,采用8 腳插針方式與開發(fā)板連接。本章我們將以
    發(fā)表于 04-13 10:33

    「正點(diǎn)原子NANO STM32F103開發(fā)板資料連載」第二十九章 內(nèi)存管理實(shí)驗(yàn)

    1)實(shí)驗(yàn)平臺(tái):【正點(diǎn)原子】 NANO STM32F103 開發(fā)板2)摘自《正點(diǎn)原子STM32 F1 開發(fā)指南(NANO 板-HAL 庫版)》關(guān)注官方微信號(hào)公眾號(hào),獲取更多資料:正點(diǎn)原子第二十九章
    發(fā)表于 05-06 15:27

    「ALIENTEK 探索者 STM32F407 開發(fā)板資料連載」第二十九章 IIC 實(shí)驗(yàn)

    1)實(shí)驗(yàn)平臺(tái):alientek 阿波羅 STM32F767 開發(fā)板2)摘自《STM32F7 開發(fā)指南(HAL 庫版)》關(guān)注官方微信號(hào)公眾號(hào),獲取更多資料:正點(diǎn)原子第二十九章 IIC 實(shí)驗(yàn)本章我們將向
    發(fā)表于 06-09 11:33

    模擬數(shù)字轉(zhuǎn)換器ADC編程指南

    ),第二十九章的:片上傳感器與模擬信號(hào)處理,官方將adc、dac、觸摸按鍵、內(nèi)部霍爾傳感器都?xì)w為一類了。之后有需求就都學(xué)一下,現(xiàn)在就看看adc怎么用的先。官方例程:perials /adc/single_read。簡(jiǎn)介:ESP32 內(nèi)置了 2 個(gè) 12 位的 SAR AD
    發(fā)表于 01-17 08:09

    IIC協(xié)議軟件模擬方法

    流程圖導(dǎo)出與導(dǎo)入導(dǎo)出導(dǎo)入認(rèn)識(shí)IIC協(xié)議本文是基于正點(diǎn)原子的第二十九章 IIC實(shí)驗(yàn)編寫的。編寫的目的是為了整理一下自
    發(fā)表于 02-09 07:00

    CH32V103基礎(chǔ)教程30-ADC(多通道DMA讀取方式)

    本章主要在上一章第二十九章ADC單通道DMA讀取方式的基礎(chǔ)上進(jìn)行ADC多通道DMA讀取方式的應(yīng)用。 1、ADC簡(jiǎn)介及相關(guān)函數(shù)介紹關(guān)于ADC DMA功能,前面章節(jié)已做過介紹,在此不再贅述。本章主要進(jìn)行
    發(fā)表于 04-20 16:50

    第二十九講 A/D轉(zhuǎn)換器

    第二十九講 A/D轉(zhuǎn)換器 8.3 A/D轉(zhuǎn)換器8.3.1 A/D轉(zhuǎn)換的一般步驟一、采樣一保持二、量化與編碼 8.3.3逐次
    發(fā)表于 03-30 16:35 ?1713次閱讀
    <b class='flag-5'>第二十九</b>講 A/D轉(zhuǎn)換器

    模擬電路網(wǎng)絡(luò)課件 第二十九節(jié):專用型集成電路運(yùn)算放大器

    模擬電路網(wǎng)絡(luò)課件 第二十九節(jié):專用型集成電路運(yùn)算放大器 6.5 專用型集成電路運(yùn)算放大器 目前,實(shí)
    發(fā)表于 09-17 11:41 ?1452次閱讀
    模擬電路網(wǎng)絡(luò)課件 <b class='flag-5'>第二十九</b>節(jié):專用型集成電路運(yùn)算放大器

    蔡司亮相第二十九屆中國(guó)國(guó)際口腔設(shè)備材料展覽會(huì),邀您共探口腔行業(yè)未來

    作為亞太地區(qū)最具影響力的口腔專業(yè)展會(huì),第二十九屆中國(guó)國(guó)際口腔設(shè)備材料展覽會(huì)即將盛大開幕。本屆展會(huì)預(yù)計(jì)將吸引來自中國(guó)、德國(guó)、日本、美國(guó)等30多個(gè)國(guó)家和地區(qū)的800余家企業(yè)參展,超13萬名專業(yè)人士
    發(fā)表于 06-09 13:42 ?800次閱讀
    蔡司亮相<b class='flag-5'>第二十九</b>屆中國(guó)國(guó)際口腔設(shè)備材料展覽會(huì),邀您共探口腔行業(yè)未來