




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第3章基于S3C2410X處理器的嵌入式應用系統設計3.1基本電路設計
3.2存儲器系統設計
3.3S3C2410X的串行通信設計3.4S3C2410X的鍵盤及LED驅動設計
3.5S3C2410X的D/A功能應用開發
目前一頁\總數一百零七頁\編于十三點3.1基本電路設計
3.1.1電源電路設計
S3C2410X需要3.3V和1.8V兩種供電電壓,是由5V電源電壓經LM1085-3.3V和AS1117-1.8V分別得到3.3V和1.8V的工作電壓。開發板上的芯片多數使用了3.3V電壓,而1.8V是供給S3C2410內核使用的。5V電壓供給音頻功放芯片、LCD、電機、硬盤、CAN總線等電路使用。具體如圖3.1所示。目前二頁\總數一百零七頁\編于十三點目前三頁\總數一百零七頁\編于十三點RTC電路的電壓是1.8V,實際是將電池電壓或3.3V電壓經過兩個BAV99(等價于4個二極管串聯)降壓后得到的。如圖3.2所示。圖3.2RTC電路的電壓原理圖
目前四頁\總數一百零七頁\編于十三點3.1.2復位電路設計硬件復位電路實現對電源電壓的監控和手動復位操作。IMP811T的復位電平可以使CPUJTAG(nTRST)和板級系統(nRESET)全部復位;RESET反相后得到nRESET信號。
圖3.3系統的復位電路目前五頁\總數一百零七頁\編于十三點3.1.3晶振電路設計S3C2410X微處理器的主時鐘可以由外部時鐘源提供,也可以由外部振蕩器提供,通過引腳OM[3:2]來進行選擇。OM[3:2]=00時,MPLL和UPLL的時鐘均選擇外部振蕩器;OM[3:2]=01時,MPLL的時鐘選擇外部振蕩器;UPLL選擇外部時鐘源;OM[3:2]=10時,MPLL的時鐘選擇外部時鐘源;UPLL選擇外部振蕩器;OM[3:2]=11時,MPLL和UPLL的時鐘均選擇外部時鐘源。目前六頁\總數一百零七頁\編于十三點該系統中選擇OM[3:2]均接地的方式,即采用外部振蕩器提供系統時鐘。外部振蕩器由12MHz晶振和2個15pF的微調電容組成。如圖3.4所示,
圖3.4晶振電路原理圖目前七頁\總數一百零七頁\編于十三點
圖3.5所示的是S3C2410X應用系統所需的RTC時鐘電路圖,電路由12MHz晶振和2個15pF的電容組成,振蕩電路的輸出接到S3C2410X微處理器的XTlpll腳,輸入由XTOpll提供。12MHz的晶振頻率經S3C2410X內部PLL電路的倍頻后可達203MHz。
圖3.5系統時鐘的選擇目前八頁\總數一百零七頁\編于十三點3.2存儲器系統設計
在嵌入式應用系統中,通常使用3種存儲器接口電路,NorFlash接口、NandFlash接口和SDRAM接口電路。引導程序既可存儲在NorFlash中,也可存儲在NandFlash中。而SDRAM中存儲的是執行中的程序和產生的數據。存儲在NorFlash中的程序可直接執行,與在SDRAM執行相比速度較慢。存儲在NandFlash中的程序,需要拷貝到RAM中去執行。目前九頁\總數一百零七頁\編于十三點3.2.18位存儲器接口設計
由于ARM微處理器的體系結構支持8位/16位/32位的存儲器系統,相應地可以構建8位的存儲器系統、16位的存儲器系統或32位的存儲器系統,在采用8位存儲器構成8位/16位/32位的存儲器系統時,除數據總線的連接不同之處,其它的信號線的連接方法基本相同。目前十頁\總數一百零七頁\編于十三點1.構建8位的存儲器系統
采用8位存儲器構成8位的存儲器系統如圖3.6所示。此時,在初始化程序中還必須通過BWSCON寄存器中的DWn設置為00,選擇8位的總線方式。●存儲器的nOE端接S3C2410X的nOE引腳;●存儲器的nWE端接S3C2410X的nWE引腳;●存儲器的nCE端接S3C2410X的nGCSn引腳;●存儲器的地址總線[A15~A0]與S3C2410X的地址總線[ADDR15~ADDR0]相連;●存儲器的8位數據總線[DQ7~DQ0]與S3C2410X的數據總線[DATA7~DATA0]相連。目前十一頁\總數一百零七頁\編于十三點2.構建16位的存儲器系統
采用兩片8位存儲器芯片以并聯方式可構成16位的存儲器系統,如圖3.7所示,此時,在初始化程序中將BWSCON寄存器中的DWn設置為01,選擇16位的總線方式。●存儲器的nOE端接S3C2410X的nOE引腳;●低8位的存儲器的nWE端接S3C2410X的nWBE0引腳,高8位的存儲器的nWE端接S3C2410X的nWBE1引腳;●存儲器的nCE端接S3C2410X的nGCSn引腳;●存儲器的地址總線[A15~A0]與S3C2410X的地址總線[ADDR16~ADDR1]相連;●低8位的存儲器的8位數據總線[DQ7~DQ0]與S3C2410X的數據總線[DATA7~DATA0]相連,高8位的存儲器的8位數據總線[DQ7~DQ0]與S3C2410X的數據總線[DATA15~DATA8]相連。目前十二頁\總數一百零七頁\編于十三點3.構建32位的存儲器系統采用四片8位存儲器芯片以并聯方式可構成32位的存儲器系統,如圖3.8所示,此時,在初始化程序中將BWSCON寄存器中的DWn設置為10,選擇32位的總線方式。●存儲器的nOE端接S3C2410X的nOE引腳;●低8位的存儲器的nWE端接S3C2410X的nWBE0引腳,次低8位的存儲器的nWE端接S3C2410X的nWBE1引腳,次高8位的存儲器的nWE端接S3C2410X的nWBE2引腳,高8位的存儲器的nWE端接S3C2410X的nWBE3引腳;●存儲器的nCE端接S3C2410X的nGCSn引腳;●存儲器的地址總線[A15~A0]與S3C2410X的地址總線[ADDR17~ADDR2]相連。目前十三頁\總數一百零七頁\編于十三點圖3.832位存儲器系統
目前十四頁\總數一百零七頁\編于十三點3.2.2SDRAM接口電路設計在ARM嵌入式應用系統中,SDRAM主要用于程序的運行空間、數據及堆棧區。當系統啟動時,CPU首先從復位地址0x0處讀取啟動程序代碼,完成系統的初始化后,為提高系統的運行的速度,程序代碼通常裝入到SDRAM中運行。在S3C2410X片內具有獨立的SDRAM刷新控制邏輯電路,可方便地與SDRAM接口。目前常用的SDRAM芯片有8位和16位的數據寬度、工作電壓一般為3.3V。主要生產廠商有HYUNDAI、Winbond等,下面以K4S561632C-TC75為例說明其與S3C2410X的接口方法,構成16Mx32位的存儲系統。目前十五頁\總數一百零七頁\編于十三點
K4S561632C-TC75存儲器是4組×4M×16位的動態存儲器,工作電壓為3.3V,其封裝形式為54腳TSOP,兼容LVTTL接口,數據寬度為16位,支持自動刷新(Auto-Refresh)和自刷新(Self-Refresh)。其引腳如圖3.9所示,引腳功能如表3.1所示。圖3.9K4S561632C-TC75引腳圖
目前十六頁\總數一百零七頁\編于十三點引腳名稱說明CLK時鐘時鐘輸入CKE時鐘使能片內時鐘信號使能CS*片選為低電平時芯片才能工作BA0、BA1組地址選擇用于片內4個組選擇A12~A0地址總線為行、列的地址線RAS*行地址鎖存低電平時鎖存行地址CAS*列地址鎖存低電平時鎖存列地址WE*寫使能使能寫信號和允許列改寫,WE*和CAS*有效時鎖存數據LDQM、UDQM數據I/O屏蔽在讀模式下控制輸出緩沖,寫模式下屏蔽輸入數據DQ15~DQ0數據總線數據輸入/輸出引腳VDD/VSS電源/地內部電源及輸入緩沖電源/地VDDQ/VSSQ電源/地輸出緩沖電源/地NC空空引腳表3.1K4S561632C-TC75引腳功能表
目前十七頁\總數一百零七頁\編于十三點
采用兩片K4S561632C-TC75存儲器芯片可組成16M×32位SDRAN存儲器系統,其片選信號CS*接S3C2410X的nGCS6引腳,具體連線如圖3.10所示。圖3.10K4S561632C-TC75組成的32位SDRAM存儲器系統目前十八頁\總數一百零七頁\編于十三點3.2.3Flash接口電路設計
Flash閃存是非易失存儲器,可以對稱為塊的存儲器單元塊進行擦寫和再編程。目前所做用的Flash芯片主要有NorFlash和NandFlash兩種。但這兩種Flash芯片在某些方面存在一定的差異,如:Nand器件執行擦除操作簡單,而Nor則要求在進行寫入前先將目標塊內所有的位都寫為0;Nor的讀速度比Nand稍快一些;Nand的寫入速度比Nor快很多,Nand需4ms擦除,而Nor需要5s快。NandFlash的單元尺寸幾乎是Nor器件的一半,由于生產過程更為簡單,其價格低。在Nand閃存中每個塊的最大擦寫次數是一百萬次,而Nor的擦寫次數是十萬次。目前十九頁\總數一百零七頁\編于十三點Nor具有XIP(eXecuteInPlace,芯片內執行)特性,應用程序可以直接在Flash閃存內運行,不必再把代碼讀到系統RAM中。Nor的傳輸效率很高,在1~4MB的小容量時具有很高的成本效益,但是很低的寫入和擦除速度大大影響了它的性能。Nand結構能提供極高的單元密度,可以達到高存儲密度,并且寫入和擦除的速度也很快。在接口方面,NorFlash和NandFlash也存在著差別。NorFlash帶有SRAM接口,Nand器件使用復雜的I/O口來串行存取數據。目前二十頁\總數一百零七頁\編于十三點1.NorFlash與S3C2410X微處理器接口設計SST39LF/VF160是1MX16位的CMOS芯片,SST39LF160工作電壓為3.0~3.6V,SST39VF160工作電壓為2.7~3.6V,采用48腳TSOP封裝或TFBGA封裝,16位數據寬度,以字模式(16位數據寬度)的方式工作。SST39VF160的在系統編程和編程操作僅需3.3V電壓,通過命令可以對芯片進行編程(燒寫)、擦除(整片擦除和按扇區擦除)以及其他操作。SST39LF/VF160的引腳圖如圖3.11所示,引腳功能如表3.2所示。目前二十一頁\總數一百零七頁\編于十三點圖3.11SST39LF/VF160的引腳圖
目前二十二頁\總數一百零七頁\編于十三點表3.2SST39LF160/SST39VF160引腳功能表引腳名稱說明CE*片選為低電平時芯片才能工作OE*輸出使能用于片內4個組選擇A19~A0地址總線地址線WE*寫使能使能寫信號和允許列改寫DQ15~DQ0數據總線數據輸入/輸出引腳VDD電源3.3V電源VSS地地NC空空引腳
表3.2SST39LF160/SST39VF160引腳功能表目前二十三頁\總數一百零七頁\編于十三點
嵌入式應用系統中,常見的NorFlash存儲器芯片單片容量有1MB、2MB、4MB、8MB、16MB等。
下面以SST39VF160為例,簡述其與S3C2410X微處理器的連線,構成1MX16位的存儲器系統。SST39VF160的OE*與S3C2410X的nOE相連;WE*與S3C2410X的nWE相連;地址總線[A19~A0]與S3C2410X的地址總線[ADDR20~ADDR1]相連(注:因為是16位的存儲器系統,半字對齊,所以S3C2410X的A0不用連線);16位的數據總線[DQ15~DQ0]與S3C2410X的低16位數據總線[XDATA15~XDATA0]相連,如圖3.12所示。
目前二十四頁\總數一百零七頁\編于十三點圖3.12SST39LF/VF160的存儲系統電路圖
目前二十五頁\總數一百零七頁\編于十三點2.NandFlash與S3C2410X微處理器接口電路設計
NandFlash相對于NorFlash接口復雜得多,但對于S3C2410X微處器提供了NandFlash的接口,使其在嵌入式應用系統中的接口大大簡便。
例:K9F1208UDM-YCB0/K9F1208UDM-YIB0存儲器與S3C2410X微處理器接口。K9F1208UDM-YCB0/K9F1208UDM-YIB0存儲器是64M×8位的NANDFlash存儲器,數據總線寬度為8位,工作電壓為2.7V-3.6V,采作48腳TSOP封裝,系統的編程和擦除電壓僅需3.3V,其引腳如圖3.13所示,引腳功能如表3.3所目前二十六頁\總數一百零七頁\編于十三點表3.3U-K9F1208UDM引腳功能表
圖3.13U-K9F1208UDM引腳圖
目前二十七頁\總數一百零七頁\編于十三點
K9F1208UDM與S3C2410X微處理器接口如圖3.14所示。①K9F1208UDM的ALE和CLE引腳分別與S3C2410X的ALE和CLE引腳相連;②K9F1208UDM的WE*、RE*、CE*和R/B引腳分別與S3C2410X的Nfwe、Nfre、CLE和R/nB引腳相連;③K9F1208UDM的數據輸入輸出線[IO7~IO0]分別與S3C2410X的[DATA7~DATA0]引腳相連。其操作模式如表3.4所示。
目前二十八頁\總數一百零七頁\編于十三點目前二十九頁\總數一百零七頁\編于十三點圖3.14NandFlash存儲系統電路
目前三十頁\總數一百零七頁\編于十三點3.3S3C2410X的串行通信設計3.3.1串行口原理及接口技術1.異步串行I/O異步串行方式是將傳輸數據的每個字符一位接一位(例如先低位、后高位)地傳送。數據的各不同位可以分時使用同一傳輸通道,因此串行I/O可以減少信號連線,最少用一對線即可進行。圖3.15串行通信字符格式
目前三十一頁\總數一百零七頁\編于十三點2.S3C2410X串行接口
S3C2410X提供了3個通道的UART,要使其與PC機通信,必須將其信號電平轉換為RS—232C的電平。
RS—232C規定了雙極性的信號邏輯電平:-3V到-25V之間的電平表示邏輯“1”。+3V到+25V之間的電平表示邏輯“0”。因此這是一套負邏輯定義,以上標準稱為EIA電平。目前三十二頁\總數一百零七頁\編于十三點圖3.16S3C2410X與PC機的異步通信接口圖
目前三十三頁\總數一百零七頁\編于十三點3.3.2S3C2410X的UART模塊
S3C2410X與UART有關的寄存器主要有以下幾個:(1)UART線控制寄存器包括ULCON0,ULCON1和ULCON2,主要用來選擇每幀數據位數、停止位數,奇偶校驗模式及是否使用紅外模式,如表3.5和表3.6所示。目前三十四頁\總數一百零七頁\編于十三點表3.5UART寄存器設置
表3.6UART寄存器位描述
寄存器地址讀/寫描述復位后值ULCON00x50000000R/WUART通道0線控制寄存器0x00ULCON10x50004000R/WUART通道1線控制寄存器0x00ULCON20x50008000R/WUART通道2線控制寄存器0x00ULCONn位描述復位后值保留[7]0紅外模式[6]確定是否用紅外模式:0=正常模式、1=紅外收/發模式0奇偶校驗[5:3]收/發過程中的奇偶校驗:0XX=無校驗、100=奇校驗、101=偶校驗110=強制奇偶校驗為1、110=強制奇偶校驗為0000停止位[2]收/發每幀數據的停止位:0=1位停止位、1=2位停止位0字長度[1:0]收/發數據長度:00=5位、01=6位、10=7位、11=8位00目前三十五頁\總數一百零七頁\編于十三點(2)UART控制寄存器包括UCON0,UCON1andUCON2,主要用來選擇時鐘,接收和發送中斷類型(即電平還是脈沖觸發類型),接收超時使能,接收錯誤狀態中斷使能,回環模式,發送接收模式等。如表3.7和表3.8所示。圖3.7UART控制寄存器設置
目前三十六頁\總數一百零七頁\編于十三點圖3.8UART控制寄存器器位設置
目前三十七頁\總數一百零七頁\編于十三點(3)UART錯誤狀態寄存器包括UERSTAT0,UERSTAT1andUERSTAT2,此狀態寄存器的相關位表明是否有幀錯誤或溢出錯誤發生。如表3.9和表3.10所示。目前三十八頁\總數一百零七頁\編于十三點表3.9UART錯誤狀態寄存器寄存器地址讀/寫描述復位后值UERSTAT00x50000014R通道0接收錯誤狀態寄存器0x00UERSTAT10x50004014R通道1接收錯誤狀態寄存器0x00UERSTAT20x50008014R通道2接收錯誤狀態寄存器0x00表3.10UART錯誤狀態寄存器位描述UERSTATn位描述復位后值保留[3]在接收時,0=無幀錯誤、1=有幀錯誤0幀錯誤[2]在接收數據時若發生幀錯誤,該位自動置1、否則該位為00保留[1]在接收時,0=無幀錯誤、1=有幀錯誤0溢出錯誤[0]在接收數據時若發生溢出錯誤,該位自動置1、否則該位為00目前三十九頁\總數一百零七頁\編于十三點(4)在UART模塊中有三個接收/發送狀態寄存器,包括:UTRSTAT0UTRSTAT1UTRSTAT2如表3.11和表3.12所示。目前四十頁\總數一百零七頁\編于十三點表3.11UART接收/發送寄存器設置寄存器地址讀/寫描述復位后值UTRSTAT00x50000010R通道0收/發狀態寄存器0x00UTRSTAT10x50004010R通道1收/發狀態寄存器0x00UTRSTAT20x50008010R通道2收/發狀態寄存器0x00表3.12UART接收/發送寄存器位描述UTRSTATn位描述復位后值發送器空[2]當發送緩沖器無有效數據發送時,該位自動置1、否則該位為00發送緩沖寄存器空[1]當發送緩沖寄存器空時,該位自動置1、否則該位為00接收緩沖寄存器數據準備就緒[0]當接收緩沖寄存器數據準備就緒時,該位自動置1、否則該位為00目前四十一頁\總數一百零七頁\編于十三點(2)在UART模塊中有3個UART發送緩沖寄存器,包括:UTXH0,UTXH1和UTXH2,UTXHn有8位發送數據。如表3.13所示。目前四十二頁\總數一百零七頁\編于十三點表3.13UART發送緩沖寄存器寄存器地址讀/寫描述復位后值UTXH00x50000020(L)0x50000023(B)寫(字節)UART0傳輸緩沖寄存器UTXH10x50004020(L)0x50004023(B)寫(字節)UART1傳輸緩沖寄存器UTXH20x50008020(L)0x50008023(B)寫(字節)UART2傳輸緩沖寄存器表3.14UART發送緩沖寄存器功能UTXHn位描述復位后值UTDATAn[7:0]從UARTn發送數據目前四十三頁\總數一百零七頁\編于十三點(3)在UART模塊中有3個UART接收緩沖寄存器,包括URXH0,URXH1和URXH2,URXHn有8位接收數據。如表3.15所示。表3.15UART接收緩沖寄存器寄存器地址讀/寫描述復位值URXH00x50000024(L)0x50000027(B)讀(字節)UART0接收緩沖寄存器URXH10x50004024(L)0x50004027(B)讀(字節)UART1傳輸緩沖寄存器URXH20x50008024(L)0x50008027(B)讀(字節)UART2傳輸緩沖寄存器表3.16UART接收緩沖寄存器功能URXHn位描述復位后值RXDATAn[7:0]從UARTn接收數據目前四十四頁\總數一百零七頁\編于十三點(4)UART波特率因子寄存器表3.17UART波特率因子寄存器寄存器地址讀/寫描述復位值UBRDIV00x50000028讀/寫波特率約數寄存器0UBRDIV10x50004028讀/寫波特率約數寄存器1UBRDIV20x50008028讀/寫波特率約數寄存器2表3.18UART波特率因子寄存器功能UBRDIVn位描述復位后值UBRDIV[15:0]波特率因子值UBRDIVn>0目前四十五頁\總數一百零七頁\編于十三點UART包括三個波特率因子寄存器UBRDIV0,UBRDIV1andUBRDIV2,存儲在波特率因子寄存器(UBRDIVn)中的值決定串口發送和接收的時鐘數率(波特率),計算公式如下:UBRDIVn=(int)(PCLK/(bpsx16))–1或UBRDIVn=(int)(UCLK/(bpsx16))–1例如:如果波特率是115200,PCLKor或UCLKis是40MHz,那么UBRDIVn:UBRDIVn=(int)(40000000/(115200x16))-1=(int)(21.7)-1=21-1=20目前四十六頁\總數一百零七頁\編于十三點3.3.3S3C2410X的UART模塊軟件設計1.編寫串口驅動函數基于上述的寄存器描述,即可編寫出驅動程序,其流程如圖3.17和圖3.18所示,其源程序代碼詳見本書所帶光盤,在ADS1.2下編譯調試通過。目前四十七頁\總數一百零七頁\編于十三點目前四十八頁\總數一百零七頁\編于十三點圖3.19主函數框圖2.在主函數中實現將從串口0接收到的數據發送到串口0(main.c),圖3.19所示。目前四十九頁\總數一百零七頁\編于十三點//main.c函數//說明:Cmain函數,ucos-ii初始化等定義#defineU8unsignedchar#include<string.h>#include<stdio.h>#defineTRUE 1#defineFALSE 0#pragmaimport(__use_no_semihosting_swi)//ensurenofunctionsthatusesemihosting#definerUTRSTAT0 (*(volatileunsigned*)0x50000010)#definerUTRSTAT1 (*(volatileunsigned*)0x50004010)#defineWrUTXH0(ch) (*(volatileunsignedchar*)0x50000020)=(unsignedchar)(ch)#defineWrUTXH1(ch) (*(volatileunsignedchar*)0x50004020)=(unsignedchar)(ch)#defineRdURXH0() (*(volatileunsignedchar*)0x50000024)#defineRdURXH1() (*(volatileunsignedchar*)0x50004024)目前五十頁\總數一百零七頁\編于十三點voidUart_SendByten(int,U8);charUart_Getchn(char*Revdata,intUartnum,inttimeout);voidARMTargetInit(void);voidhudelay(inttime);intmain(void){charc1[1];charerr; ARMTargetInit();//dotarget(uHALbasedARMsystem)initialisation// while(1) {Uart_SendByten(0,0xa);//換行 Uart_SendByten(0,0xd);//回車 err=Uart_Getchn(c1,0,0); //從串口采集數據 Uart_SendByten(0,c1[0]); //顯示采集的數據 } }目前五十一頁\總數一百零七頁\編于十三點voidUart_SendByten(intUartnum,U8data)//okericrong{ if(Uartnum==0){ while(!(rUTRSTAT0&0x4));//WaituntilTHRisempty. hudelay(10); WrUTXH0(data); } else{ while(!(rUTRSTAT1&0x4));//WaituntilTHRisempty. hudelay(10); WrUTXH1(data);} } 目前五十二頁\總數一百零七頁\編于十三點charUart_Getchn(char*Revdata,intUartnum,inttimeout){ if(Uartnum==0){ while(!(rUTRSTAT0&0x1));//Receivedataread *Revdata=RdURXH0(); returnTRUE; } else{ while(!(rUTRSTAT1&0x1));//Receivedataread *Revdata=RdURXH1(); returnTRUE; }} 目前五十三頁\總數一百零七頁\編于十三點3.4S3C2410X的鍵盤及LED驅動設計
S3C2410X的鍵盤采用AVR單片機mega8實現,較為簡單,LED驅動采用ZLG7290進行設計,本節將針對ZLG7290進行詳細描述。3.4.1LED驅動原理及功能
ZLG7290是一片具有串行接口的,可同時驅動8位共陰式數碼管(或64只獨立LED)的智能顯示驅動芯片,該芯片同時還可連接多達64鍵的鍵盤矩陣,單片即可完成LED顯示﹑鍵盤接口的全部功能。目前五十四頁\總數一百零七頁\編于十三點其特點如下:●I2C串行接口提供鍵盤中斷信號方便與處理器接口●可驅動8位共陰數碼管或64只獨立LED和64個按鍵●可控掃描位數可控任一數碼管閃爍●提供數據譯碼和循環移位段尋址等控制●8個功能鍵可檢測任一鍵的連擊次數●無需外接元件即直接驅LED可擴展驅動電流和驅動電壓●提供工業級器件多種封裝形式PDIP24SO24ZLG7290引腳功能如表3.19所示。目前五十五頁\總數一百零七頁\編于十三點表3.19引腳說明引腳號引腳名稱引腳屬性引腳描述13、12、21、22、3~6Dig7~Dig0輸入/輸出LED顯示位驅動及鍵盤掃描線10~7、2、1、24、23segH~segA輸入/輸出LED顯示位驅動及鍵盤掃描線20SDA輸入/輸出I2C總線接口數據/地址線19SCL輸入/輸出I2C總線接口時鐘線14INT*輸出中斷輸出線,低電平有效15RES*輸入復位輸入線,低電平有效17OSC1輸入連接晶體以產生內部時鐘18OSC2輸出16VCC電源電源正(3.5V~5.5V)11GND地電源地目前五十六頁\總數一百零七頁\編于十三點1.鍵盤部分
ZLG7290可采樣64個按鍵或傳感器可檢測每個按鍵的連擊次數,其基本功能如下:(1)鍵盤去抖動處理當鍵被按下和放開時可能會出現電平狀態反復變化稱作鍵盤抖動若不作處理會引起按鍵盤命令錯誤所以要進行去抖動處理以讀取穩定的鍵盤狀態為準。(2)雙鍵互鎖處理當有兩個以上按鍵被同時按下時ZLG7290只采樣優先級高的按鍵優先順序為S1>S2>…>S64如同時按下S2和S18時采樣到S2。目前五十七頁\總數一百零七頁\編于十三點(3)連擊鍵處理當某個按鍵按下時輸出一次鍵值后如果該按鍵還未釋放該鍵值連續有效就像連續壓按該鍵一樣這種功能稱為連擊連擊次數計數器RepeatCnt可區別出單擊某些功能不允許連擊如開關或連擊判斷連擊次數可以檢測被按時間以防止某些功能誤操作如連續按5秒經入參數設置狀態。(4)功能鍵處理功能鍵能實現2個以上按鍵同時按下來擴展按鍵數目或實現特殊功能。目前五十八頁\總數一百零七頁\編于十三點2.顯示部分
在每個顯示刷新周期ZLG7290按照掃描位數寄存器ScanNum指定的顯示位數N把顯示緩存DpRam0DpRamN的內容按先后循序送入LED驅動器實現動態顯示減少N值可提高每位顯示掃描時間的占空比以提高LED亮度顯示緩存中的內容不受影響修改閃爍控制寄器。FlashOnOff可改變閃爍頻率和占空比亮和滅的時間ZLG7290提供兩種控制方式寄存器映象控制和命令解釋控制如上述對顯示部分的控制寄存器映象控制是指直接訪問底層寄存器實現基本控制功能這些寄存器須字節操作命令解釋控制是指通過解釋命令緩沖區CmdBuf0~CmdBuf1中的指令間接訪問底層寄存器實現擴展控制功能如實現寄存器的位操作對顯示緩存循環移位對操作數譯碼等操作請參考指令詳解部分。目前五十九頁\總數一百零七頁\編于十三點3.寄存器詳解●系統狀態部分(1)系統寄存器(SystemReg):地址00H復位值11110000B系統寄存器保存ZLG7290系統狀態并可對系統運行狀態進行配置其功能分位描述如下:KeyAvi(SystemReg.0)置1時表示有效的按鍵動作普通鍵的單擊連擊和功能鍵狀態變化/INT引腳信號有效變為低電平清0表示無按鍵動作/INT引腳信號無效變為高阻態有效的按鍵動作消失后或讀Key后KeyAvi位自動清0。目前六十頁\總數一百零七頁\編于十三點●鍵盤部分(2)鍵值寄存器(Key):地址01H復位值00HKey表示被壓按鍵的鍵值當Key=0時表示沒有鍵被壓按。(3)連擊次數計數器(RepeatCnt):地址02H復位值00HRepeatCnt=0時表示單擊鍵RepeatCnt大于0時表示鍵的連擊次數用于區別出單擊鍵或連擊鍵判斷連擊次數可以檢測被按時間。(4)功能鍵寄存器(FunctionKey):地址03H復位值0FFHFunctionKey對應位的值=0表示對應功能鍵被壓按FunctionKey.7~FunctionKey.0對應S64~S57。●命令接口部分(5)命令緩沖區CmdBuf0~CmdBuf1地址07H~08H復位值00H~00H用于傳輸指令。目前六十一頁\總數一百零七頁\編于十三點●顯示部分(6)閃爍控制寄存器(FlashOnOff):地址0CH,復位值0111B/0111B,高4位表示閃爍時亮的時間,低4位表示閃爍時滅的時間,改變其值同時也改變了閃爍頻率,也能改變亮和滅的占空比,FlashOnOff的1個單位相當于150~250ms(亮和滅的時間范圍為1~160000B相當1個時間)單位,所有象素的閃爍頻率和占空比相同。(7)掃描位數寄存器(ScanNum):地址0DH復位值7用于控制最大的掃描顯示位數有效范圍為0~7對應的顯示位數為1~8減少掃描位數可提高每位顯示掃描時間的占空比以提高LED亮度不掃描顯示的顯示緩存寄存器則保持不變如ScanNum=3時只顯示DpRam0~DpRam3的內容。目前六十二頁\總數一百零七頁\編于十三點(8)顯示緩存寄存器(DpRam0~DpRam7):地址10H~17H,復位值00H~00H,緩存中一位置1表示該像素亮DpRam7~DpRam0的顯示內容對應Dig7~Dig0引腳。目前六十三頁\總數一百零七頁\編于十三點4.指令詳解
ZLG7290提供兩種控制方式:寄存器映象控制和命令解釋控制。寄存器映象控制是指直接訪問底層寄存器(除通信緩沖區外的寄存器),實現基本控制功能。請參考寄存器詳解部分。命令解釋控制是指通過解釋命令緩沖區(CmdBuf0~CmdBuf1)中的指令,間接訪問底層寄存器,實現擴展控制功能。如實現寄存器的位操作,對顯示緩存循環移位、對操作數譯碼等操作。一個有效的指令由一字節操作碼和數個操作數組成,只有操作碼的指令稱為純指令,帶操作數的指令稱為復合指令,一個完整的指令須在一個I2C幀中(起始信號和結束信號間)連續傳輸到命令(CmdBuf0~CmdBuf1)中。否則會引起錯誤,ZLG7290的控制指令分為二大類:純指令和帶有數據的指令。目前六十四頁\總數一百零七頁\編于十三點●純指令(1)左移指令命令緩沖區Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0CmdBuf00001N3N2N1N0
該指令使與ScanNum相對應的顯示數據和顯示屬性(閃爍)自右向左移動N位((N3~N0)+1),移動后右邊N位無顯示,而與ScanNum不相關的顯示數據和顯示屬性則不受影響。例DpRamB~DpRam0=“87654321”,其中4閃爍,ScanNum=5(“87”不顯示)。執行指令00010001B后DpRamB~DpRam0=“4321”。”4”閃爍高兩位和低兩位無顯示。目前六十五頁\總數一百零七頁\編于十三點(2)右移指令通信緩沖區Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0ComBuf00010N3N2N1N0與左移指令類似,只是移動方向為自左向右,移動后左邊N位((N3~N0)+1)無顯示。例DpRamBDpRam0=“87654321”。其中“3”閃爍ScanNum=5(“87”不顯示),執行指令00100001B后DpRamB~DpRam0=“6543”。“3”閃爍,高四位無顯示。目前六十六頁\總數一百零七頁\編于十三點(3)循環左移指令通信緩沖區Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0ComBuf00011N3N2N1N0
與左移指令類似,不同的是在每移動一位后,原最左位的顯示數據和屬性轉移到最右位。例DpRamB~DpRam0=“87654321”,其中“4”閃爍,ScanNum=5(“87”不顯示),執行指令00110001B后DpRamB~DpRam0=“432165”。“4”閃爍,高兩位無顯示。目前六十七頁\總數一百零七頁\編于十三點(4)循環右移指令通信緩沖區Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0ComBuf00100N3N2N1N0
與循環左移指令類似,只是移動方向相反。例DpRamB~DpRam0=“87654321”,其中”3”閃爍,ScanNum=5(”87”不顯示)。執行指令01000001B后DpRamB~DpRam0=“216543”。”3”閃爍。(5)SystemReg寄存器位尋址指令通信緩沖區Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0ComBuf00101OnS2S1S0當On=1時第S(S2~S0)位置1;當On=0時第S位清0。目前六十八頁\總數一百零七頁\編于十三點●復合指令(1)顯示像素尋址指令表3.20顯示像素尋址指令
通信緩沖區Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0ComBuf000000001ComBuf1On0S5S4S3S2S1S0
當On=1時第S(S5~S0)點像素亮(置1),當On=0時第S點像素滅(清0),該指令用于點亮關閉數碼管中某一段或LED矩陣中某一特定的LED,該指令受ScanNum的內容影響,S6~S0為像素地址有效范圍從00H~3FH,無效的地址不會產生任何作用,像素位地址映象如下:●復合指令(1)顯示像素尋址指令表3.20顯示像素尋址指令目前六十九頁\總數一百零七頁\編于十三點表3.21像素位地址映像像素地址SaSbScSdSeSfSgShDpRam000H01H02H03H04H05H06H07HDpRam108H09H0AH0BH0CH0DH0EH0FH…DpRam738H39H3AH3BH3CH3DH3EH3FH(2)按位下載數據且譯碼指令表3.22譯碼指令
通信緩沖區Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0CmdBuf00110A3A2A1A0CmdBuf1DPFlash0D4D3D2D1D0目前七十頁\總數一百零七頁\編于十三點其中A3~A0為顯示緩存編號(范圍為:0000B~0111B對應DpRam0~DpRam7,無效的編號不會產生任何作用),DP=1時點亮該位小數點,Flash=1時該位閃爍顯示,Flash=0時該位正常顯示,D4~D0為要顯示的數據,按以下表規則進行譯碼。目前七十一頁\總數一百零七頁\編于十三點表3.23譯碼目前七十二頁\總數一百零七頁\編于十三點(3)閃爍控制指令表3.24閃爍控制指令
通信緩沖區Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0CmdBuf00111××××CmdBuf1F7F6F5F4F3F2F1F0
當Fn=1時,該位閃爍(n的范圍為:0~7,對應0~7位),當Fn=0,時該位不閃爍,該指令會改變所有像素的閃爍屬性。例執行指令01110000B,00000000B后所有數碼管不閃爍。目前七十三頁\總數一百零七頁\編于十三點5.通信接口
ZLG7290的I2C接口傳輸速率可達32kbit/s,容易與處理器接口,并提供鍵盤中斷信號,提高主處理器時間效率,ZLG7290的從地址slaveaddress為70H(01110000B)有效的按鍵動作,普通鍵的單擊連擊和功能鍵狀態變化都會令系統寄存器SystemReg的KeyAvi位置1,/INT引腳信號有效變為低電平,用戶的鍵盤處理程序可由/INT引腳低電平中斷觸發,以提高程序效率,也可以不采樣/INT引腳信號,節省系統的I/O數而輪詢系統寄存器的KeyAvi位,要注意讀鍵值寄存器會令KeyAvi位清0,并會令/INT引腳信號無效。為確保某個有效的按鍵動作,所有參數寄存器的同步性,建議利用I2C通信的自動增址功能連續讀RepeatCntFunctionKey和Key寄存器。
目前七十四頁\總數一百零七頁\編于十三點但用戶無需擔心寄存器的同步性問題,應為鍵參數寄存器變化速度較緩慢,典型為250ms,最快9ms。ZLG7290內可通過I2C總線訪問的寄存器地址范圍為00H17H,任一寄存器都可按字節直接讀寫,也可以通過命令接口間接讀寫或按位讀寫,請參考指令詳解部分,支持自動增址功能,訪問一寄存器后,寄存器子地址subaddress自動加一和地址翻轉功能,訪問最后一寄存器子地址17H后,寄存器子地址翻轉為00HZLG7290的控制和狀態查詢全部都是通過讀/寫寄存器實現的,用戶只需象讀寫24C02內的單元一樣,即可實現對ZLG7290的控制,關于I2C總線訪問的細節請參考I2C總線規范。目前七十五頁\總數一百零七頁\編于十三點3.4.2鍵盤驅動
鍵盤驅動程序詳見本書所附光盤,鍵盤掃描碼是通過中斷的方式獲得的,當設置好上位機的IIC地址以后,單片機(MEGA8)檢測到鍵盤變化時,會主動發送鍵盤掃描碼。這時ARM將產生IIC中斷,在中斷服務程序中獲得鍵盤掃描碼,鍵盤按下時發送0x80|scancode,抬起時發送scancode,scancode即為鍵盤掃描碼,再通過GetKey()函數映射成可以在led上顯示的數據.關于單片機(MEGA8)的使用有文檔說明,下面主要說明鍵盤中斷的流程.本實驗在中斷前進行了兩步初始化:目前七十六頁\總數一百零七頁\編于十三點首先是對中斷中用到一個結構體的設置,結構體中各成員變量的意義見結構體的定義,這一步是在函數ISR_Init()中完成的,這個函數在ISR.C中,主要是對中斷中用到的寄存器進行初始化,這些寄存器包括:INTMOD,INTMSK,INTSUBMSK,SRCPND,INTPND。其次是在主函數中完成對鍵盤中斷服務函數和中斷偏移量(INTOFFSET)的關聯及對單片機(MEGA8)工作方式的設置,其中包括對IIC總線的初始化,這是在函數Key_init()中完成的,此函數在KeyBoard.c中。中斷服務函數和中斷偏移量(INTOFFSET)的關聯是通過函數SetISR_Interrupt(IRQ_KBD,Key_ISR,NULL)來完成的。有了這一步的關聯以后當查詢到中斷偏移量是IRQ_KBD時就會根據此偏移量調用鍵盤中斷服務函數Key_ISR。目前七十七頁\總數一百零七頁\編于十三點有了上面兩步的初始化工作以后,當有鍵盤按下時就會發生IRQ中斷,過程是先跳轉到startup.s中的bIRQ_Handler處,然后保存寄存器r0-r12,lr跳轉到函數ISR_IrqHandler中,在這個函數中查詢中斷向量的偏移量,根據這個偏移量調用相應的中斷服務函數。執行完中斷服務函數后再跳轉回startup.s中的LDMFDsp!,{r0-r12,lr}處,恢復執行中斷服務函數之前的狀態,繼續執行發生中斷服務前的下一條指令.至此中斷過程結束,在中斷服務函數中獲得鍵盤的掃描碼,再通過GetKey()函數映射成led可以顯示的數據。其源程序代碼詳見本書所帶光盤,在ADS1.2下編譯調試通過。目前七十八頁\總數一百零七頁\編于十三點3.4.3鍵盤及LED驅動軟件設計(KeyBoard.c)1.定義鍵盤映射表:#include"../inc/reg2410.h"#include"../inc/lib.h"#include"../inc/macro.h"#include"../inc/isr.h"#include"../inc/KeyBoard.h"#include"../inc/iic.h"#include"../inc/Uart.h"#include"inc/lcd.h"#include<stdio.h>#include<string.h>目前七十九頁\總數一百零七頁\編于十三點#defineKBDTYPE_ZLG7290 1#defineKBDTYPE_MCUIIC 2#defineKEYBOARD_TYPE KBDTYPE_MCUIIC#defineKEY_DOWN (1ul<<31)#include"../inc/i2c-tomega8.h"#defineIRQ_KBD IRQ_IIC#defineMCU_IICCON (IICCON_ACKEN|IICCON_INTR|IICCON_CLKPRE(7))unsignedshortmcukey,tempmcukey,up,count;目前八十頁\總數一百零七頁\編于十三點staticvoidKey_ISR(intvector,void*data){staticintframecnt=0;U8status,kdata;status=rIICSTAT;if((status&IICSTAT_MODE_MSK)!=IICSTAT_MODE_SR)return;kdata=rIICDS;switch(framecnt){case0:if(status&IICSTAT_SLAVEADDR){ framecnt++;}break;目前八十一頁\總數一百零七頁\編于十三點case1:if(GetI2C_Devtype(kdata)!=DTYPE_MKEYB){ framecnt=0;} framecnt++; break; case2: mcukey=kdata; if(mcukey&0x80) {framecnt=0;break;}
目前八十二頁\總數一百零七頁\編于十三點elseif(!(mcukey&0x80)){up=1; count=1; tempmcukey=mcukey; }
framecnt=0; break; }rIICCON&=~IICCON_INTPEND;}目前八十三頁\總數一百零七頁\編于十三點voidKey_init(void){ I2C_controli2c_ctrl; IIC_init(); Set_IIC_mode(MCU_IICCON,NULL); i2c_ctrl.cmd=CMD_MST_ADDR; i2c_ctrl.ctrl=I2COWNER_ADDRESS; IIC_Send(MEGA8_I2CADDRESS,(constchar*)&i2c_ctrl,sizeof(i2c_ctrl)); i2c_ctrl.cmd=CMD_CTRL; i2c_ctrl.ctrl=CTRL_MKEn; IIC_Send(MEGA8_I2CADDRESS,(constchar*)&i2c_ctrl,sizeof(i2c_ctrl));INTS_OFF(); SetISR_Interrupt(IRQ_KBD,Key_ISR,NULL);INTS_ON();}目前八十四頁\總數一百零七頁\編于十三點voidKey_init_restor(void){ IIC_init(); Set_IIC_mode(MCU_IICCON,NULL);}目前八十五頁\總數一百零七頁\編于十三點unsignedcharGetKey(){unsignedcharscankey; unsignedcharKeyBoard_Map[]={0,0,0x9e,0,0,0xe0,0x66,0x60,0,0,0x8e ,14,0,0xfe,0xb6,0xda,0xfc,0x1c,0x6e,0,0,0xf6,0xbe,0xf2,0x3e,0,0,0,0,0xce,0,0x7c,0,1,0,0,17,2,0,0,0,4,0,6,0,5,0,0,0,7,0,9,15,8,0,0,0,0,0,0,0,0,0,0};//64,鍵值映射表 目前八十六頁\總數一百零七頁\編于十三點while(1){ if((up==1)&&(count==1)){up=0;count=0;scankey=KeyBoard_Map[tempmcukey];break;}elsecontinue;}returnscankey;}目前八十七頁\總數一百零七頁\編于十三點2.主函數,將按鍵值在數碼管上顯示,流程圖如圖3.20所示。圖3.20主函數目前八十八頁\總數一百零七頁\編于十三點//main()主函數#include"inc/macro.h"#include"inc/KeyBoard.h"#include<string.h>#include<stdio.h>#include"inc/Uart.h"#include"inc/lcd.h"#include"inc/reg2410.h"#include"inc/iic.h"#include"inc/uhal.h"#include"inc/lib.h"#pragmaimport(__use_no_semihosting_swi)//ensurenofunctionsthatusesemihosting目前八十九頁\總數一百零七頁\編于十三點intmain(void){U8key; ARMTargetInit();//dotarget(uHALbasedARMsystem)initialisation// Key_init(); while(1) {key=GetKey(); Led_IIC_init(); hudelay(100);IIC_Write(0x70,0x0d,0);IIC_Write(0x70,0x10,key);hudelay(2000);Key_init_restor();hudelay(100); } return0; }目前九十頁\總數一百零七頁\編于十三點3.5S3C2410X的D/A功能應用開發3.5.1D/A轉換器類型
DA轉換器的內部電路構成無太大差異,一般按輸出是電流還是電壓、能否作乘法運算等進行分類。大多數DA轉換器由電阻陣列和n個電流開關(或電壓開關)構成。按數字輸入值切換開關,產生比例于輸入的電流(或電壓)。1.電壓輸出型(如TLC5620)電壓輸出型DA轉換器雖有直接從電阻陣列輸出電壓的,但一般采用內置輸出放大器以低阻抗輸出。直接輸出電壓的器件僅用于高阻抗負載,由于無輸出放大器部分的延遲,故常作為高速DA轉換器使用。目前九十一頁\總數一百零七頁\編于十三點2.電流輸出型(如THS5661A)
電流輸出型DA轉換器很少直接利用電流輸出,大多外接電流—電壓轉換電路得到電壓輸出,轉換有兩種方法:一是只在輸出引腳上接負載電阻而進行電流—電壓轉換,二是外接運算放大器。用負載電阻進行電流—電壓轉換的方法,雖可在電流輸出引腳上出現電壓,但必須在規定的輸出電壓范圍內使用,而且由于輸出阻抗高,所以一般外接運算放大器使用。此外,大部分CMOSDA轉換器當輸出電壓不為零時不能正確動作,所以必須外接運算放大器。當外接運算放大器進行電流電壓轉換時,則電路構成基本上與內置放大器的電壓輸出型相同,這時由于在DA轉換器的電流建立時間上加入了運算放入器的延遲,使響應變慢。此外,這種電路中運算放大器因輸出引腳的內部電容而容易起振,有時必須作相位補償。目前九十二頁\總數一百零七頁\編于十三點3.乘算型(如AD7533)
DA轉換器中有使用恒定基準電壓的,也有在基準電壓輸入上加交流信號的,后者由于能得到數字輸入和基準電壓輸入相乘的結果而輸出,因而稱為乘算型DA轉換器。乘算型DA轉換器一般不僅可以進行乘法運算,而且可以作為使輸入信號數字化地衰減的衰減器及對輸入信號進行調制的調制器使用。4.一位DA轉換器
一位DA轉換器與前述轉換方式全然不同,它將數字值轉換為脈沖寬度調制或頻率調制的輸出,然后用數字濾波器作平均化而得到一般的電壓輸出(又稱位流方式),用于音頻等場合。目前九十三頁\總數一百零七頁\編于十三點3.5.2MAX504與S3C2410X的接口D/A轉換器的主要技術指標:●分辯率(Resolution)指最小模擬輸出量(對應數字量僅最低位為‘1’)與最大量(對應數字量所有有效位為‘1’)之比。●建立時間(SettingTime)是將一個數字量轉換為穩定模擬信號所需的時間,也可以認為是轉換時間。DA中常用建立時間來描述其速度,而不是AD中常用的轉換速率。一般地電流輸出DA建立時間較短,電壓輸出DA則較長。其他指標還有線性度(Linearity),轉換精度,溫度系數/漂移。目前九十四頁\總數一百零七頁\編于十三點
下面以D/A轉換芯片為例說明其與S3C2
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 車輛租賃安全責任書范本
- 公交公司六月安全生產月實施方案
- 物業行業安全生產培訓
- 宜賓工傷事故賠償
- 2024年福建漳州龍海區滸茂中學招聘考試真題
- S-plus-Ketoprofen-d3-S-Ketoprofen-d-sub-3-sub-生命科學試劑-MCE
- 重慶市工程管理有限公司招聘考試真題2024
- 湖北鄂州華容區公益性崗位招聘考試真題2024
- 康復醫療器械市場細分報告:2025年康復設備產業鏈投資機會
- Pradimicin-Tl-生命科學試劑-MCE
- 銀行業反洗錢培訓課件
- 醫美行業營銷策劃方案模板
- 2025年人教版一年級下冊數學期末模擬試卷(含答案)
- 資產評估風險管理制度
- 餐廳控煙制度管理制度
- 新媒體部筆試題目及答案
- 道路旅客運輸安全生產管理制度x
- 人教(部編版)道德與法治八下5.3基本政治制度教學設計
- 黑龍江省2024年普通高校招生體育類本科批院校專業組投檔分數線(歷史類)
- 水閘地基施工方案
- 《建立合適邊界:親子教育課件》
評論
0/150
提交評論