你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32L4使用SPI驱动TFTLCD

[复制链接]
STMCU小助手 发布时间:2022-8-27 14:53
在上新建工程的基础上添加使用SPI功能(新建工程见STM32使用LL库建立工程)

一、CubeMX的配置
1、非SPI的LCD控制IO口的配置
查看原理图可以看到,有5个引脚接在了MCU上,其中有两个SPI引脚,三个LCD控制引脚
2020011015195320.png

其引脚对照表如下,所以我们先将PC6、PC7、PB15配置为通用IO推挽输出

20200110153020937.png

20200110153726935.png

2、SPI的的配置
MCU只需要通过SPI向LCD控制器发送命令/数据即可,所以只使用 SPI2 的 SCK 和 MOSI 引脚,将SPI2配置为主设备只发送模式,接下来开始配置SPI2接口:

首先将SPI2配置为只发送主设备模式

20200110154317851.png

可以看到,SPI2_SCK引脚默认为PB10,我们需要将其修改为PB13

20200110155915102.png

然后对SPI的参数进行配置

2020011016032433.png

然后重要的是工程设置里,将HAL改成LL

20200110160609448.png

然后便可以生成代码

20200110160627106.png

二、用户代码修改
将SPI初始化代码修改为如下,放入新建的spi.c文件

  1. //SPI2初始化代码,配置成主设备只发送模式
  2. void SPI2_Init(void)
  3. {
  4.         LL_SPI_InitTypeDef SPI_InitStruct;
  5.         LL_GPIO_InitTypeDef GPIO_InitStruct;

  6.         LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB);//使能GPIOB时钟
  7.         LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC);//使能GPIOC时钟
  8.         LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_SPI2);        //使能SPI2时钟

  9.         // **LCD控制GPIO配置 LCD_PWR->PB15        LCD_WR_RS PC6         LCD_RST->PC7        */
  10.         GPIO_InitStruct.Pin = LL_GPIO_PIN_15;
  11.         GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  12.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  13.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  14.         GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  15.         LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  16.         LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_15);

  17.         GPIO_InitStruct.Pin = LL_GPIO_PIN_6|LL_GPIO_PIN_7;
  18.         LL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  19.         LL_GPIO_ResetOutputPin(GPIOC, LL_GPIO_PIN_6|LL_GPIO_PIN_7);
  20.         
  21.         // **SPI2 GPIO Configuration        PC3-> SPI2_MOSI                PB13-> SPI2_SCK */
  22.         GPIO_InitStruct.Pin = LL_GPIO_PIN_13;
  23.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  24.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  25.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  26.         GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  27.         GPIO_InitStruct.Alternate = LL_GPIO_AF_5;
  28.         LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  29.         
  30.         GPIO_InitStruct.Pin = LL_GPIO_PIN_3;
  31.         LL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  32.         /* SPI2 parameter configuration*/
  33.         SPI_InitStruct.TransferDirection = LL_SPI_FULL_DUPLEX;        //全双工
  34.         SPI_InitStruct.Mode = LL_SPI_MODE_MASTER;                                //主设备模式
  35.         SPI_InitStruct.DataWidth = LL_SPI_DATAWIDTH_8BIT;                //8位数据宽度
  36.         SPI_InitStruct.ClockPolarity = LL_SPI_POLARITY_HIGH;        //串行同步时钟的空闲状态为高电平
  37.         SPI_InitStruct.ClockPhase = LL_SPI_PHASE_2EDGE;                        //串行同步时钟的第二个跳变沿数据被采样
  38.         SPI_InitStruct.NSS = LL_SPI_NSS_SOFT;                                        //NSS信号由软件(使用SSI位)管理:内部NSS信号由SSI位控制
  39.         SPI_InitStruct.BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV2;//定义波特率预分频的值:波特率预分频值为256
  40.         SPI_InitStruct.BitOrder = LL_SPI_MSB_FIRST;                                //数据传输从MSB位开始
  41.         SPI_InitStruct.CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE;//关闭硬件CRC校验
  42.         SPI_InitStruct.CRCPoly = 7;                                                                //CRC值计算的多项式
  43.         LL_SPI_Init(SPI2, &SPI_InitStruct);

  44.         LL_SPI_SetStandard(SPI2, LL_SPI_PROTOCOL_MOTOROLA);                //SPI帧格式 为 SPI Motorola模式
  45.         LL_SPI_DisableNSSPulseMgt(SPI2);                                                //关闭 NSS脉冲模式

  46.         LL_SPI_Enable(SPI2);                //使能SPI2
  47. }

复制代码

然后编写SPI2_WriteByte(u8 *TxData,u16 size)函数

  1. /**
  2. * @brief        SPI3 写入一个字节
  3. * @param   TxData        要写入的字节
  4. * @param   size        写入字节大小
  5. * @return  u8                0:写入成功,其他:写入失败
  6. */
  7. u8 SPI2_WriteByte(u8 *TxData,u16 size)
  8. {
  9.         u8 retry=0;        
  10.         u8 n=0;
  11.         for(n=0;n<size;n++)
  12.         {
  13.                 while (LL_SPI_IsActiveFlag_TXE(SPI2) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
  14.                 {
  15.                         retry++;
  16.                         if(retry>200)return retry;
  17.                 }                          
  18.                 LL_SPI_TransmitData8(SPI2, TxData[n]); //通过外设SPIx发送一个数据
  19.         }
  20.         
  21.         return 0;
  22. }
复制代码

三、LCD代码移植
BearPi和正点原子的Pandora开发板使用的LCD是同一款,且模式配置也一样,所以既然有现成的代码,我们不妨copy一下,将lcd.c和lcd.h复制过来
然后修改lcd.h里的LCD控制GPIO代码

  1. /*
  2.         LCD_PWR:        PB15
  3.         LCD_RST:        PC7
  4.         LCD_DC:                PC6
  5. */
  6. #define        LCD_PWR(n)                (n?LL_GPIO_SetOutputPin(GPIOB, LL_GPIO_PIN_15):LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_15))
  7. #define        LCD_RST(n)                (n?LL_GPIO_SetOutputPin(GPIOC, LL_GPIO_PIN_7 ):LL_GPIO_ResetOutputPin(GPIOC, LL_GPIO_PIN_7))
  8. #define        LCD_DC(n)                (n?LL_GPIO_SetOutputPin(GPIOC, LL_GPIO_PIN_6 ):LL_GPIO_ResetOutputPin(GPIOC, LL_GPIO_PIN_6))
复制代码

将lcd.c里的LCD_Gpio_Init()代码删去,然后在LCD_Init()开头添加如下代码:

  1.     SPI2_Init();
  2.         
  3.     LCD_PWR(0);                //关闭显示

  4.     LCD_RST(0);
  5.     delay_ms(120);
  6.     LCD_RST(1);                //复位
复制代码

在主函数里写入

  1.         LCD_Init();                                //初始化LCD
  2.         
  3.         POINT_COLOR = RED;
  4.         LCD_ShowString(0, 100, 240, 32, 32, "BearPi STM32L4");
复制代码

编译链接下载到开发板里,测试结果如下

2020011018350065.png

表明测试成功
————————————————
转载:Willliam_william


收藏 评论0 发布时间:2022-8-27 14:53

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版