放假在家,正好有这么一块Nucleo-STM32F446的开发板 ,看了两三天资料了,准备初步脱离例程 ,写一下自己的程序,但手头除了这块液晶,也没有什么太合适的东西,那么,就先从这块小小的COG液晶开始玩起吧。
呐,这就是用STM32F446驱动液晶的样子,至少,以后再用这块板的时候,我们有显示屏啦
可以看到,这是一块12864点阵,串行接口的COG液晶屏,大致的时序和SPI差不多
现在,把一些关键的函数做一下简单说明
首先是STM32F446的时钟初始化部分,位于例程的void SystemClock_Config(void)函数中
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; //选择内部RC高速时钟HSI
RCC_OscInitStruct.HSIState = RCC_HSI_ON; //启用内部RC高速时钟
RCC_OscInitStruct.HSICalibrationValue = 0x10; //我觉得应该是设置为16MHz的意思
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; //启用PLL
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; //主PLL的源为内部RC高速时钟HSI
RCC_OscInitStruct.PLL.PLLM = 16; //PLLM值设置为16
RCC_OscInitStruct.PLL.PLLN = 360; //PLLN值设置为360
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; //二分频
RCC_OscInitStruct.PLL.PLLQ = 7; //PLLQ值设置为7
RCC_OscInitStruct.PLL.PLLR = 6; //PLLR值设置为6
注意:PLLN是主PLL倍频系数
PLLM是主PLL和I2S_PLL的分频系数(在2个PLL之前)
PLLP是主PLL之后的分频系数
PLLQ是用于USB、SDIO、硬件随机数的时钟在主PLL之后的分频系数
也就是说,我们的时钟计算方法为 Fvco = HSI*(PLLN/16) = 16*(360/16) = 360MHz
Fsys = Fvco / PLLP = 360 / 2 =180MHz
Fusb = Fvco / PLLQ = 360 / 6 = 60MHz
然后是GPIO初始化部分,这里并没有使用硬件SPI,而是直接使用GPIO模拟时序。
__HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA端口时钟
GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9; //设置GPIOA5,6,7,8,9
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_InitStruct.Pull = GPIO_PULLUP; //上拉使能
GPIO_InitStruct.Speed = GPIO_SPEED_FAST; //高速端口
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); //载入设置
另外,为了方便编程,还做了对函数语句的几个宏定义
#define COG_SCK_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET)
#define COG_SCK_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET)
#define COG_SDA_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET)
#define COG_SDA_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET)
#define COG_RS_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET)
#define COG_RS_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET)
#define COG_RST_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET)
#define COG_RST_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET)
#define COG_CS_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET)
#define COG_CS_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET)
这样,就可以直接设定端口的高低电平了,很方便。
程序正在整理,过会上传