目 录
1.SPI
2.SPI+DMA
1.SPI
使用SPI通信协议的器件有很多,这里以TFT屏驱动为ST7735为例。
设置SPI,因为我使用的是STM32F107ZGT的板子所以我的SPI 速度能达到 42M,还需要设置其它的控制引脚。
引脚设置如下所示。
/*GPIO的宏定义*/ #define LCD_RES_Clr() HAL_GPIO_WritePin(RES_GPIO_Port,RES_Pin,GPIO_PIN_RESET)//RES #define LCD_RES_Set() HAL_GPIO_WritePin(RES_GPIO_Port,RES_Pin,GPIO_PIN_SET)#define LCD_DC_Clr() HAL_GPIO_WritePin(DC_GPIO_Port,DC_Pin,GPIO_PIN_RESET)//DC #define LCD_DC_Set() HAL_GPIO_WritePin(DC_GPIO_Port,DC_Pin,GPIO_PIN_SET)#define LCD_CS_Clr() HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_RESET)//CS #define LCD_CS_Set() HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_SET)#define LCD_BLK_Clr() HAL_GPIO_WritePin(BLK_GPIO_Port,BLK_Pin,GPIO_PIN_RESET)//BLK #define LCD_BLK_Set() HAL_GPIO_WritePin(BLK_GPIO_Port,BLK_Pin,GPIO_PIN_SET)
在购买时我们都可以在淘宝商家处获得一份资料,但是商家提供的资料不一定是用HAL库的,我们需要做的只是修改底层的SPI函数就行,上层的函数都是基于这个基础之上实现的,也就是将模拟SPI移植到HAL库。
void LCD_Writ_Bus(uint8_t dat) {LCD_CS_Clr();HAL_SPI_Transmit(&hspi1, &dat, 1,10);LCD_CS_Set); } void LCD_WR_DATA8(uint8_t dat) {LCD_DC_Set();//写数据LCD_Writ_Bus(dat); } void LCD_WR_DATA(uint16_t dat) {LCD_DC_Set();//写数据LCD_Writ_Bus(dat>>8);LCD_Writ_Bus(dat); } void LCD_WR_REG(uint8_t dat) {LCD_DC_Clr();//写命令LCD_Writ_Bus(dat);LCD_DC_Set();//写数据 }
最后在测试的时候,通过先初始化LCD,在通过下面函数进行全屏颜色显示。
/******************************************************************************函数说明:在指定区域填充颜色入口数据:xsta,ysta 起始坐标xend,yend 终止坐标color 要填充的颜色返回值: 无 ******************************************************************************/ void LCD_Fill(uint16_t xsta,uint16_t ysta,uint16_t xend,uint16_t yend,uint16_t color) {uint16_t i,j; LCD_Address_Set(xsta,ysta,xend-1,yend-1);//设置显示范围for(i=ysta;i<yend;i++){ for(j=xsta;j<xend;j++){LCD_WR_DATA(color);}} }
在主函数添加以下函数。
注意,需要按照自己LCD尺寸来设置,同样的在初始化时也需要修改。
LCD_Fill(0,0,128,160,WHITE);
2.SPI+DMA
DMA的使用也很简单。只需要在DMA Setting中设置一下即可,一定要打开中断
void LCD_Writ_Bus(uint8_t dat)
{
LCD_CS_Clr();
HAL_SPI_Transmit_DMA(&hspi1, &dat, 1);
LCD_CS_Set);
}
只需要将函数修改为dma即可。