我們選擇800×600 @ 56Hz的原因是因為像素時鐘;
輸出分辨率使用36MHz像素時鐘,周期是72MHz的倍數(STM32的頻率),
因為我們需要使用SPI產生像素信號,可以把STM32的頻率經過SPI預分頻得到18MHz的像素時鐘,
然后將每一個像素點繪制兩次,具體方法是當在水平方向800像素點時輸出一個信號像素,
SPI 的 MOSI信號保持低電平或者高電平兩倍的時間(相比于之前繪制一個點的時間)。
幀緩沖區是一個52×200字節的數組。每一行有50*8=400個像素(每一個bit是一個像素),
剩下的兩個字節(52-50)模擬每一行的消隱間隔。
水平同步
水平同步信號( horizontal synchronism signal)和后延時間(back porch time)由TIM1定時器產生的通道1和2產生,TIM1定時器產生的通道1連接到PA8。
H-SYNC也就是TIM1定時器的通道1將會產生水平同步信號給顯示器。
H-BACKPORCH也就是TIM1定時器的通道2,計算水平同步時間的和以及后延時間,
這個定時器產生一個中斷用于觸發DMA開始通過SPI發送像素的請求。
幀緩沖里面的每一行都會重復這樣的過程,
垂直同步
TIM2定時器用于產生垂直同步信號,但是實在從機模式下。
TIM2計算主機(TIM1)產生的H-SYNC脈沖數。
TIM2的通道2通過PA1輸出V-SYNC信號。
TIM2的通道3將會觸發一個中斷當定時器的計數器達到V-SYNC的和垂直后沿時間。
這個中斷會設置一個變量表明正在掃描一個有效幀并且DMA可以開始發送像素到屏幕了。
像素發生器
像素由SPI的MOSI(PA7)產生。
定時器TIM1的通道2產生一個中斷用于使能DMA TX請求向SPI發送數據。
DMA將會從幀緩沖區讀取一行并且將數據放到SPI的DR寄存器。
DMA被設置用來在一行信號被發送之后產生一個中斷,行號是遞增的。
因為我們將每一行發送了三次,我們在中斷中將計數加1。
當三行數據被發送出去,我們將DMA指針指向下一行的幀緩沖。
當所有的行被發送出去,DMA被禁止直到下一個有效單的幀中斷發生(TIM2通道3)。
|