單芯片解決方案,開(kāi)啟全新體驗(yàn)——W55MH32 高性能以太網(wǎng)單片機(jī)
W55MH32是WIZnet重磅推出的高性能以太網(wǎng)單片機(jī),它為用戶帶來(lái)前所未有的集成化體驗(yàn)。這顆芯片將強(qiáng)大的組件集于一身,具體來(lái)說(shuō),一顆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解決方案,為開(kāi)發(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è)控制中多樣化的連接需求,無(wú)論是與各類傳感器、執(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ò)通信安全再添保障。
為助力開(kāi)發(fā)者快速上手與深入開(kāi)發(fā),基于W55MH32L這顆芯片,WIZnet精心打造了配套開(kāi)發(fā)板。開(kāi)發(fā)板集成WIZ-Link芯片,借助一根USB C口數(shù)據(jù)線,就能輕松實(shí)現(xiàn)調(diào)試、下載以及串口打印日志等功能。開(kāi)發(fā)板將所有外設(shè)全部引出,拓展功能也大幅提升,便于開(kāi)發(fā)者全面評(píng)估芯片性能。
若您想獲取芯片和開(kāi)發(fā)板的更多詳細(xì)信息,包括產(chǎn)品特性、技術(shù)參數(shù)以及價(jià)格等,歡迎訪問(wèn)官方網(wǎng)頁(yè),我們期待與您共同探索W55MH32的無(wú)限可能。
第二十九章 讀寫(xiě)內(nèi)部FLASH
1 W55MH32的內(nèi)部FLASH簡(jiǎn)介
在W55MH32芯片內(nèi)部有一個(gè)FLASH存儲(chǔ)器,它主要用于存儲(chǔ)代碼,我們?cè)?a href="http://www.brongaenegriffin.com/v/tag/1247/" target="_blank">電腦上編寫(xiě)好應(yīng)用程序后,使用下載器把編譯后的代碼文件燒錄到該內(nèi)部FLASH中, 由于FLASH存儲(chǔ)器的內(nèi)容在掉電后不會(huì)丟失,芯片重新上電復(fù)位后,內(nèi)核可從內(nèi)部FLASH中加載代碼并運(yùn)行, 見(jiàn)下圖,W55MH32的內(nèi)部框架圖:
除了使用外部的工具(如下載器)讀寫(xiě)內(nèi)部FLASH外,W55MH32芯片在運(yùn)行的時(shí)候,也能對(duì)自身的內(nèi)部FLASH進(jìn)行讀寫(xiě),因此, 若內(nèi)部FLASH存儲(chǔ)了應(yīng)用程序后還有剩余的空間,我們可以把它像外部SPI-FLASH那樣利用起來(lái),存儲(chǔ)一些程序運(yùn)行時(shí)產(chǎn)生的需要掉電保存的數(shù)據(jù)。
由于訪問(wèn)內(nèi)部FLASH的速度要比外部的SPI-FLASH快得多,所以在緊急狀態(tài)下常常會(huì)使用內(nèi)部FLASH存儲(chǔ)關(guān)鍵記錄;為了防止應(yīng)用程序被抄襲, 有的應(yīng)用會(huì)禁止讀寫(xiě)內(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ū)域, 它們的地址分布及大小見(jiàn)下表,W55MH32大容量產(chǎn)品內(nèi)部FLASH的構(gòu)成:
模塊 | 名稱 | 地址 | 大小 |
主存儲(chǔ)塊 | 頁(yè) 0 | 0x0800 0000 - 0x0800 07FF | 2K |
頁(yè) 1 | 0x0800 0800 - 0x0800 0FFF | 2K | |
頁(yè) 2 | 0x0800 1000 - 0x0800 17FF | 2K | |
頁(yè) 3 | 0x0800 1800 - 0x0800 1FFF | 2K | |
… | … | … | |
頁(yè) 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ù)模塊 | 支持 | 支持 |
硬件加密算法單元 | 支持 | 支持 |
頁(yè)大小 (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ū)是用戶不能訪問(wèn)的區(qū)域,它在芯片出廠時(shí)已經(jīng)固化了啟動(dòng)代碼,它負(fù)責(zé)實(shí)現(xiàn)串口、USB以及CAN等ISP燒錄功能。
選項(xiàng)字節(jié)
選項(xiàng)字節(jié)用于配置FLASH的讀寫(xiě)保護(hù)、待機(jī)/停機(jī)復(fù)位、軟件/硬件看門(mén)狗等功能,這部分共16字節(jié)??梢酝ㄟ^(guò)修改FLASH的選項(xiàng)控制寄存器修改。
2 對(duì)內(nèi)部FLASH的寫(xiě)入過(guò)程
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 頁(yè)擦除
在寫(xiě)入新的數(shù)據(jù)前,需要先擦除存儲(chǔ)區(qū)域,W55MH32提供了頁(yè)(扇區(qū))擦除指令和整個(gè)FLASH擦除(批量擦除)的指令,批量擦除指令僅針對(duì)主存儲(chǔ)區(qū)。
頁(yè)擦除的過(guò)程如下:
檢查 FLASH_SR 寄存器中的“忙碌寄存器位 BSY”,以確認(rèn)當(dāng)前未執(zhí)行任何 Flash 操作;
在 FLASH_CR 寄存器中,將“激活頁(yè)擦除寄存器位PER ”置 1;
用FLASH_AR寄存器選擇要擦除的頁(yè);
將 FLASH_CR 寄存器中的“開(kāi)始擦除寄存器位 STRT ”置 1,開(kāi)始擦除;
等待 BSY 位被清零時(shí),表示擦除完成。
2.3 寫(xiě)入數(shù)據(jù)
擦除完畢后即可寫(xiě)入數(shù)據(jù),寫(xiě)入數(shù)據(jù)的過(guò)程并不是僅僅使用指針向地址賦值,賦值前還還需要配置一系列的寄存器,步驟如下:
檢查 FLASH_SR 中的 BSY 位,以確認(rèn)當(dāng)前未執(zhí)行任何其它的內(nèi)部 Flash 操作;
將 FLASH_CR 寄存器中的 “激活編程寄存器位PG” 置 1;
向指定的FLASH存儲(chǔ)器地址執(zhí)行數(shù)據(jù)寫(xiě)入操作,每次只能以16位的方式寫(xiě)入;
等待 BSY 位被清零時(shí),表示寫(xiě)入完成。
3 查看工程的空間分布
由于內(nèi)部FLASH本身存儲(chǔ)有程序數(shù)據(jù),若不是有意刪除某段程序代碼,一般不應(yīng)修改程序空間的內(nèi)容, 所以在使用內(nèi)部FLASH存儲(chǔ)其它數(shù)據(jù)前需要了解哪一些空間已經(jīng)寫(xiě)入了程序代碼,存儲(chǔ)了程序代碼的扇區(qū)都不應(yīng)作任何修改。 通過(guò)查詢應(yīng)用程序編譯時(shí)產(chǎn)生的“*.map”后綴文件,可以了解程序存儲(chǔ)到了哪些區(qū)域, 它在工程中的打開(kāi)方式見(jiàn)下圖,打開(kāi)工程的map文件 , 也可以到工程目錄中的“Listing”文件夾中找到,關(guān)于map文件的詳細(xì)說(shuō)明可參考《MDK的編譯過(guò)程及文件類型》章節(jié)。
3.1 程序ROM的加載與執(zhí)行空間
上述說(shuō)明中有兩段分別以“Load Region LR_ROM1”及“Execution Region ER_IROM1”開(kāi)頭的內(nèi)容, 它們分別描述程序的加載及執(zhí)行空間。 在芯片剛上電運(yùn)行時(shí),會(huì)加載程序及數(shù)據(jù),例如它會(huì)從程序的存儲(chǔ)區(qū)域加載到程序的執(zhí)行區(qū)域,還把一些已初始化的全局變量從ROM復(fù)制到RAM空間, 以便程序運(yùn)行時(shí)可以修改變量的內(nèi)容。加載完成后,程序開(kāi)始從執(zhí)行區(qū)域開(kāi)始執(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說(shuō)明了該段的類型,CODE表示代碼,DATA表示數(shù)據(jù),而PAD表示段之間的填充區(qū)域,它是無(wú)效的內(nèi)容, PAD區(qū)域往往是為了解決地址對(duì)齊的問(wèn)題。
觀察表中的最后一項(xiàng),它的基地址是0x0800175c,大小為0x00000020,可知它占用的最高的地址空間為0x0800177c,跟執(zhí)行區(qū)域的最高地址0x0000177c一樣, 但它們比加載區(qū)域說(shuō)明中的最高地址0x80017a8要小,所以我們以加載區(qū)域的大小為準(zhǔn)。 對(duì)比表 W55MH32大容量產(chǎn)品內(nèi)部FLASH的構(gòu)成 的內(nèi)部FLASH頁(yè)地址分布表, 可知僅使用頁(yè)0至頁(yè)2就可以完全存儲(chǔ)本應(yīng)用程序,所以從頁(yè)3(地址0x08001800)后的存儲(chǔ)空間都可以作其它用途,使用這些存儲(chǔ)空間時(shí)不會(huì)篡改應(yīng)用程序空間的數(shù)據(jù)。
4 操作內(nèi)部FLASH的庫(kù)函數(shù)
為簡(jiǎn)化編程,W55MH32標(biāo)準(zhǔn)庫(kù)提供了一些庫(kù)函數(shù),它們封裝了對(duì)內(nèi)部FLASH寫(xiě)入數(shù)據(jù)操作寄存器的過(guò)程。
4.1 FLASH解鎖、上鎖函數(shù)
對(duì)內(nèi)部FLASH解鎖、上鎖的函數(shù)見(jiàn)代碼清單:FLASH-2:
代碼清單:FLASH-2 FLASH解鎖、上鎖
#define FLASH_KEY1 ((uint32_t)0x45670123) #define FLASH_KEY2 ((uint32_t)0xCDEF89AB) /** * @brief 對(duì)FLASH控制寄存器解鎖,使能訪問(wèn) * @param None * @retval None */ void FLASH_Unlock(void) { if ((FLASH->CR & FLASH_CR_LOCK) != RESET) { /* 寫(xiě)入確認(rèn)驗(yàn)證碼 */ FLASH->KEYR = FLASH_KEY1; FLASH->KEYR = FLASH_KEY2; } } /** * @brief 對(duì)FLASH控制寄存器上鎖,禁止訪問(wèn) * @param None * @retval None */ void FLASH_Lock(void) { /* 設(shè)置FLASH寄存器的LOCK位 */ FLASH->CR |= FLASH_CR_LOCK; }
解鎖的時(shí)候,它對(duì)FLASH_KEYR寄存器寫(xiě)入兩個(gè)解鎖參數(shù),上鎖的時(shí)候,對(duì)FLASH_CR寄存器的FLASH_CR_LOCK位置1。
4.2 設(shè)置操作位數(shù)及頁(yè)擦除
解鎖后擦除扇區(qū)時(shí)可調(diào)用FLASH_EraseSector完成,見(jiàn)代碼清單:FLASH-3:
代碼清單:FLASH-3 擦除扇區(qū)
/** * @brief 擦除指定的頁(yè) * @param Page_Address: 要擦除的頁(yè)地址. * @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) { /* 若上次操作完成,則開(kāi)始頁(yè)擦除 */ 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è)置要擦除的頁(yè)地址,即目標(biāo)頁(yè)的在內(nèi)部FALSH的首地址,函數(shù)獲取地址后,根據(jù)前面的流程檢查狀態(tài)位、 向控制寄存器FLASH_CR及地址寄存器FLASH_AR寫(xiě)入?yún)?shù),配置開(kāi)始擦除后,需要等待一段時(shí)間,函數(shù)中使用使用FLASH_WaitForLastOperation()等待, 擦除完成的時(shí)候才會(huì)退出FLASH_EraseSector()函數(shù)。
4.3 寫(xiě)入數(shù)據(jù)
對(duì)內(nèi)部FLASH寫(xiě)入數(shù)據(jù)不像對(duì)SDRAM操作那樣直接指針操作就完成了,還要設(shè)置一系列的寄存器, 利用FLASH_ProgramWord()和FLASH_ProgramHalfWord()函數(shù)可按字、半字的單位單位寫(xiě)入數(shù)據(jù), 見(jiàn)代碼清單:FLASH-4:
代碼清單:FLASH-4 寫(xiě)入數(shù)據(jù)
/** * @brief 向指定的地址寫(xiě)入一個(gè)字的數(shù)據(jù)(32位) * @param Address: 要寫(xiě)入的地址 * @param Data: 要寫(xiě)入的數(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) { /* 若上次操作完成,則開(kāi)始頁(yè)入低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) { /* 若上次操作完成,則開(kāi)始頁(yè)入高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; } } /* 返回寫(xiě)入結(jié)果 */ return status; }
從函數(shù)代碼可了解到,它設(shè)置FLASH->CR 寄存器的PG位允許寫(xiě)入后,使用16位的指針往指定的地址寫(xiě)入數(shù)據(jù),由于每次只能按16位寫(xiě)入, 所以這個(gè)按字寫(xiě)入的過(guò)程使用了兩次指針賦值,分別寫(xiě)入指定數(shù)據(jù)的低16位和高16位,每次賦值操作后,調(diào)用FLASH_WaitForLastOperation()函數(shù)等待寫(xiě)操作完畢。 標(biāo)準(zhǔn)庫(kù)里還提供了FLASH_ProgramHalfWord()函數(shù)用于每次寫(xiě)入半個(gè)字,即16位,該函數(shù)內(nèi)部的執(zhí)行過(guò)程類似。
5 讀寫(xiě)內(nèi)部FLASH
5.1 代碼分析
1.宏定義
#define FLASH_TEST_ADDR (0x0800F400) // 測(cè)試用Flash地址(32KB處)
地址選擇:需確保該地址未被程序代碼占用,且屬于可擦寫(xiě)區(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); } } }
無(wú)限循環(huán):持續(xù)測(cè)試,直到number溢出。
3.FLASH 擦除與編程函數(shù)
void FLASH_EraseProgram(uint32_t number) { // 1. 擦除頁(yè)測(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擦除整頁(yè)(通常為 2KB)。
編程操作:逐個(gè)半字寫(xiě)入0x5A5A,驗(yàn)證寫(xiě)入正確性。
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ì)算:通過(guò)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)證
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)讀寫(xiě)FLASH while (1) { WIZFLASH_Write(FLASH_SAVE_ADDR, (u16 *)TEXT_Buffer, SIZE); // 寫(xiě)入數(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通過(guò)串口輸出 }
4. FLASH 操作
依賴eeprom.h的WIZFLASH_Write和WIZFLASH_Read,需確保其實(shí)現(xiàn) FLASH 底層操作(擦除、讀寫(xiě)等)。
地址:FLASH_SAVE_ADDR 0X08008000,需在可用 FLASH 空間內(nèi)。
6.2 下載驗(yàn)證
-
單片機(jī)
+關(guān)注
關(guān)注
6067文章
44992瀏覽量
650510 -
FlaSh
+關(guān)注
關(guān)注
10文章
1679瀏覽量
151841 -
存儲(chǔ)器
+關(guān)注
關(guān)注
38文章
7653瀏覽量
167413 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3298瀏覽量
118952
發(fā)布評(píng)論請(qǐng)先 登錄
【ZYNQ Ultrascale+ MPSOC FPGA教程】第二十九章PL端AXI GPIO的使用

《DNK210使用指南 -CanMV版 V1.0》第二十九章 音頻錄制實(shí)驗(yàn)
PCB設(shè)計(jì)規(guī)范2010最新版
眾想科技-劉洋邊講邊寫(xiě)STM32視頻教程 15.RS232串口通訊實(shí)驗(yàn)
《BOSCH汽車(chē)電氣與電子 》(中文第一版)(完整版)
「正點(diǎn)原子Linux連載」第二十九章LCD背光調(diào)節(jié)實(shí)驗(yàn)
「正點(diǎn)原子STM32Mini板資料連載」第二十九章 無(wú)線通信實(shí)驗(yàn)
「正點(diǎn)原子NANO STM32F103開(kāi)發(fā)板資料連載」第二十九章 內(nèi)存管理實(shí)驗(yàn)
「ALIENTEK 探索者 STM32F407 開(kāi)發(fā)板資料連載」第二十九章 IIC 實(shí)驗(yàn)
模擬數(shù)字轉(zhuǎn)換器ADC編程指南
IIC協(xié)議軟件模擬方法
CH32V103基礎(chǔ)教程30-ADC(多通道DMA讀取方式)
第二十九講 A/D轉(zhuǎn)換器

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

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

評(píng)論