STM32的硬件SPI驱动LCD例子

发布者:陈熙琼最新更新时间:2017-10-25 来源: eefocus关键字:STM32  硬件SPI  驱动LCD 手机看文章 扫描二维码
随时随地手机看文章

前言:每学一个新知识,都会出现很多出错的情况,百度也查不出来,耗费很多时间,主要是不理解底层原理,没太多时间去理解,催得紧。SPI嘛,是人都知道干嘛用的,我一时半会也不知道怎么表达,百度最不缺的就是定义。缺的是实现过程,本少爷花了几十个积分搞了n多个实例,终于总结了要成功实现SPI要哪些奇葩的步骤。

 

历史:今天17年9月1,前几天我导师嫌我刷新屏幕太慢,给我做了代码的调整,发现速度杠杠的,屏幕蹭蹭蹭的刷屏,翻一下笔记,大概要处理几处小细节:1.LCD的CS片选做优化 2.DC也优化3.直接操作寄存器4.我下文中加了Delay(1);后来也优化了。有时间另写优化的链接给大家

正文:

---------------------------------------------配置SPI1的时钟------------------------------------

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);  //SPI1初始化

//RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);//用F0时,方法调错但不报错,搞了一天

---------------------------------------------配置GPIO------------------------------------

//用的PA4567,分别是片选,时钟,复位,MOSI,抱歉MISO当io口作复位了,不能触摸的显示屏,没卵用

//LCD显示屏涉及到DC,低电平发命令,高电平发数据

配置一下GPIO,都是50MHZ的,据说SPI的都是50,除了SCK和SDI(MOSI)是AF_PP,其他都是OUT_PP

因为硬件SPI和模拟SPI的主要区别就在于SCK和MOSI,一个方法帮你搞定了,简直嗨翻天(我个人觉得的区别)

//DC  Data/Command PB1

//CS   片选 PA4

//SCK   时钟 PA5

//REST  复位 PA6

//SDI  数据 PA7

是人都会配了,不会配的也不会学SPI了

---------------------------------------------配置SPI1------------------------------------

//重头戏

void SPI_cfg(void){

SPI_InitTypeDef SPI_InitStructure;

//设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工

SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;  //少爷我只要输出

//设置SPI工作模式:设置为主SPI

SPI_InitStructure.SPI_Mode = SPI_Mode_Master;              

//设置SPI的数据大小:SPI发送接收8位帧结构

SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8位够了,16位不会用         

 //串行同步时钟的空闲状态为di电平

SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //时序图说是低电平              

//串行同步时钟的第1个跳变沿(上升或下降)数据被采样

SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;   //时序图显示高电平采样            

 //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制

SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;       //不知有啥用        

//定义波特率预分频的值:波特率预分频值为8

SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;   //2到256,越低越快         

 //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始

SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //不知有啥用  

 //CRC值计算的多项式

SPI_InitStructure.SPI_CRCPolynomial = 7;                 //不知有啥用   

//根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

SPI_Init(SPI1, &SPI_InitStructure);  

 //使能SPI外设

SPI_Cmd(SPI1, ENABLE);

}

---------------------------------------------LCD里的发送命令的方法------------------------------------

//LCD里头还有很多清屏,显示图片汉字的方法,跟SPI没关系,不贴了

功能:液晶写入1字节数据

参数:u8 data

void LCD_WR_DATA8(uint8_t data)

{

LCD_CS_L; //片选低,使能有效

LCD_DC_H; //DC拉高传数据

SPI_I2S_SendData(SPI1, data);  //这句话直接省去了我用for循环一个个移位发数据,爽到爆

while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); //感觉有木有都一样,有放在前面的有放在后面的,只知道少了它的话,本来刷屏是蓝色,会变成别的颜色

   

Delay(1); //被这个延时害惨了,1天找不到错误,就因为没他,1到100都行,但是一少就出错。

Delay(1); //被这个延时害惨了,1天找不到错误,就因为没他,1到100都行,但是一少就出错。

Delay(1); //被这个延时害惨了,1天找不到错误,就因为没他,1到100都行,但是一少就出错。

(说三遍)

LCD_CS_H; //片选高,使能失效

}

结束语:出错都因为delay,不明觉厉

自己完成SPI之后,学到了很多说不出的知识。

好多句子不知道有什么用,都是一次次试的。


关键字:STM32  硬件SPI  驱动LCD 引用地址:STM32的硬件SPI驱动LCD例子

上一篇:STM32F0的USART通讯的例子
下一篇:STM32的GPIO中断例子

推荐阅读最新更新时间:2024-03-16 15:41

STM32 基础系列教程 10 - 单线串口(半双工)
前言 在工程应用中,很多时间为了方便走线会采用单线串口方案,本节将学习stm32 usart单线串口的使用,学会用使用单线串口收发数据。 示例详解 基于硬件平台: STM32F10C8T6最小系统板, MCU 的型号是 STM32F103c8t6, 使用stm32cubemx 工具自动产生的配置工程,使用KEIL5编译代码。 本示例所用的最小系统板原理图: 从本节开始,关于CUBEMX工具及KEIL工具的操作将不再细讲,如果还有不熟悉的可以查看之前的教程文档。下面直接介绍工程配置: 系统时钟树 USART1配置 引脚配置(保持默认即可) 引脚保持默认即可,当然实际应用中可以根据自己的需求对其
[单片机]
<font color='red'>STM32</font> 基础系列教程 10 - 单线串口(半双工)
STM32 keil mdk启动代码发分析
学习STM32,看了一堆乱七八糟的文档,准备写程序了,先分析了下STM32的启动代码,看着这堆鬼鬼的汇编代码,挺吓人的,看看帮助,查查网路,还是不那么难懂。 ;// h Stack Configuration ;// o Stack Size (in Bytes) 0x0-0xFFFFFFFF:8 ;// /h Stack_Size EQU 0x00000200 ;//定义堆栈大小 AREA STACK, NOINIT, READWRITE, ALIGN=3 ;//定义一个数据段 按8字节对齐 Stack_Mem SPACE Stac
[单片机]
spi flash偶尔出现写入错误的情况
spi flash W25Q128会偶尔出现写入错误的情况,会发现读出的值和写入的值不一致,需加入2次读出比较判断。 W25QXX_Read(&temp_date_count,0x000000,1); //W25QXX_Write((u8*)&temp_date,0x400000,135); //W25QXX_Read((u8*)&temp_data_test,0x400000,135); W25QXX_Write((u8*)&temp_date,(temp_date_count*135+1),135); W25QXX_Read((u8*)&temp_data_test,(temp_date_count*1
[单片机]
STM32开发 -- ADC详解
一、ADC简介 Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转化为离散的数字信号的器件。 典型的模拟数字转换器将模拟信号转换为标识一定比例电压值的数字信号。 ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。 二、STM32F10x ADC特点 12位逐次逼近型的模拟数字转换器。 最多带3个ADC控制器 最多支持18个通道,可最多测量16个外部和2个内部信号源。 支持单次和连续转换模式 转换结束,注入转换结束,和发生模拟看门狗事件时产生中断。 通道0到通道n的自动扫描模式 自动校准 采样间隔可以按通道编程 规则通道和注入通道均有外部触发
[单片机]
STM32 中 SysTick时钟的配置
SysTick_Config(SystemFrequency / 10) 函数的形参就是systick重装定时器的值。 systck计数频率为每秒72000000次,所以7200000次就是1/10秒,也就是100ms。 SysTick是1个24bit递减计数器,通过对SysTick控制与状态寄存器的设置,可选择HCLK时钟(72M)或HCLK的8分频(9M,缺省是这个)作为SysTick的时钟源。 SysTick的重装寄存器决定了定时器频率。 若SysTick的时钟源是72M, SystemFrequency = 72000000Hz 所以 SysTick_Config(SystemFrequency / 10
[单片机]
STM32学习总结之时钟
学习内容: 这个图说明了STM32的时钟走向,从图的左边开始,从时钟源一步步分配到外设时钟。从时钟频率来说,又分为高速时钟和低速时钟,高速时钟是提供给芯片主体的主时钟,而低速时钟只是提供给芯片中的RTC(实时时钟)及独立看门狗使用。 从芯片角度来说,时钟源分为内部时钟与外部时钟源 ,内部时钟是在芯片内部RC振荡器产生的,起振较快,所以时钟在芯片刚上电的时候,默认使用内部高速时钟。而外部时钟信号是由外部的晶振输入的,在精度和稳定性上都有很大优势,所以上电之后我们再通过软件配置,转而采用外部时钟信号。 所以,STM32有以下4个时钟源: 高速外部时钟(HSE):以外部晶振作时钟源,晶振频率可取范围为4~16MHz,我们一般采用8M
[单片机]
<font color='red'>STM32</font>学习总结之时钟
stm32---DS18b20
一个一线接口的温度传感器 DS18B20 发送所有的命令和数据都是字节的低位在前 每个器件都有自己的地址序列号 可以设置测量精度有四种,9---12位(0.5℃,0.25℃,0.125℃和 0.0625℃。),出场默认12位最高精度 高5位是0-- 温度大于0, 高5位是1-- 温度小于0 12位精度时,测量温度大于0,温度 = 测量数值 x 0.0625; 测量温度小于0, 温度 = (测量数值取反+1) x 0.0625 初始化时序 复位 : 引脚配置为输出模式。主机输出低电平 时间 480us ~ 960us,以产生复位脉冲后输出高电平线延时 15~60 us。 检查 :引脚配置为接收模式。接着 DS18B20 拉低
[单片机]
STM32模拟IIC读写AT24CXX
以前只用51做过AT24C02,后来才接触到容量更大的型号,发现了很多和以前的不一致的东西,现总结如下。 在上一篇博客中已经写好了STM32用IO口模拟IIC的基本驱动代码,下面结合数据手册用上一篇博客提到的函数编写AT24CXX全系列通用的驱动代码。 我们先来看AT24CXX的中文手册。 这是写操作的步骤。 而上面提到的从器件的地址信息由下图所示。 不同的容量的AT24CXX的从器件地址位是不同的。这在后面的基本的读写函数的关于器件的不同就有所体现。 下面先初始化AT24CXX: void AT24CXX_Init() { IIC_Init(); } 这里只需要初始化IIC总线即可。 下面写出AT24CXX基本
[单片机]
<font color='red'>STM32</font>模拟IIC读写AT24CXX
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved