[原创] 初识Nucleo-STM32F446-驱动COG液晶屏

snoweaglemcu   2015-9-4 11:29 楼主
          放假在家,正好有这么一块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)

这样,就可以直接设定端口的高低电平了,很方便。
程序正在整理,过会上传



回复评论 (3)

引用: slotg 发表于 2015-9-4 14:05
这种液晶看起来不错,一片要多少钱?

呃,淘宝买的,要十五六块钱
点赞  2015-9-4 14:38
引用: 强仔00001 发表于 2015-9-4 23:30
不错的也屏幕,F446性能咋样??

挺NX的啊,到180M的主频
点赞  2015-9-5 11:05
引用: ketose 发表于 2015-9-5 14:50
哪弄的板子。。。。

ST的试用活动
点赞  2015-9-7 11:10
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复