OCx與OCxREF和CCxP之間的關系
初學STM32,我這個地方卡了很久,現(xiàn)在終于有些明白了,現(xiàn)在把我的理解寫下與大家共享,如果有不對的地方,還請指出。
OCxREF就是一個參考信號,并且約定:
OCxREF=1,稱OCxREF有效。反之,OCxREF=0,稱OCxREF無效;
‘1’電平(高電平)稱為OCxREF的有效電平,‘0’ 電平(低電平)稱為OCxREF的無效電平。
——依據(jù)參考手冊:The output stage generates an intermediate waveform which is then used for reference:OCxRef (active high). The polarity acts at the end of the chain.
(翻譯)輸出階段產(chǎn)生一個中間波形OCxRef(高有效)作為參考。輸出信號的極性體現(xiàn)在信號鏈的末端。
現(xiàn)在解釋幾個名詞之間的關系:
然后來理解輸出比較的幾個模式(PWM模式是輸出比較模式的特例)
查看TIMx_CCMR1寄存器的OC1M域,有如下定義(摘自最新版的參考手冊)
翻譯如下:
000:凍結(jié)——輸出比較寄存器TIMx_CCR1中的內(nèi)容與計數(shù)器TIMx_CNT中的內(nèi)容之間的比較對輸出無影響。(此模式用于時基的生成)
001:當匹配時,設置通道1為有效電平。當計數(shù)器TIMx_CNT中的內(nèi)容與捕捉/比較寄存器1(TIMx_CCR1)中的內(nèi)容相匹配時,強行拉高OC1REF信號。
010:當匹配時,設置通道1為無效電平。當計數(shù)器TIMx_CNT中的內(nèi)容與捕捉/比較寄存器1(TIMx_CCR1)中的內(nèi)容相匹配時,強行拉低OC1REF信號。
011:翻轉(zhuǎn)——當TIMx_CNT= TIMx_CCR1時,OC1REF信號取反。
100:強制無效電平——強行拉低OC1REF信號。
101:強制有效電平——強行拉高OC1REF信號。
110:PWM模式1——向上計數(shù)模式中,只要TIMx_CNT< TIMx_CCR1,通道1有效,反之無效。向下計數(shù)模式中,只要TIMx_CNT> TIMx_CCR1,通道1無效(OC1REF=0),反之有效(OC1REF=1)。
110:PWM模式2——向上計數(shù)模式中,只要TIMx_CNT< TIMx_CCR1,通道1無效,反之有效。向下計數(shù)模式中,只要TIMx_CNT> TIMx_CCR1,通道1有效,反之無效。
我用紅色標出了提到有效、無效的地方。不難發(fā)現(xiàn),有效與無效分別對應OC1REF=1和OC1REF=0。這正是我們先前約定的結(jié)果。
到此,不同模式下輸出比較的結(jié)果對OC1REF信號的影響已經(jīng)很清楚了,但是最終的輸出信號是OC1,并不是OC1REF。而且前面有一句話(輸出信號的極性體現(xiàn)在信號鏈的末端)還未做解釋。
到底OC1REF與OC1之間有何秘密呢?我們來看下面這個圖:
顯然,我們只關心紅色圈內(nèi)的信號與方框內(nèi)的寄存器位以及信號在它們之間是如何傳播的。
oc1ref從輸出模式控制器(Output mode controller)開始,分為兩路,上面一路至主模式控制器(To the master mode controller),這里我們不關心它的去向,我們關心的是下面一路,下面一路在進入雙路開關之前又被分成了兩路——一路是原信號,一路是原信號的非。顯然TIMx_CCER中的CC1P位用來控制這個開關,CC1E位控制著整條信號鏈的通斷。
當CC1P=0時(CC1E=1):
當CC1P=1時(CC1E=1):
很顯然,OC1與OC1REF的關系只受CC1P的影響(CC1E=1)
然而參考手冊上對CC1P位是這么描述的:
CC1P=0時:OC1高電平有效
CC1P=1時:OC1低電平有效
根據(jù)本文開篇的名詞解釋,可以這么理解:
CC1P=0時:OC1有效電平是高電平
CC1P=1時:OC1有效電平是低電平
這時就迷惑了,這個高電平有效和低電平有效是啥意思呢?
我們從頭分析(整個過程CC1E=1,OC1的輸出是允許的):
1假定OC1REF有效(OC1REF=1),那么從OC1REF到OC1的整條信號鏈上的信號都是有效信號,我們稱OC1輸出了有效信號。
那這個有效信號是高電平還是低電平呢?
這就是由CC1P決定的:
2假定OC1REF無效(OC1REF=0),那么從OC1REF到OC1的整條信號鏈上的信號都是無效信號,我們稱OC1輸出了無效信號。
無效信號的高電平和低電平也是由CC1P決定:
用一張表來總結(jié)上述過程:
OC1REF
CC1P
功能
OC1
描述
0
0
OC1高電平有效
0(低電平)
無效
1
OC1低電平有效
1(高電平)
無效
1
0
OC1高電平有效
1(高電平)
有效
1
OC1低電平有效
0(低電平)
有效
顯然,OC1REF決定了OC1輸出電平是否有效,而CC1P決定了有效電平的極性。
我們抽出上表的后四列:
CC1P
功能
OC1
描述
0
OC1高電平有效
0(低電平)
無效
1
OC1低電平有效
1(高電平)
無效
0
OC1高電平有效
1(高電平)
有效
1
OC1低電平有效
0(低電平)
有效
我們將表按1、2列合并
CC1P
功能
OC1
描述
0
OC1高電平有效
0(低電平)
無效
OC1高電平有效
1(高電平)
有效
1
OC1低電平有效
0(低電平)
有效
OC1低電平有效
1(高電平)
無效
現(xiàn)在很清楚了,從上表中可以清楚地看到CC1P對OC1有效極性的控制。即,OC1的極性只有與CC1P指定的有效極性一致,OC1才能是有效的(綠色部分)。這樣就解釋了“輸出信號的極性體現(xiàn)在信號鏈的末端”這句話。
然而這條鏈還未結(jié)束,還有個CC1E呢。當然,它就是一個OC1輸出使能位而已。
但細心的你可能會發(fā)現(xiàn),參考手冊上對CC1E位有這樣的描述:
OCx = OCxREF + Polarity
這個式子告訴我們OCx與OCxREF和Polarity(極性,即CCxP位)的關系。
我們上面提到了它們的關系,是分了兩種情況(CC1P=0和CC1P=1)表示的,這個式子幫我們將上面關系歸納成了一個。這個式子怎么得來的?
回憶一下數(shù)字電路里面的半加器(就是不進位的加法),真值表如下:
OCxREF
Polarity
OCx
0(無效)
0(高有效)
0(無效)
0(無效)
1(低有效)
1(無效)
1(有效)
0(高有效)
1(有效)
1(有效)
1(低有效)
0(有效)
我們寫邏輯函數(shù)(按黃色部分寫):
注意:前面的“+”號表示半加運算(不進位加法),其實是邏輯上的“異或”。
其實就是OCx = OCxREF^ Polarity,^為異或。