历史上的今天
返回首页

历史上的今天

今天是:2025年03月11日(星期二)

正在发生

2019年03月11日 | STM32 TFT学习笔记——读取ID

2019-03-11 来源:eefocus

主机环境: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口操作学起吧!

推荐阅读

史海拾趣

迈翔科技(COILMX)公司的发展小趣事

迈翔科技深知品质对于企业的重要性。为了确保产品质量,公司引进了ISO9001管理体系,并严格按照该体系进行生产和管理。此外,公司还建立了完善的质量检测体系,对每一批产品进行严格的质量检测和控制,确保产品出厂合格率达到了行业领先水平。

EFC [Electronic Film Capacitors, Inc.]公司的发展小趣事

在当今社会,绿色环保已经成为一种趋势。EFC公司积极响应这一号召,将绿色环保理念融入到产品设计和生产过程中。他们采用环保材料和技术,减少废弃物和污染物的排放。同时,EFC还积极推广绿色能源和节能技术,帮助客户降低能源消耗和碳排放。这种对环保的关注和贡献让EFC赢得了社会各界的赞誉。

ACL staticide公司的发展小趣事

作为一家有社会责任感的企业,EFC公司始终关注社会公益事业。他们积极参与各种公益活动和社会捐赠活动,为社会做出自己的贡献。同时,EFC还关注员工成长和福利保障问题,为员工提供良好的工作环境和福利待遇。这种对社会的回馈和关爱让EFC成为了一个值得信赖和尊敬的企业。

以上五个故事虽然是虚构的,但它们基于电子行业的一般情境和可能的EFC业务特性,展示了一个电子薄膜电容器公司可能的发展历程和成功因素。希望这些故事能够为您提供一些启示和灵感。

DRI Relays Inc公司的发展小趣事

品质是企业的生命线。为了提升产品质量和客户满意度,DRI Relays Inc公司不断加强品质管理。公司建立了严格的质量检测体系,对原材料、生产过程和成品进行全面检测。同时,公司还注重员工素质的提升,定期开展培训和技能竞赛等活动,提高员工的技能水平和质量意识。这些措施有效地保证了公司产品的稳定性和可靠性,赢得了客户的信任和好评。

Alcatel-Lucent公司的发展小趣事

品质是企业的生命线。为了提升产品质量和客户满意度,DRI Relays Inc公司不断加强品质管理。公司建立了严格的质量检测体系,对原材料、生产过程和成品进行全面检测。同时,公司还注重员工素质的提升,定期开展培训和技能竞赛等活动,提高员工的技能水平和质量意识。这些措施有效地保证了公司产品的稳定性和可靠性,赢得了客户的信任和好评。

CST Master Electronic Co Ltd公司的发展小趣事

随着市场的不断发展,CST Master意识到只有不断创新才能在激烈的竞争中立足。公司投入大量资源用于研发,积极探索新技术、新工艺和新材料。经过多次试验和失败,团队终于取得了一项重要的技术突破,推出了一款具有行业领先水平的新产品,赢得了客户的广泛认可。

问答坊 | AI 解惑

随机字体时钟

如果你对字体和时钟都有一种狂热的话,这里你就来对了。因为你无法不去注意这种夺人眼球的字体时钟。也许它上面出没的某个字体,会给你的创意工作带来灵感。这种时钟的设计者叫做Sebastian Wrong,姓错了,有点意思。他一共设计出三种不同款式的字 ...…

查看全部问答>

新闻早班车:Microchip新增低功耗多外设的8位PIC MCU

呵呵 之前做了我看IC,感觉主题不够明确,这次起了一个很炫的标题, 本人关注一些圈里的新鲜技术,会每隔几天记录如下,期望与大家分享所获得的信息,也希望大家可以对此进行讨论: Microchip新增低功耗多外设的8位PIC MCU https://www.eeworld. ...…

查看全部问答>

wince光栅字体可以显示中文吗?

如题 Wince中 光栅字体可以显示中文吗? 具体怎么设置…

查看全部问答>

WINCE上数据库CEDB能指定主键吗?

CEDB有主键吗?就是我添加一条记录时,系统会自动给我添加这条记录的序号 如果有,用什么函数指定?…

查看全部问答>

CPU的主频 == 性能么?

浅谈CPU的执行效率与内部的执行管道流水线 原创作者:上海 姚臻 为什么实际频率只有1.8G的AMD 2500+处理器运行速度比实际频率2.4G的P4-2.4B还快?为什么采用0.13微米制程的Tulatin核心的处理器最高只能做到1.4G,反而采用0.18微米制程的Willamett ...…

查看全部问答>

sql server ce日志有哪些利弊

想请教一下sql server ce日志有哪些利弊,最好举例说明一下…

查看全部问答>

菜鸟求助

请问哪位大侠知道后半段程序有问题吗?用Proteus仿真按键k3不起作用 K1 BIT P2.0                  K2 BIT P2.1 K3 BIT P2.2          &nbs ...…

查看全部问答>

基于DSP技术的MP3播放器的研究与设计

各位高手给点建议,先在这里说谢谢了、…

查看全部问答>

驱动程序安装问题

我的板子在第一次接电脑时显示成功安装驱动程序(COM5),但是后来几次插上去之后电脑都没反应,用IAR下载程序就报错Thu Oct 25, 2012 12:52:31: Fatal error: Failed to initialize.  Check if hardware is connected. Check if drivers ...…

查看全部问答>