工程思路
利用1个GPIO控制背光,在利用FSMC去控制TFTCLCD的控制引脚和数据引脚
FSMC是什么
STM32中的FSMC(Flexible Static Memory Controller,灵活静态存储器控制器)是一个硬件模块,它允许微控制器与外部存储器接口,以便进行数据交换。FSMC特别适用于与LCD控制器、NOR和NAND闪存、SRAM等静态存储器的接口。
FSMC的主要特点包括:
-
支持多种存储器类型:FSMC可以配置为与不同类型的存储器接口,包括异步SRAM、异步NOR闪存、异步PSRAM、同步NOR闪存、1T/2T同步SRAM、NAND闪存和PC卡(PCMCIA)。
-
灵活的时序控制:FSMC提供了对存储器读写操作的时序控制,可以根据不同的存储器速度和类型进行调整。
-
地址映射:FSMC允许将外部存储器的地址映射到STM32的地址空间中,使得外部存储器可以像内部存储器一样被访问。
-
数据线和地址线的复用:FSMC可以使用STM32的GPIO引脚作为数据线和地址线,以减少所需的引脚数量。
-
支持多种数据宽度:FSMC支持8位、16位和32位的数据宽度,可以根据存储器的接口和数据总线宽度进行配置。
在STM32微控制器中,FSMC通常用于LCD显示驱动,因为LCD控制器需要大量的数据带宽来刷新屏幕。通过使用FSMC,STM32可以高效地管理LCD显示内存,从而实现流畅的图像显示。
FSMC结构
除公共引脚其他三组为存储类型
为什么使用FSMC去控制TFTLCD
1.减轻MCU内核的工作负担
2.方便设置与管理
FSMC其引脚经过设置其引脚的作用与TFTLCD的作用可以一 一对应,从而不用去一个一个的去设置GPIO
stm32与TFTLCD接线关系
如何设置STM32 Cube MX
1设置外部时钟
点击RCC
将HSE 和 LSE 设置如下图设置
进入时钟树选择外部时钟将频率设置为最高(如下图)
2设置GPIO为高电平输出
根据原理图找到和背光连接的GPIO设置输出高电平
3再回到配置页面找到FSMC
在进入FSMC配置
下图中选择引脚 选项作用为片选(用于使能或禁用芯片)==TFTLCD中的cs
根据电路板选择对应的
我选的
第二项 为存储器的类型
选择
第三项控制引脚的选择
// 控制发送或接收的是数据还是指令==TFTLCD的RS引脚用于区分发送到LCD模块的数据是命令(指令)还是数据 //根据原理图选择对应的引脚
第四项 数据引脚 选择使用几引脚进行数据通行 因为TFTLCD是使用16引脚的所以选择16bits
之后的项目名字位置和编写环境此处省略
即可生成代码
代码的设置与编写
1导入TFTLCD驱动代码
1-1右键新建组
1-2在工程文件中新建文件夹放入驱动文件
1-3在右键新建的组,导入刚才的文件
选中在add就添加完成
1-4导入驱动文件目录
点击如图
在进入c/c++再点击下图中的图底 .... 位置
在点击有黄色标的位置添加驱动目录
会弹出 条框 + ... 点击... 选择文件
在OK回到编辑页面
2代码的编写
1在主文件中添加头文件 #include "lcd.h"
2在main函数中初始化LCD//可进入lcd.h文件中查看有哪些函数,也可以看原理编写自己的函数
在主函数中写入如下代码可以使屏幕点亮显示蓝色
LCD_Init();//初始化LCDHAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,1);//打开背光LCD_Clear(BLUE);//清屏显示蓝色
显示更有趣的可以参考lcd.h自行编写
主函数全代码
/* USER CODE BEGIN Header */
/********************************************************************************* @file : main.c* @brief : Main program body******************************************************************************* @attention** Copyright (c) 2024 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "gpio.h"
#include "fsmc.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "lcd.h"
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//*** @brief The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_FSMC_Init();/* USER CODE BEGIN 2 */LCD_Init();//初始化LCD//POINT_COLOR =RED;//设置画笔的默认颜色HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,1);//打开背光LCD_Clear(BLUE);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}#ifdef USE_FULL_ASSERT
/*** @brief Reports the name of the source file and the source line number* where the assert_param error has occurred.* @param file: pointer to the source file name* @param line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
项目文件可在此账号的资源中心下载,免费