我们选择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)。
|