STM32 TFT学习笔记——读取ID

发布者:yunhao最新更新时间:2019-03-11 来源: eefocus关键字:STM32  TFT  读取ID 手机看文章 扫描二维码
随时随地手机看文章

主机环境:Windows 7 SP1


开发环境:MDK5.14


目标板:ST NUCLEO-F303RE


TFT型号:2.4英寸,带触摸,SD卡,240*320分辨率,26万色


驱动IC:ILI9325


ST库版本:STM32Cube_FW_F3_V1.1.0


之前ST社区搞活动抢了一块NUCLEO-F303RE的开发板,本来是想研究一哈USB开发的,后来拿到手之后发现硬件不得行,得自己接个USB接口,板子自带的USB是下载和当作串口用的,属于ST-LINK板。没搞头了,板子就研究了一哈串口,点亮了一下LED。。。后来在淘宝上看到一块TFT屏挺便宜的,就拍了回来配合NUCLEO板调调TFT吧,毕竟之前也一直没弄过TFT,只搞过12864液晶屏,哔格不够。


TFT的接口如下



NUCLEO-F303RE接口图如下



该版TFT模块支持5V供电和3.3V供电,我使用的是3.3V供电,毕竟STM32一般都是3.3V的工作电压,通过TFT的接口我们可以发现其使用16bit数据口DB0~DB15,触屏和SD卡暂时不需要,此外还需要电源线和地线,以及5个控制线RS、WR、RD、CS、RST,BL是没接的,因为TFT模块的背光由VCC控制了,因此省略了该BL口,对于NUCLEO板来说,使用PB口来作为数据口PC0作为CS口、PC1作为RST口、PA4作为RS口、PA1作为WR口、PA0作为RD口



再连接好电源线和地线,上电之后就可以发现TFT屏被点亮了,说明供电还是正常的,接下来就是敲代码了,来读取ILI9325的ID。


ILI9325的操作时序可以在其手册中看到如下:



照着这个敲代码就可以了,



/**********************************************************************

函数:ILI9325_Write_Reg()

函数作用:向ILI9325寄存器写入16bit数据

参数:

uint16_t reg_addr-----------------------------------寄存器地址

uint16_t reg_value--------------------------------------16bit数据

返回值:无

上一版本:无

当前版本:1.0

作者:anobodykey

最后修改时间:2015-07-27

说明: ILI9325地址和数据都是使用PB口通信,因此PB口是

             复用的,需先写寄存器地址再写入数据

**********************************************************************/

void ILI9325_Write_Reg(uint16_t reg_addr, uint16_t reg_value)

{

ILI9325_nCS_Set_Low();//拉低片选,使其有效

ILI9325_RS_Set_Low();//拉低RS信号,选择index寄存器

ILI9325_nWR_Set_Low();//拉低写使能,使其有效

GPIOB->ODR = reg_addr;//写寄存器地址

ILI9325_nWR_Set_High();

ILI9325_RS_Set_High();//拉高RS信号,选择control寄存器

ILI9325_nWR_Set_Low();

GPIOB->ODR = reg_value;

ILI9325_nWR_Set_High();

ILI9325_nCS_Set_High();

}

 

/**********************************************************************

函数:ILI9325_Read_Reg()

函数作用:从ILI9325寄存器读取16bit数据

参数:

uint16_t reg_addr-----------------------------------寄存器地址

返回值:16bit数据

上一版本:无

当前版本:1.0

作者:anobodykey

最后修改时间:2015-07-27

说明: PB口工作在推挽输出模式,读取寄存器数据时需

        设置成上拉输入模式才可读取

**********************************************************************/

uint16_t ILI9325_Read_Reg(uint16_t reg_addr)

{

GPIO_InitTypeDef  GPIO_InitStruct;

uint16_t reg_value = 0;

ILI9325_nCS_Set_Low();//拉低片选,使其有效

ILI9325_RS_Set_Low();//拉低RS信号,选择index寄存器

ILI9325_nWR_Set_Low();//拉低写使能,使其有效

GPIOB->ODR = reg_addr;//写寄存器地址

ILI9325_nWR_Set_High();

ILI9325_RS_Set_High();//拉高RS信号,选择control寄存器

 

//将PB口设置为输入口读取寄存器数据

GPIO_InitStruct.Pin = ILI9325_DATA_PIN;

GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

HAL_GPIO_Init(ILI9325_DATA_GPIO_PORT, &GPIO_InitStruct);


ILI9325_nRD_Set_Low();

reg_value = (GPIOB->IDR&GPIO_PIN_All);

ILI9325_nRD_Set_High();

ILI9325_nCS_Set_High();

 

//将PB口恢复成推挽输出模式

GPIO_InitStruct.Pin = ILI9325_DATA_PIN;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

HAL_GPIO_Init(ILI9325_DATA_GPIO_PORT, &GPIO_InitStruct);


return reg_value;

}


这里需要注意的是在读取PB口数据时需要将其设置为输入口,ILI9325的初始化操作如下


/**********************************************************************

函数:HAL_ILI9325_MspInit()

函数作用:初始化与ILI9325 连接的io口资源

参数:无

返回值:无

上一版本:无

当前版本:1.0

作者:anobodykey

最后修改时间:2015-07-27

说明: MCU与ILI9325连接的io口均作为推挽输出口

**********************************************************************/

void HAL_ILI9325_MspInit(void)

{

GPIO_InitTypeDef  GPIO_InitStruct;

 

//打开控制端口及数据时钟

ILI9325_nCS_GPIO_CLK_ENABLE();

ILI9325_nRST_GPIO_CLK_ENABLE();

ILI9325_RS_GPIO_CLK_ENABLE();

ILI9325_nWR_GPIO_CLK_ENABLE();

ILI9325_nRD_GPIO_CLK_ENABLE();

ILI9325_DATA_GPIO_CLK_ENABLE();

 

//设置端口引脚

GPIO_InitStruct.Pin       = ILI9325_nCS_PIN;

GPIO_InitStruct.Mode      = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull      = GPIO_PULLUP;

GPIO_InitStruct.Speed     = GPIO_SPEED_HIGH;

HAL_GPIO_Init(ILI9325_nCS_GPIO_PORT, &GPIO_InitStruct);

 

GPIO_InitStruct.Pin = ILI9325_nRST_PIN;

HAL_GPIO_Init(ILI9325_nRST_GPIO_PORT, &GPIO_InitStruct);

 

GPIO_InitStruct.Pin = ILI9325_RS_PIN;

HAL_GPIO_Init(ILI9325_RS_GPIO_PORT, &GPIO_InitStruct);

 

GPIO_InitStruct.Pin = ILI9325_nWR_PIN;

HAL_GPIO_Init(ILI9325_nWR_GPIO_PORT, &GPIO_InitStruct);


GPIO_InitStruct.Pin = ILI9325_nRD_PIN;

HAL_GPIO_Init(ILI9325_nRD_GPIO_PORT, &GPIO_InitStruct);

 

GPIO_InitStruct.Pin = ILI9325_DATA_PIN;

HAL_GPIO_Init(ILI9325_DATA_GPIO_PORT, &GPIO_InitStruct);

}

 

/**********************************************************************

函数:ILI9325_Init()

函数作用:ILI9325初始化

参数:无

返回值:无

上一版本:无

当前版本:1.0

作者:anobodykey

最后修改时间:2015-07-27

说明: 

**********************************************************************/

void ILI9325_Init(void)

{

HAL_ILI9325_MspInit();

 

ILI9325_nRST_Set_High();

HAL_Delay(50);

ILI9325_nRST_Set_Low();//复位ILI9325低电平有效

HAL_Delay(100);

ILI9325_nRST_Set_High();

 

//总线处于空闲状态

ILI9325_nCS_Set_High();

ILI9325_RS_Set_High();

ILI9325_nRD_Set_High();

ILI9325_nWR_Set_High();

HAL_Delay(50);

}


接着我们就可以读取其ID了,主函数如下


int main(void)

{

uint8_t fmt = 0;

uint16_t version = 0;

HAL_Init();

 

SystemClock_Config();

 

uart_init(115200);

BSP_LED_Init(LED2);

 

ILI9325_Init();

 

isr_init();

 

version = ILI9325_Read_Reg(0x00);

printf("ili9325 version:%X\r\n",version);


printf("PLEASE ENTER YOUR CHOICE:");

while(1)

{

if (0 == uart_read(&fmt,0x2400))

{

switch(fmt)

{

case 1:

BSP_LED_On(LED2);

printf("THE LED2 IS LIGHTED UP!\r\n");

break;

case 0:

BSP_LED_Off(LED2);

printf("THE LED2 IS CLOSED!\r\n");

break;

default:

break;

}

printf("PLEASE ENTER YOUR CHOICE:\r\n");

}

}

return 0;

}


读取ID之后并从串口显示,在串口输出的结果如下:


可以看到读到的ID是正确的,证明我们的代码是没错的,硬件连线也是正确的,接下来就是使用TFT来实现图形显示了,一步一个脚印,慢慢来吧。网上有很多使用FSMC来驱动TFT的,由于我还没使用过FSMC一,因此就从最简单易懂的IO口操作学起吧!

关键字:STM32  TFT  读取ID 引用地址:STM32 TFT学习笔记——读取ID

上一篇:STM32 TFT学习笔记——刷屏
下一篇:STM32F429HAL库ADCDMA学习笔记

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

基于STM32的交流永磁同步电机驱动器设计
引言 近年来,随着微电子技术、电力电子技术、现代控制技术、材料技术的迅速发展以及电机制造工艺水平的逐步提高,交流永磁同步电机以其体积小、结构简单等特点在工农业、日常生活以及许多高科技中迅速得到了广泛的应用。因此,研究设计高精度、高性能的永磁同步电机成为现代电伺服驱动系统的一个发展趋势。 伺服驱动器按照功能特征可分为功率板和控制板两个独立的模块,本文在分析交流永磁同步电机控制性能的基础上分别对控制单元和功率驱动单元进行了具体的设计。控制单元作为伺服系统的核心,要求有较高的性能,为此,论文采用意法半导体推出的STM32作为控制核心芯片。它是基于ARM先进架构的Cortex-M3为内核的32位微处理器,主频可高达72 MHz。强大
[单片机]
基于<font color='red'>STM32</font>的交流永磁同步电机驱动器设计
STM32工具安装和工程模板的建立
简介:在安装软件和新建工程这个过程中可能会出现各种问题,最好的办法就是百度,说实话,刚开始没有接触STM32,从软件下载到安装再到工程模板的建立我也弄了一天!要有耐心慢慢来!就会发现其实就那么回事! 一、工具安装 1.J-Link驱动的安装下载地址 2. KEIL MDK的安装这个版本更新很快,我用的是4.7版本的,现在5.0版本的都出来,所以可以自己百度去下载,很多地方都能下载到 3.成功安装好J-Link,同时插上J-link下载线后能在我的电脑设备管理器中看到J-Link Driver 4.由于安装大同小异,这里不再赘述。 二、工程模板的建立 准备工作 1.下载ST官方库,我这里是用的3.5版
[单片机]
<font color='red'>STM32</font>工具安装和工程模板的建立
STM32串口DMA传输不能使用的问题
1. 开发环境 开发平台:官方开发板STM32F030R8-Nucleo 开发软件:Keil uVision5.24 开发库:STM32Cube_FW_F0_V1.9.0 2. 实验现象 根据官方例程,将UART1的DMA传输配置更改为UART2,但是使用UART2时,DMA的中断都进入不了,一开始以为是时钟未开启导致的,后来仔细对比后并无异常。于是查看了STM32F030的参考手册,DMA这一章,发现DMA的通道固定映射到相应的外设上,而不能随意配置。 我这里使用的是UART2,从上面的 mapping 图中可以看出UART2_TX只能使用 Channel4,UART2_RX只能使用 Channel5。所以我们在使
[单片机]
<font color='red'>STM32</font>串口DMA传输不能使用的问题
STM32实现低功耗待机总结(电流低至5.7uA)
刚开始进入STOPMode后,整机功耗有 300uA的,此时外围其他硬件电路电流已经可以肯定漏电流在nA级,因此调试方向在主芯片,经过实际测试,都是GPIO配置的问题,比如某个GPIO为中断输入,闲置为低电平,而我们配置成了IPU,因此内部的40K上拉就会在这里消耗3/40k =75uA,另外将N.C的GPIO配置成Floating Input,也会有一些漏电流,实际测试漏电流不大;另外将STM32F05x直接PIINtoPIN替代STM32100,所以Pin35,36的 PF6,PF7为之前的VCC,GND,因此要相应的配置为IPU,IPD,才不会有拉电流/灌电流;外部不使用晶振,因此必须将其配置为IPU/IPD 或者输出Low,
[单片机]
实现STM32的串口数据发送和printf函数重定向
简介:在调试电机驱动程序的时候,是不能随便利用中断来进行一些寄存器或数据的查看的,不然你在运行的时候突然来一下,如果占空比大的话那可能直接就把MOS管给烧了,所以我们很多情况下只能使用USART(串口)来进行程序的调试和数据的监控了。 对于STM32来说,由于很多内容都是有库来实现的,那就省了很多时间,直接看个例子就可以写了,大致有4步步骤: 1 1、RCC始终初始化,对端口和USARTX使能时钟 2 2、初始化端口功能,RX设置为输入悬空,TX设置为复用功能的推挽输出,注意GPIO_SPEED要设置下,我没设置弄了半天都没输出 3 3、设置USARTX寄存器,波特率、数据位、校验位、停止位等 4 4、看需要是否开中断,我
[单片机]
STM32在KEIL平台反汇编代码分析
  不同的平台的汇编代码是不一样的,最早的汇编在50年代就发明了,比很多人的父母的年龄都大,老掉牙,不用学习怎么写汇编。一个公司有一个人知道怎么写汇编就够了。但要学习读汇编 为什么学习汇编?   1 性能 直接翻译为机器语言,性能最高。优秀的C语言效率只能达到汇编的80%左右。其他高级语言跟汇编一比差得更远。语言越高级性能越差。很多bootloader和BIOS用汇编写,汇编操作的是电脑,手机刚刚上电时,硬件和初始化的那些命令,它们的性能的要求比较高,效率高开机速度更快。   2 分析问题。个人认为,编程人与机器对话,我们写C,写JAVA,但是电脑并不认识这些语言,电脑只认识0和1;所以需要一个人来翻译这些语言,这个翻译官就是编
[单片机]
stm32中断配置(NVIC)
内嵌向量中断控制器:Nested Vectored Interrupt Controller (NVIC) NVIC优先级结构体定义: typedef struct { uint8_t NVIC_IRQChannel; /*! Specifies the IRQ channel to be enabled or disabled */ uint8_t NVIC_IRQChannelPreemptionPriority; /*! 主中断优先级范围:0-16 */ uint8_t NVIC_IRQChannelSubPriority; /*! 从优先级 范围:0-16 *
[单片机]
ARM S3C2410驱动TFT-LCD的研究
  介绍了S3C2410的LCD控制器的数据和控制管脚,并给出了LCD的控制流程和TFT-LCD的控制器设置规则。参照TFT-LCD CJM10C0101的逻辑要求和时序要求设计了其驱动电路,设置了各主要LCD寄存器。   开发了CJM10C0101在嵌入式LINUX下的显示驱动程序,并在CJM10C0101上显示了清晰稳定的画面。实验表明这套装置通用性好,能驱动大部分的TFT-LCD;可移植性强,经过少许修改即可应用在其他嵌入式系统中。它是S3C2410驱动TFT-LCD的一套较佳的解决方案。   1 引言   随着科技的发展,ARM在社会各个方面的应用越来越广。S3C2410是三星公司生产的基于ARM920T内核的RIS
[单片机]
ARM S3C2410驱动<font color='red'>TFT</font>-LCD的研究
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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