女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

第二十五章 FLASH

W55MH32 ? 來源:W55MH32 ? 作者:W55MH32 ? 2025-05-29 16:03 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

單芯片解決方案,開啟全新體驗——W55MH32 高性能以太網單片機

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

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

W55MH32Q采用QFN68封裝版本,尺寸為8x8mm,它擁有36個GPIO、3個ADC、12通道DMA、17個定時器、2個I2C、3個串口、2個SPI接口(其中1個帶I2S接口復用)、1個CAN以及1個USB2.0。在保持與同系列其他版本一致的核心性能基礎上,僅減少了部分GPIO以及SDIO接口,其他參數保持一致,性價比優勢顯著,尤其適合網關模組等對空間布局要求較高的場景。緊湊的尺寸和精簡化外設配置,使其能夠在有限空間內實現高效的網絡連接與數據交互,成為物聯網網關、邊緣計算節點等緊湊型設備的理想選擇。 同系列還有QFN100封裝的W55MH32L版本,該版本擁有更豐富的外設資源,適用于需要多接口擴展的復雜工控場景,軟件使用方法一致。更多信息和資料請進入http://www.w5500.com/網站或者私信獲取。

此外,本W55MH32支持硬件加密算法單元,WIZnet還推出TOE+SSL應用,涵蓋TCP SSL、HTTP SSL以及MQTT SSL等,為網絡通信安全再添保障。

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

若您想獲取芯片和開發板的更多詳細信息,包括產品特性、技術參數以及價格等,歡迎訪問官方網頁:http://www.w5500.com/,我們期待與您共同探索W55MH32的無限可能。

wKgZO2gbOfaAVPzkACJSygzv-rI600.png

第二十五章 FLASH

1 W55MH32 FLASH 簡介

WMH32的閃存模塊由主存儲器、信息塊和閃存存儲器接口寄存器等 3 部分組成。

主存儲器,該部分用來存放代碼和數據常數(如 const 類型的數據)。對于大容量產品,其被劃分為 256 頁,每一頁 2K 字節。注意,小容量和中容量產品則每頁只有 1K 字節。從上圖可以看出主存儲器的起始地址就是 0x08000000,B0、B1 都接 GND 的時候,就是從0x08000000 開始運行代碼的。

信息塊,該部分分為 2 個小部分,其中啟動程序代碼,用來存儲 ST 自帶的啟動程序,用來串口下載代碼,當 B0 接 3V3,B1 接 GND 的時候,運行的就是這部分代碼。用戶選中字節,則一般用于配置寫保護、讀保護等功能,本章不作介紹了。

閃存存儲器接口寄存器,該部分用于控制閃存讀寫等,是整個閃存模塊的控制結構。對主存儲器和信息塊的寫入由內嵌的閃存編程/擦除控制器(FPEC)管理;編程與擦除的高電壓由內部產生。在執行閃存寫操作時,任何對閃存的讀操作都會鎖住總線,在寫操作完成后讀操作才能正確地進行。既在進行寫或擦除操作時,不能進行代碼或數據的讀取操作。

型號 W55MH32L W55MH32Q
Flash(KB) 1024 1024
SRAM(KB) 96 96
高級定時器 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(通道數) 3(12 個通道) 3(12 個通道)
12 位 DAC(通道數) 2(2 個通道) 2(2 個通道)
隨機數模塊 支持 支持
硬件加密算法單元 支持 支持
頁大小(K 字節) 4 4
CPU 頻率 216M 216M
工作電壓 2.0 - 3.6V 2.0 - 3.6V
工作溫度 -40 - +85℃ -40 - +85℃

2 閃存的讀取

內置閃存模塊可以在通用地址空間直接尋址,任何 32 位數據的讀操作都能訪問閃存模塊的內容并得到相應的數據。讀接口在閃存端包含一個讀控制器,還包含一個 AHB 接口與 CPU銜接。這個接口的主要工作是產生讀內存的控制信號并預取 CPU 要求的指令塊,預取指令塊僅用于在 I-Code 總線上的取指操作,數據常量是通過 D-Code 總線訪問的。這兩條總線的訪問目標是相同的閃存模塊,訪問 D-Code 將比預取指令優先級高。

這里要特別留意一個閃存等待時間,因為 CPU 運行速度比 FLASH 快得多,W55MH32的 FLASH 最快訪問速度≤24Mhz,如果 CPU 頻率超過這個速度,那么必須加入等待時間,比如我們一般使用 72Mhz 的主頻,那么 FLASH 等待周期就必須設置為 2,該設置通過FLASH_ACR 寄存器設置。

例如,我們要從地址 addr,讀取一個半字(半字為 16 位,字為 32 位),可以通過如下的

語句讀取:

data = *(vu16*)addr;

將 addr 強制轉換為 vu16 指針,然后取該指針所指向的地址的值,即得到了 addr 地址的值。類似的,將上面的 vu16 改為 vu8,即可讀取指定地址的一個字節。相對 FLASH 讀取來說,W55MH32 FLASH 的寫就復雜一點了。

3 閃存的編程和擦除

W55MH32 的閃存編程是由 FPEC(閃存編程和擦除控制器)模塊處理的,這個模塊包含 7 個 32位寄存器,它們分別是:

?FPEC 鍵寄存器(FLASH_KEYR)

?選擇字節鍵寄存器(FLASH_OPTKEYR)

?閃存控制寄存器(FLASH_CR)

?閃存狀態寄存器(FLASH_SR)

?閃存地址寄存器(FLASH_AR)

? 選擇字節寄存器(FLASH_WRPR)

其中 FPEC 鍵寄存器總共有 3 個鍵值:

?RDPRT 鍵 = 0X0000 00A5

?KEY1 = 0X4567 0123

?KEY2 = 0XCDEF 89AB

W55MH32 復位后,FPEC 模塊是被保護的,不能寫入 FLASH_CR 寄存器;通過寫入特定的序列到 FLASH_KEYR 寄存器可以打開 FPEC 模塊(即寫入 KEY1 和 KEY2),只有在寫保護被解除后,我們才能操作相關寄存器。

W55MH32 閃存的編程每次必須寫入 16 位(不能單純的寫入 8 位數據),當 FLASH_CR 寄存器的 PG 位為‘1’時,在一個閃存地址寫入一個半字將啟動一次編程;寫入任何非半字的數據,FPEC 都會產生總線錯誤。在編程過程中(BSY 位為’1’),任何讀寫內存的操作都會使CPU 暫停,直到此次閃存編程結束。同樣,W55MH32 的 FLASH 在編程的時候,也必須要求其寫入地址的 FLASH 是被擦除了的(其值必須是 0xFFFF),否則無法寫入,在 FLASH_SR 寄存器的 PGERR 位將得到一個警告。W55MH32 的 FLASH 編程過程如圖所示:

wKgZPGg4E8mAR1XOAACOGLbgyk4586.png

閃存編程過程

從上圖可以得到閃存的編程順序如下:

1)檢查 FLASH_CR 的 LOCK 是否解鎖,如果沒有則先解鎖

2)檢查 FLASH_SR 寄存器的 BSY 位,以確認沒有其他正在進行的編程操作

3)設置 FLASH_CR 寄存器的 PG 位為‘1’

4)在指定的地址寫入要編程的半字

5)等待 BSY 位變為‘0’

6)讀出寫入地址并驗證數據

前面提到,我們在 W55MH32 的 FLASH 編程的時候,要先判斷縮寫地址是否被擦出了,所以,我們有必要再介紹一下 W55MH32 的閃存擦除,W55MH32 的閃存擦除分為兩種:頁擦除和整片擦除。頁擦除過程如圖 所示:

wKgZO2g4E8mAdiTkAACWvGoBCAg738.png

閃存頁擦除過程

從上圖可以看出,W55MH32 的頁擦除順序為:

1)檢查 FLASH_CR 和 LOCK 是否解鎖,如果沒有則先解鎖

2)檢查 FLASH_SR 寄存器的 BSY 位,以確認沒有其他正在進行的閃存操作

3)設置 FLASH_CR 寄存器的 PER 位為‘1’

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

5)設置 FLASH_CR 寄存器的 STRT 位為‘1’

6)等待 BSY 位變為‘0’

7)讀出被擦除的頁并做驗證

本章我們只用到了 W55MH32 頁擦除功能,整片擦除功能我們在這里就不介紹了。

4 FLASH 寄存器

通過上面的講解,我們基本對 W55MH32 閃存的讀寫執行步驟有所了解。接下來,我們介紹本實驗需要用到的一些 FLASH 寄存器。

4.1 FPEC 鍵寄存器(FLASH_KEYR)

FPEC 鍵寄存器描述如圖 所示:

wKgZPGg4E8mAQvmjAAJbh19Acmo217.png

FLASH_KEYR 寄存器

該寄存器主要用來解鎖 FPEC,必須在該寄存器寫入特定的序列(KEY1 和 KEY2)解鎖后,才能對 FLASH_CR 寄存器進行寫操作。

4.2 FLASH 控制寄存器(FLASH_CR)

FLASH 控制寄存器描述如圖所示:

wKgZPGg4E8qANu_7AAW-TLW2K1w810.png

圖 FLASH_CR 寄存器

該寄存器我們本章只用到了它的 LOCK、STRT、PER 和 PG 等 4 個位。LOCK 位,該位用于指示 FLASH_CR 寄存器是否被鎖住,該位在檢測到正確的解鎖序列后,硬件將其清零。在一次不成功的解鎖操作后,在下次系統復位之前,該位將不再改變。

STRT 位,該位用于開始一次擦除操作。在該位寫入 1,將執行一次擦除操作。

PER 位,該位用于選擇頁擦除操作,在頁擦除的時候,需要將該位置 1。

PG 位,該位用于選擇編程操作,在往 FLASH 寫數據的時候,該位需要置 1。

其他位,我們就不在這里介紹了,請大家參考《W55MH32xxx參考手冊》。

4.3 閃存狀態寄存器(FLASH_SR)

閃存狀態寄存器描述如圖所示:

wKgZO2g4E8uATa2wAAifVVmSPvY793.png

圖 FLASH_SR 寄存器

該寄存器主要用來指示當前 FPEC 的操作編程狀態。由于寄存器中描述比較詳細,這里就不重復了。

4.4 閃存地址寄存器(FLASH_AR)

閃存地址寄存器描述如圖所示:

wKgZO2g4E8uAMycBAAQyZxLeEk0669.png

圖FLASH_AR 寄存器

該寄存器在本章,我們主要用來設置要擦除的頁。關 于 W55MH32 FLASH 的 介 紹 , 我 們 就 介 紹 到 這 里 。 更 詳 細 的 介 紹 , 可 以 參 考《W55MH32參考手冊》。

5 例程設計

5.1 FLASH_Eeprom

該通過例程串口輸出系統時鐘信息和測試提示,在無限循環里不斷對 WIZnet FLASH 進行讀寫操作,并且把讀取的數據通過串口輸出,以此實現對 FLASH 的讀寫測試。

5.1 函數聲明

聲明了UART_Configuration()函數,其功能是配置串口參數。

5.2 常量與數組定義

定義了一個常量字符串數組TEXT_Buffer,內容為"WIZnet FLASH TEST"。

借助SIZE宏定義獲取數組長度。

設定了FLASH_SAVE_ADDR常量,此為 FLASH 的保存地址。

5.3 主函數main()

int main(void)
{
    uint8_t datatemp[SIZE], i;

    RCC_ClocksTypeDef clocks;
    delay_init();
    UART_Configuration(115200);
    RCC_GetClocksFreq(&clocks);

    printf("n");
    printf("SYSCLK: %3.1fMhz, HCLK: %3.1fMhz, PCLK1: %3.1fMhz, PCLK2: %3.1fMhz, ADCCLK: %3.1fMhzn",
           (float)clocks.SYSCLK_Frequency / 1000000, (float)clocks.HCLK_Frequency / 1000000,
           (float)clocks.PCLK1_Frequency / 1000000, (float)clocks.PCLK2_Frequency / 1000000, (float)clocks.ADCCLK_Frequency / 1000000);
    printf("FLASH EEPROM Tset.n");

    while (1)
    {
        WIZFLASH_Write(FLASH_SAVE_ADDR, (u16 *)TEXT_Buffer, SIZE);
        WIZFLASH_Read(FLASH_SAVE_ADDR, (u16 *)datatemp, SIZE);
        for (i = 0; i < SIZE; i++)
        {
            printf("%sn", datatemp);
        }

        memset(datatemp, 0x00, sizeof(datatemp));
        delay_ms(1000);
    }
}

定義了一個用于存儲從 FLASH 讀取數據的數組datatemp,以及一個循環變量i。

初始化延遲函數、串口配置,并且獲取系統時鐘頻率。

通過printf()函數輸出系統時鐘頻率信息以及測試提示信息。

進入一個無限循環:調用WIZFLASH_Write()函數把TEXT_Buffer數組內容寫入到指定的 FLASH 地址。

?調用WIZFLASH_Read()函數從該地址讀取數據到datatemp數組。

?運用for循環遍歷datatemp數組,然后通過printf()函數輸出數組內容。

?調用memset()函數把datatemp數組清零。

?調用delay_ms()函數延遲 1 秒。

5.4 串口配置函數UART_Coniguration()

void UART_Configuration(uint32_t bound)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    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);

    USART_InitStructure.USART_BaudRate            = bound;
    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(USART_TEST, &USART_InitStructure);
    USART_Cmd(USART_TEST, ENABLE);
}

對 GPIO 和 USART 的初始化結構體進行定義。

使能 USART1 和 GPIOA 的時鐘。

配置 GPIOA 的引腳 9 為復用推挽輸出模式,引腳 10 為浮空輸入模式。

對 USART 的波特率、數據位、停止位、奇偶校驗等參數進行配置。

初始化 USART 并使能。

5.5 字符發送函數SER_PutChar()

int SER_PutChar(int ch)
{
    while (!USART_GetFlagStatus(USART_TEST, USART_FLAG_TC));
    USART_SendData(USART_TEST, (uint8_t)ch);

    return ch;
}

等待串口發送完成標志位USART_FLAG_TC置位。

把字符發送到串口。

5.6 重定向函數fputc()

若要發送的字符是換行符n,則先發送回車符r。

調用SER_PutChar()函數發送字符。

6 下載驗證

6.1 FLASH_Eeprom

進入主循環后,程序會不斷執行以下操作:

把TEXT_Buffer數組中的字符串 "WIZnet FLASH TEST" 寫入到指定的 FLASH 地址。

從該 FLASH 地址讀取數據到datatemp數組。

借助printf()函數將datatemp數組的內容通過串口輸出。

由于for循環的存在,每次讀取到的數據會被重復輸出SIZE次。不過,原代碼里printf("%sn", datatemp);存在錯誤,它會把整個datatemp數組當作字符串輸出,而不是逐個字符輸出。正確的做法應該是printf("%c", datatemp[i]);。修正后,串口會每隔 1 秒輸出一次 "WIZnet FLASH TEST"。

wKgZO2g4E8mAOcEDAAIAsM9lJA4118.png

WIZnet 是一家無晶圓廠半導體公司,成立于 1998 年。產品包括互聯網處理器 iMCU?,它采用 TOE(TCP/IP 卸載引擎)技術,基于獨特的專利全硬連線 TCP/IP。iMCU? 面向各種應用中的嵌入式互聯網設備。

WIZnet 在全球擁有 70 多家分銷商,在香港、韓國、美國設有辦事處,提供技術支持和產品營銷。

香港辦事處管理的區域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5433

    瀏覽量

    124427
  • FlaSh
    +關注

    關注

    10

    文章

    1678

    瀏覽量

    151766
  • 閃存編程
    +關注

    關注

    0

    文章

    12

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    《DNK210使用指南 -CanMV版 V1.0》第二十五章 LCD圖片顯示實驗

    第二十五章 LCD圖片顯示實驗 本章將介紹在LCD上的圖片顯示。通過本章的學習,讀者將學習到LCD上圖片的顯示。本章分為如下幾個小節:25.1 lcd模塊介紹25.2 硬件設計25.3 程序設計
    發表于 10-23 09:34

    【正點原子FPGA連載】第二十七章gpio子系統下的LED驅動實驗-領航者ZYNQ之linux開發指南

    原子公眾號,獲取最新資料第二十七章gpio子系統下的LED驅動實驗在上一當中已經給大家介紹了linux的gpio子系統,那本章我們就來編寫一個基于gpio子系統API的LED驅動程序,本章將在第二十五章
    發表于 09-16 17:40

    在顯示器上顯示出了靜態的彩條圖案

    關注正點原子公眾號,獲取最新資料更新第二十五章HDMI方塊移動實驗在HDMI彩條顯示實驗中,我們成功地在顯示器上顯示出了靜態的彩條圖案。本章我們通
    發表于 12-07 12:50

    第二十五講 同步計數器

    第二十五講 同步計數器 7.3.2 同步計數器一、同步二進制計數器1.同步二進制加法計數器JK觸發器組成的4位同步二進制加法
    發表于 03-30 16:28 ?9709次閱讀
    <b class='flag-5'>第二十五</b>講 同步計數器

    模擬電路網絡課件 第二十五節:集成運算放大器中的電流源

    模擬電路網絡課件 第二十五節:集成運算放大器中的電流源 6.1 集成運算放大器中的電流源 一、三極管電流源
    發表于 09-17 11:23 ?2353次閱讀
    模擬電路網絡課件 <b class='flag-5'>第二十五</b>節:集成運算放大器中的電流源

    【正點原子FPGA連載】第二十五章HDMI方塊移動實驗 -摘自【正點原子】新起點之FPGA開發指南_V2.1

    【正點原子FPGA連載】第二十五章HDMI方塊移動實驗 -摘自【正點原子】新起點之FPGA開發指南_V2.1
    發表于 11-24 14:36 ?13次下載
    【正點原子FPGA連載】<b class='flag-5'>第二十五章</b>HDMI方塊移動實驗 -摘自【正點原子】新起點之FPGA開發指南_V2.1

    2023高交會|第二十五屆中國國際高新技術交易會·招商工作全面啟動

    2023高交會|第二十五屆中國國際高新技術交易會·招商工作全面啟動
    的頭像 發表于 07-21 17:53 ?1450次閱讀
    2023高交會|<b class='flag-5'>第二十五</b>屆中國國際高新技術交易會·招商工作全面啟動

    火熱預定中2023第二十五屆中國國際高新技術交易會11.15-11.19日

    火熱預定中----2023深圳第二十五屆中國國際高新技術交易會11.15-11.19日
    的頭像 發表于 08-18 14:39 ?1081次閱讀

    火熱招商--2023第二十五屆中國國際高新技術交易會11.15-11.19日

    火熱招商中----2023第二十五屆中國國際高新技術交易會11.15-11.19盛大召開
    的頭像 發表于 08-23 09:47 ?845次閱讀

    中軟國際與深開鴻邀您相約第二十五屆中國國際軟件博覽會

    ? 原文標題:中軟國際與深開鴻邀您相約第二十五屆中國國際軟件博覽會 文章出處:【微信公眾號:中軟國際】歡迎添加關注!文章轉載請注明出處。
    的頭像 發表于 08-31 13:10 ?679次閱讀

    上海貝嶺榮獲“第二十五屆上市公司金信披獎”

    11月23日,由中國證券報、南通市人民政府聯合主辦的“2023上市公司高質量發展論壇暨第二十五屆上市公司金牛獎頒獎典禮”在江蘇南通隆重舉行,備受矚目的上市公司金牛獎榜單正式揭曉。
    的頭像 發表于 12-01 10:12 ?795次閱讀

    鐳神智能榮獲第二十五屆高交會優秀產品獎

    近期,以“激發創新活力,提升發展質量”為主題的第二十五屆中國國際高新技術成果交易會在深圳圓滿落幕。鐳神智能憑借其獨特的技術優勢和創新的科研成果,激光雷達3DSLAM無人叉車智能制造及智能倉儲解決方案
    的頭像 發表于 12-09 08:24 ?632次閱讀
    鐳神智能榮獲<b class='flag-5'>第二十五</b>屆高交會優秀產品獎

    英特爾邀您相約第二十五屆中國零售業博覽會

    零售業的年度盛會——第二十五屆中國零售業博覽會(CHINASHOP)即將震撼來襲!CHINASHOP 在二十余載歲月里,始終引領中國零售業的發展潮流,如今已傲然成為亞洲規模最大、全球排名前三的零售類專業展會。
    的頭像 發表于 04-28 17:51 ?528次閱讀

    中國中車多家子公司榮獲第二十五屆中國專利獎

    近日,國家知識產權局發布了關于第二十五屆中國專利獎授獎的決定,中國中車多家子公司獲獎。
    的頭像 發表于 06-13 11:47 ?467次閱讀

    國星光電榮獲第二十五屆中國專利優秀獎

    近日,國家知識產權局發布《關于第二十五屆中國專利獎授獎的決定》,國星光電憑借發明專利“一種量子點發光器件及其制造方法” 榮獲中國專利優秀獎。
    的頭像 發表于 06-13 16:04 ?414次閱讀