2021-07-05

第二章 單片機(jī)的硬件

本章部分內(nèi)容涉及的尋址德澈、中斷等內(nèi)容缸逃,將在后續(xù)章節(jié)介紹休讳。


2.1 硬件組成
image-20210705143940468.png

  • 8位CPU脆霎,包含運(yùn)算器和控制器兩大部分。
  • 數(shù)據(jù)儲存器(256B RAM)滞项,但在片外可以外擴(kuò)狭归,最多可以多外擴(kuò)64 KB。
  • 程序存儲器(8KB Flash ROM)文判,片外也可以外擴(kuò)过椎,但片外最多外擴(kuò)至64 KB。即“片內(nèi)+片外”的ROM不超過64 KB戏仓。
  • 4個8位并行I/O口
  • 3個可編程的16位定時器/計數(shù)器
  • 6個中斷源疚宇,6個中斷向量(中斷服務(wù)子程序入口地址),兩級中斷優(yōu)先權(quán)赏殃。
  • SFR敷待。共有32個SFR,用于CPU對片內(nèi)各外設(shè)部件進(jìn)行管理仁热、控制和監(jiān)視榜揖。SFR映射在片內(nèi)的RAM(地址為80H-FFH)。
  • 一個Watch Dog Timer
  • 有在低功耗下工作的節(jié)電的空閑模式(Idle Mode)和掉電模式(Power Down Mode)

各個部件通過單片機(jī)片內(nèi)的單一總線連接而成股耽。CPU對片內(nèi)各種外設(shè)部件的控制根盒,是利用特殊功能寄存器(SFR)進(jìn)行集中控制的。

2.2 引腳功能

主要為40引腳的DIP(double in-line package)封裝物蝙。

PLCC(plastic leaded chip carrier)封裝和TQFP(thin quad flat package)封裝不常見炎滞。

DIP封裝方式的單片機(jī)有40個引腳。


2.png

這40個引腳可以分為三類

  • 電源及時鐘引腳V_{CC}诬乞、V_{SS};XTAL1,XTAL2(注:XTAL 就是crystal 晶體)
  • 控制引腳 \overline{PSEN}册赛、ALE/ \overline{PROG}、\overline{EA}/ V_{PP}震嫉、RST
  • I/O 引腳 4×8 = 32 個

選取一些較為具體地講一下

  • XTAL1是片內(nèi)時鐘振蕩器的反相放大器的輸入端森瘪。若單片機(jī)使用片內(nèi)時鐘,該引腳接石英晶體和微調(diào)電容票堵。若使用外部時鐘時扼睬,該引腳接外部時鐘振蕩器的輸出。
  • XTAL2是片內(nèi)時鐘振蕩器的反相放大器的輸出端悴势。若單片機(jī)使用片內(nèi)時鐘時窗宇,該引腳同樣接石英晶體和微調(diào)電容措伐。若使用外部時鐘,則該引腳懸空军俊。
  • RST為復(fù)位信號輸入端侥加,上面沒杠代表高電平有效。具體地說粪躬,如果給該引腳加超過兩個機(jī)器周期(24個時鐘周期)的高電平担败,則單片機(jī)復(fù)位。單片機(jī)正常工作時镰官,這個引腳的輸入應(yīng)為 ≤ 0.5 V的低電平提前。看門狗讓單片機(jī)復(fù)位的原理朋魔,就是當(dāng)看門狗的定時器溢出時岖研,看門狗定時器會向RST引腳輸出一個長達(dá)8個機(jī)器周期的高電平,所以單片機(jī)就會復(fù)位警检。
  • \overline{EA}引腳意為地址使能(Enable Address)。這里的地址就是外部程序存儲器(ROM)的地址空間害淤,當(dāng) \overline{EA}的輸入為高電平時扇雕,單片機(jī)先讀片內(nèi)ROM中的代碼,再讀片外ROM中存放的代碼窥摄。當(dāng) \overline{EA}輸入為低電平時镶奉,就只讀取外部ROM中存儲的代碼。
  • ALE意為地址鎖存使能(Address Latch Enable)崭放。它的存在哨苛,是因?yàn)閱纹瑱C(jī)的引腳數(shù)目有限,因此P0口是作為低8位地址總線和8位數(shù)據(jù)總線分時復(fù)用的币砂。當(dāng)單片機(jī)要和外界進(jìn)行數(shù)據(jù)交流時(單片機(jī)要訪問外部ROM/RAM)建峭,這時候P0口就要變成8位數(shù)據(jù)總線,在變成數(shù)據(jù)總線之前决摧,ALE會進(jìn)行一次負(fù)跳變,將P0口先發(fā)出的低8位地址鎖存到P0口外接的地址鎖存器中,完成這一操作后挠进,P0口才能夠放心大膽地去當(dāng)它的數(shù)據(jù)總線矾麻。這也是地址鎖存使能名字的由來。
  • \overline{PSEN} (Program Strobe ENable)波岛。Strobe意為閘門茅坛,因此這個引腳的作用就是當(dāng)單片機(jī)訪問片外ROM讀取指令碼時,這個引腳在每個機(jī)器周期會產(chǎn)生兩次有效信號(低電平信號)则拷。

2.3 CPU

單片機(jī)的CPU由運(yùn)算器和控制器組成

2.3.1 運(yùn)算器

運(yùn)算器用于對操作數(shù)進(jìn)行算術(shù)贡蓖、邏輯和位操作曹鸠。運(yùn)算器主要包括

  1. 算術(shù)邏輯運(yùn)算單元(Arithmetic Logical Unit, ALU)。ALU可以對8位(單字節(jié))的變量進(jìn)行邏輯和算術(shù)運(yùn)算摩梧,也可以對位變量進(jìn)行邏輯運(yùn)算和set物延、reset、complete等運(yùn)算仅父。

  2. 累加器A叛薯。CPU中使用最頻繁的8位寄存器,為32個SFR之一笙纤。作用:

    • 作為ALU的輸入之一耗溜,也是ALU輸出結(jié)果的存放地。
    • 數(shù)據(jù)傳送的中轉(zhuǎn)站省容。但由于累加器只有一個抖拴,如果大家都要用累加器中轉(zhuǎn)就會堵車,所以單片機(jī)增加了一部分?jǐn)?shù)據(jù)傳送指令腥椒,這使得某些數(shù)據(jù)的傳送可以不經(jīng)過累加器阿宅。累加器有一個進(jìn)位位Cy(位于PSW中),這個Cy同時也是位處理器的(位)累加器
  3. 程度狀態(tài)字寄存器(Program Status Word, PSW)笼蛛。顧名思義洒放,這是一個8位寄存器,而且每個位都包含了程序運(yùn)行狀態(tài)的不同信息滨砍⊥堪稱是單片機(jī)的體檢報告單。PSW的從高到低依次為

    • Cy 進(jìn)位標(biāo)志位惋戏。
    • Ac 輔助進(jìn)位標(biāo)志位领追。
    • F0 用戶使用的標(biāo)志位。
    • RS1 RS0 工作寄存器選擇控制位响逢。
    • OV 溢出標(biāo)志位绒窑。
    • PSW.1 保留位,無用
    • P 奇偶校驗(yàn)位龄句。用以表示累加器A中 1 的個數(shù)回论。P =1 代表A中 1 的個數(shù)為奇數(shù)。

2.3.2 控制器

CPU的控制器是識別指令分歇,并根據(jù)指令性質(zhì)控制片內(nèi)各部件傀蓉,具體而言,就是對控制指令(程序)進(jìn)行讀入职抡、譯碼和執(zhí)行葬燎。控制器包含:

  • 程序計數(shù)器(Program Counter, PC)。PC是一個獨(dú)立的16位計數(shù)器谱净,用戶沒辦法直接訪問PC(讀/寫)窑邦。當(dāng)單片機(jī)復(fù)位時,PC的值會變成 0000H壕探。PC的值實(shí)際上是某個程序(指令)的地址冈钦,因此PC就是程序存儲器(ROM)的地址指針,也就是程序指針李请。程序指針和程序計數(shù)器是從不同的方面描述同一個事物(PC)瞧筛,它們指的是同一個東西。PC的工作過程是這樣的:當(dāng)CPU想要讀取某條指令時导盅,CPU會將PC的值——也就是指令的地址——告知程序存儲器(ROM),然后程序存儲器就會把這個地址上的指令找出來供CPU讀取较幌,CPU讀取指令后,PC自加——這也是為什么PC名字的由來白翻。最最最重要的一點(diǎn):PC的計數(shù)寬度(16 位)乍炉,決定了單片機(jī)能夠訪問的ROM的范圍(2^{16} B = 64 KB),因此程序存儲器最多只能有64 KB滤馍。

2.4 存儲器(最難)

單片機(jī)的存儲器空間可以劃分成四類

2.4.1 程序存儲器(ROM) 重要

單片機(jī)之所以可以按敵營的次序工作岛琼,就是因?yàn)镽OM中存放了調(diào)試正確的程序。單片機(jī)的地址總線有16位巢株,這意味著有共2^{16} B = 64 KB的空間可供程序指令居住衷恭。片內(nèi)ROM是8 KB的Flash存儲器,地址范圍為0000H-1FFFH纯续。片外可最大外擴(kuò)64 KB的ROM,地址范圍為0000H-FFFFH灭袁。在這里猬错,我們會看到片內(nèi)和片外ROM有一部分地址(門牌號)是相同的,但是茸歧!由于對片內(nèi)ROM和片外ROM的尋址方式是不同的倦炒,所以即使門牌號相同也不會引起誤解,系統(tǒng)根據(jù)指令软瞎,會知道到底是訪問片內(nèi)的0000H還是片外的0000H逢唤。

在ROM的使用中,需要注意兩個問題:

  1. CPIU究竟是訪問片內(nèi)還是片外ROM涤浇,是由\overline{EA}引腳決定的鳖藕。 當(dāng)\overline{EA} = 0 時,片內(nèi)的ROM是沒人管的 即使里面儲存有程序代碼也沒用只锭。

  2. 程序存儲器(ROM)中的一個單元對應(yīng)一個字節(jié)著恩,可以存放一條單字節(jié)指令。程序存儲器的某些單元是給中斷服務(wù)子程序留的,這些位專門作為中斷服務(wù)子程序的入口地址

    3.png

    如上表所示喉誊,一共有6個單元是留給中斷服務(wù)子程序做入口地址的邀摆。但大家也可以看,這些入口之間彼此的空間是很狹窄的伍茄,僅有8個單元栋盹,如果我們要寫中斷服務(wù)子程序,一般來講肯定是寫不下的敷矫,除非你的中斷服務(wù)程序就一兩條指令例获,而與此同時,ROM可是有著64 KB(2^{16}個單元)的空間沪饺,還有廣闊天地可以用于儲存程序躏敢。因此,通常的做法是在這些入口存放一條跳轉(zhuǎn)指令整葡,并在相應(yīng)的地方再寫上完整的中斷服務(wù)子程序件余。這樣,當(dāng)中斷觸發(fā)時遭居,CPU的PC值等于中斷服務(wù)子程序入口地址時啼器,PC就會根據(jù)相應(yīng)的指令跳向那個儲存著完整中斷子程序的地方(那個地方才能真正稱為中斷服務(wù)子程序的入口地址,前述那個倒不如說是個藏寶圖)俱萍。

    而且端壳,由于單片機(jī)復(fù)位后PC的值變成0000H,我們可以看到枪蘑,0000H和外部中斷0的入口地址0003H之間僅僅隔著三個單元损谦,這么狹窄的空間,主程序怎么可能寫的下呢岳颇?但三個單元的空間放個跳轉(zhuǎn)指令還是可以的照捡,所以一般在0000H單元存放一條跳轉(zhuǎn)指令,單片機(jī)一復(fù)位话侧,CPU一讀取這個跳轉(zhuǎn)指令栗精,就跳向主程序的入口地址。

2.4.2 數(shù)據(jù)存儲器(RAM) 重要

單片機(jī)的片內(nèi)RAM共有256B(256個字節(jié))瞻鹏,字節(jié)地址為00H-FFH
4.png

如上圖悲立,這個就是單片機(jī)內(nèi)部RAM的結(jié)構(gòu),但是高128 B的RAM和SFR的地址時一樣的新博,如果發(fā)生要找高128 B的 RAM 薪夕,卻誤打誤撞跑去找了SFR,這可怎么辦呢叭披?這當(dāng)然是不可能的寥殖。玩讳。。它們的指令尋址方式是不同的嚼贡,CPU會自己判斷這個80H是RAM的還是SFR的熏纯。對于高128 B (80H-FFH)的 RAM,只能通過間接尋址(@)粤策,而對于相同地址的SFR樟澜,只能通過直接尋址,對于低128 B的RAM叮盘,既可以直接尋址也可以間接尋址秩贰。

同時我們會看到20H-2FH是位尋址去,這表明這個區(qū)域既可以位尋址也可以字節(jié)尋址柔吼。而30H-7FH的 RAM只能字節(jié)尋址毒费。

如果使用了片外的RAM,我們會發(fā)現(xiàn)片外的低256 B的地址和片內(nèi)這邊的低256 B的地址肯定是一樣的愈魏,但還是一樣觅玻,我們會使用不同的匯編語言指令尋址方式來訪問這兩塊數(shù)據(jù)區(qū),CPU會自己判斷某個00H究竟是片內(nèi)RAM的還是片外RAM的培漏。

2.4.3 SFR (重要)

SFR的單元地址在片內(nèi)RAM的80H-FFH中(前述溪厘,片內(nèi)RAM有兩個80H-FFH),前面提到SFR只有32個牌柄,而片內(nèi)RAM的80H-FFH是有128個字節(jié)的畸悬,所以SFR的32個地址是離散地分布在這個區(qū)域的。

千萬要注意珊佣,片內(nèi) RAM的80H-FFH蹋宦,里面是SFR的地址,不是SFRV涠汀妆档!SFR的值不在那里。

這里主要介紹的SFR有

  1. 堆棧指針(Stack Pointer, SP)虫碉。堆棧指針,顧名思義胸梆,SP里面存放的值就是堆棧的地址敦捧。堆棧在片內(nèi)的RAM中,而SP的值則是堆棧頂部在片內(nèi)RAM的位置碰镜。它的值可以值00H-FFH的任意一個值兢卵。堆棧要注意兩個詞——向上生長和先進(jìn)后出。單片機(jī)復(fù)位后绪颖,SP的值為07H秽荤,由于向上生長甜奄,當(dāng)?shù)谝粋€字節(jié)被壓入堆棧時,SP的值會變成08H窃款,也就是說堆棧實(shí)際上是從08H開始的课兄。而我們可以看到,片內(nèi) RAM的08H-1FH是工作寄存器的地盤晨继,堆棧設(shè)在要在用戶RAM區(qū)會好一點(diǎn)烟阐,因此通常的操作是,在單片機(jī)復(fù)位后紊扬,先把SP的值從07H改成60H或者其他大于30H的值蜒茄,以避免進(jìn)入別人的地盤。

    這里在強(qiáng)調(diào)一下堆棧的作用餐屎,堆棧是為了調(diào)用子程序有關(guān)中斷的操作而設(shè)立的檀葛,它的功能是

    • 保護(hù)斷電。無論是子程序調(diào)用還是中斷服務(wù)子程序的調(diào)用腹缩,主程序的進(jìn)行都會被“打斷”屿聋。但是等子程序執(zhí)行完畢后,主程序還得從原來的地方繼續(xù)它的生活庆聘,因此要把主程序的斷點(diǎn)地址(你已經(jīng)想到了胜臊,是PC的值)壓到堆棧(PC是16位,所以要壓兩個字節(jié)到堆棧)伙判。為主程序之后做回原來的自己做準(zhǔn)備象对。
    • 保護(hù)現(xiàn)場。單片機(jī)在“打斷”主程序后宴抚,要執(zhí)行子程序勒魔。而子程序的執(zhí)行,很可能要用到單片機(jī)中的一些寄存器菇曲,而寄存器原有的內(nèi)容冠绢,我們可能并不想被子程序修改。于是在執(zhí)行子程序之前常潮,有必要把這些寄存器現(xiàn)有的值保護(hù)起來弟胀,也壓到堆棧里。當(dāng)前時刻這些寄存器的值的集合喊式,反映了這個時刻單片機(jī)的狀態(tài)孵户,形象點(diǎn)來理解,就有點(diǎn)類似于“犯罪現(xiàn)場”的意思岔留,因此我們在利用子程序之前夏哭,有必要保護(hù)“現(xiàn)場”不受破壞。
  2. 寄存器B献联。乘除用竖配,好理解何址。

  3. AUXR(AUXILIARY) 輔助寄存器。ALE和看門狗相關(guān)进胯,好理解用爪。

  4. 數(shù)據(jù)指針(DPTR0/1),便于訪問RAM龄减,不作為重點(diǎn)项钮。AUXR1輔助寄存器(也是一個SFR)和數(shù)據(jù)指針相關(guān)

  5. 看門狗(Watch Dog Timer, WDT)。單片機(jī)世界秩序的守護(hù)者希停。包含一個14位的計數(shù)器和看門狗復(fù)位寄存器(WDTRST)

2.4.4 位地址空間

位地址空間共有兩部分烁巫,分別位于片內(nèi)RAM和SFR區(qū)域中。

位地址和字節(jié)地址不同宠能,一個字節(jié)地址代表的一個單元大小是一個字節(jié)亚隙。而一個位地址代表的一個單元,大小是一個位违崇。舉個例子阿弃,位地址的范圍為00H-FFH,有219個(有些位地址無效)羞延,其中位地址 80H代表的是P0的最低位渣淳,也就是說P0最低位的位地址是80H。而位地址00H代表的是片內(nèi) RAM中20H這個單元的最低位伴箩。位地址00H-07H分別代表了片內(nèi)RAM 的20H單元的最低位到最高位入愧。

2.5 I/O 口

內(nèi)容較少,比較重要的點(diǎn)嗤谚,比如

  • P0口可以作用通用的I/O口棺蛛,此時需要在各引腳的片外接上拉電阻。同時P0口也作為8位數(shù)據(jù)總線和低8位地址總線分時復(fù)用巩步。大多數(shù)情況下旁赊,單片機(jī)都要擴(kuò)展 RAM或者I/O 芯片接口,所以P0一般不作為通用I/O 口。
  • P1只能當(dāng)通用I/O 口椅野。
  • P2 可作為高8位地址總線终畅,也可作通用I/O口 。但一般情況下竟闪,單片機(jī)最需要它做地址總線声离。
  • P3的第一功能是通用I/O 口,第二功能
    5.jpg

2.6 時鐘電路

6.jpg

前述所謂“XTAL1/2 接微調(diào)電容和石英晶體”的圖解就在這里瘫怜。

單片機(jī)執(zhí)行指令的動作,均處在CPU控制器下轄的的時序控制電路的控制下本刽,因此我們需要明確這些概念

  • 時鐘周期鲸湃。單片機(jī)時鐘控制信號的基本單位赠涮。\displaystyle T_{OSC} = \frac{1}{f_{osc}}, osc 即oscillation(振蕩)之縮寫。
  • 機(jī)器周期暗挑。定義:CPU完成一個基本操作所需要的時間笋除。每個機(jī)器周期為12個時鐘周期。
  • 指令周期炸裆。定義:執(zhí)行一條指令所需要的時間垃它。指令分為單周期指令、雙周期指令和四周期指令(只有乘除)烹看。

2.7 復(fù)位電路 2.8 最小應(yīng)用系統(tǒng) 2.10 低功耗模式(略)

2.9 看門狗簡介

育碧的《看門狗》名字便來源與此国拇,這也是本人挺喜歡的一款游戲。

系統(tǒng)時刻需要被復(fù)位惯殊,看門狗的意義就是讓單片機(jī)在失控后可以自己復(fù)位酱吝,而不需要外部的監(jiān)視。

簡而言之土思,看門狗的思想就是用一個計數(shù)器對系統(tǒng)時鐘不斷計數(shù)务热,當(dāng)計數(shù)器溢出后看門狗就會把系統(tǒng)復(fù)位,因此如果程序運(yùn)行正常己儒,顯然需要定期喂狗——也就是把看門狗計數(shù)器定期清零崎岂,否則看門狗就會發(fā)瘋,在程序正常運(yùn)行的條件下就把系統(tǒng)復(fù)位闪湾。

課后題(略)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冲甘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子响谓,更是在濱河造成了極大的恐慌损合,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娘纷,死亡現(xiàn)場離奇詭異嫁审,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)赖晶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門律适,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人遏插,你說我怎么就攤上這事捂贿。” “怎么了胳嘲?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵厂僧,是天一觀的道長。 經(jīng)常有香客問我了牛,道長颜屠,這世上最難降的妖魔是什么辰妙? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮甫窟,結(jié)果婚禮上密浑,老公的妹妹穿的比我還像新娘。我一直安慰自己粗井,他們只是感情好尔破,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著浇衬,像睡著了一般懒构。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上径玖,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天痴脾,我揣著相機(jī)與錄音,去河邊找鬼梳星。 笑死赞赖,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的冤灾。 我是一名探鬼主播前域,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼韵吨!你這毒婦竟也來了匿垄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤归粉,失蹤者是張志新(化名)和其女友劉穎椿疗,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體糠悼,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡届榄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了倔喂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铝条。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖席噩,靈堂內(nèi)的尸體忽然破棺而出班缰,到底是詐尸還是另有隱情,我是刑警寧澤悼枢,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布埠忘,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏莹妒。R本人自食惡果不足惜假丧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望动羽。 院中可真熱鬧,春花似錦渔期、人聲如沸运吓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拘哨。三九已至,卻和暖如春信峻,著一層夾襖步出監(jiān)牢的瞬間倦青,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工盹舞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留产镐,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓踢步,卻偏偏與公主長得像癣亚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子获印,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容