FSMC(STM32)
(一个)FSMC:Flexible Static Memory Controller,变量(灵活)静态存储控制器
小容量产品是指闪存存储器容量在1 6K至32K字节之间的STM32F101xx、STM32F102xx和
STM32F103xx微控制器。
中容量产品是指闪存存储器容量在64K至128K字节之间的STM32F101xx、STM32F102xx和
STM32F103xx微控制器。
大容量产品是指闪存存储器容量在256K至512K字节之间的STM32F101xx和STM32F103xx微控
制器。
互联型产品是指STM32F105xx和STM32F107xx微控制器。
对于M3来说
然后将这1.0GB的外存分为4个大块
1。为什么每一块中每一片是64M?
答:我们知道地址线26跟,2的26次方等于64M,所以每一个块是64M,
2。为什么每一块中是4片?
答:它这里有一个非常巧妙的方法每个块有4个片选。以方便我们使用那一片;
故:1.0GB = (4*64)*4
下面例程我们的液晶是接在Bank1中的第4片;
先看下接口图(野火板子)
1,为什么是片4?
答:
我们的LCD_CS接在了FSMC_NE4的片选4端(说白了是:液晶的内存与FSMC要相互相应)
2,为什么是块1?
答:由于液晶里面的RAM相当于NOR FLASH,或者PSRAM,所以最好用块1
3,为什么低电平电量点亮屏幕呢?
答:看下图
对于38,39管脚的控制使用一个PNP三极管,当LIGHT低电平时 导通。
为什么接PB1?
答:PB1通过有PWM调制功能
4,对于读写控制可參考图中注解,但主要对于不同的液晶控制芯片读写控制可能有所差异。
如图9341
RS 我们接的是FSMC_A23,那么我们控制FSMC的地址线23就能够控制发送命令还是数据了
程序解说:
1,载入ili9341驱动文件
2,打开
/* #include "stm32f10x_flash.h" */
#include "stm32f10x_fsmc.h"
3,port配置
4。工作模式配置(參考ili9341手冊)
void LCD_FSMC_Config(void)
{FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;FSMC_NORSRAMTimingInitTypeDef p; p.FSMC_AddressSetupTime = 0x02; //地址建立时间p.FSMC_AddressHoldTime = 0x00; //地址保持时间p.FSMC_DataSetupTime = 0x05; //数据建立时间p.FSMC_BusTurnAroundDuration = 0x00;p.FSMC_CLKDivision = 0x00;p.FSMC_DataLatency = 0x00;p.FSMC_AccessMode = FSMC_AccessMode_B; // 一般使用模式B来控制LCDFSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;//FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p; FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);
}
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;//此处我们用到了bank1的第四片
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;//此处我们用到了bank1的第四片
5。液晶软件复位(低电平复位,切记高电平要保持一下)
void LCD_Rst(void)
{ GPIO_ResetBits(GPIOG, GPIO_Pin_11); //低电平复位Lcd_Delay(0xAFFf<<2); GPIO_SetBits(GPIOG, GPIO_Pin_11); Lcd_Delay(0xAFFf<<2);
}
6。写命令、数据
void LCD_REG_Config(void)
这里介绍一下写命令与写数据函数
LCD_ILI9341_CMD(0xCF); //写命令LCD_ILI9341_Parameter(0x00); //写数据
例如以下:
#define Bank1_LCD_C ((u32)0x6C000000) //Disp Reg ADDR
#define Bank1_LCD_D ((u32)0x6D000000) //Disp Data ADDR // A23 PE2//选定LCD指定寄存器
#define LCD_WR_REG(index) ((*(__IO u16 *) (Bank1_LCD_C)) = ((u16)index))
//往LCD GRAM写入数据
#define LCD_WR_Data(val) ((*(__IO u16 *) (Bank1_LCD_D)) = ((u16)(val)))#define LCD_ILI9341_CMD(index) LCD_WR_REG(index)
#define LCD_ILI9341_Parameter(val) LCD_WR_Data(val)
解释例如以下:
当主控对指针量(地址)0x6D000000操作,FSMC_A23为高电平,此时为写数据;
操作顺序: CPU作用于FSMC外设。FSMC内存块作用于TFT的GRAM。
可理解CPU向0x6C000000。0x6D000000该地址写入数据,即使操作FSMC的块1的片选4,后导致FSMC外设地址线和数据线管脚的变化。
为什么2^23 还要*2 ?
答:
在外部设备是16位时。连接到内部地址总线 HADDR时 左移一位。0-1,,。,24-25;所以为了满足相应关系。我们要将指针量*2,才干找出正确的地址后与之相应;
若连接其它的地址线,那么计算方式一样。
7。扫描方式
DEBUG_DELAY();LCD_ILI9341_CMD(0x36); LCD_ILI9341_Parameter(0xC8); //竖屏 左上角(起点)到右下角(终点)扫描方式DEBUG_DELAY();
向“36” 寄存器 写相应指令就成
/* column address control set */ X轴LCD_ILI9341_CMD(0X2A); LCD_ILI9341_Parameter(0x00); //低八位 0LCD_ILI9341_Parameter(0x00); //高八位LCD_ILI9341_Parameter(0x00); LCD_ILI9341_Parameter(0xEF); 0XEF = 239/* page address control set */ Y轴DEBUG_DELAY();LCD_ILI9341_CMD(0X2B); LCD_ILI9341_Parameter(0x00); 0LCD_ILI9341_Parameter(0x00);LCD_ILI9341_Parameter(0x01);LCD_ILI9341_Parameter(0x3F); 0X13F = 319
---------------------------------------------------------------------------
函数部分:
①清屏函数(源)
void LCD_Clear(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color)
如清掉整个屏幕
LCD_Clear(0, 0, 240, 320, BACKGROUND);
②设置坐标点(源)
void LCD_SetCursor(uint16_t x, uint16_t y)
③ 开窗(源)
界限设置。不然就不会反过来写(第一行写完。然后从第二行写),调整地址指针
void LCD_OpenWindow(uint16_t x, uint16_t y, uint16_t width, uint16_t height)
④画点(源)
一切一切的本源
void LCD_SetPoint(uint16_t x , uint16_t y , uint16_t color)
{ LCD_SetCursor(x, y);LCD_ILI9341_CMD(0x2c); LCD_WR_Data(color);
}
⑤颜色(源)
uint16_t LCD_RD_data(void)
{ uint16_t R=0, G=0, B=0 ;R = *(__IO uint16_t *)Bank1_LCD_D; /*FIRST READ OUT DUMMY DATA*/R = *(__IO uint16_t *)Bank1_LCD_D; /*READ OUT RED DATA */B = *(__IO uint16_t *)Bank1_LCD_D; /*READ OUT BLACK DATA*/G = *(__IO uint16_t *)Bank1_LCD_D; /*READ OUT GREEN DATA*///将地址转换成指针,对指针进行操作return (((R>>11)<<11) | ((G>>10)<<5) | (B>>11)); //转换成16位宽度
}
⑥显示一个字符(源)
void LCD_DispChar(uint16_t x, uint16_t y, uint8_t ascii, uint16_t color)
如:LCD_DispChar(60, 60, 'A', RED); //相应有效的地方写该颜色,这个函数也是独立的。
当然在用之前要有自己相应的的字库
⑦显示一个字符串
void LCD_DispStr(uint16_t x, uint16_t y, uint8_t *pstr, uint16_t color)
如:
LCD_DispStr(10, 10, (uint8_t *)"This is a lcd demo to display ascii", RED);
⑧显示数字
这个说白还是用到LCD_DispChar
void LCD_DisNum(uint16_t x, uint16_t y, uint32_t num, uint16_t color)
瘋子笔录
版权声明:本文博客原创文章。博客,未经同意,不得转载。
转载于:https://www.cnblogs.com/gcczhongduan/p/4741900.html
FSMC(STM32)相关推荐
- openmv识别物体并与单片机通信(STM32)
openmv识别物体并与单片机通信(STM32) OPENMV端 物体识别 感光元件 寻找色块 画图 距离判断 距离 实际距离 串口发送 STM32段 串口接收 串口2配置 数据处理 数据显示 Ope ...
- 超声波传感器介绍及其使用(STM32)
超声波传感器介绍及其使用(STM32) 超声波传感器型号 实物图 引脚 超声波传感器原理图 特点 工作原理 超声波传感器时序图 测量误差的产生 注意 超声波传感器部分代码 实验现象 源码获取 超声波传 ...
- 单片机课程设计-温度检测(STM32)
单片机课程设计-温度检测(STM32) 原理 KEY配置 ADC配置 中断配置 UI及主函数 原理 STM32ADC采样,我选用PA5作为ADC接口,并做了UI设计. KEY配置 key.c #inc ...
- NRF24L01模块多发一收通信(STM32)
NRF24L01模块多发一收通信(STM32) 目录 NRF24L01模块多发一收通信(STM32) 前言 一.解决思路 二.实验过程 1.设备ID号定义 2.数据打包发送 3.数据接收拆解 总结 前 ...
- 基于HMI串口屏的协议(STM32)
基于HMI串口屏的协议(STM32) 提示: 硬件:STM32H750VBT6.USART_HMI(3.5寸基本型)(TJC4832T035_011X) 官方资料网站:HMI 文章目录 基于HMI串口 ...
- RTC实时时钟(STM32)
Cortex-M4-实时时钟 实时时钟概述 实时时钟介绍 英文缩写:RTC.显示年.月.日.时.分.秒.星期,自动计算闰年,能够区分每个月的天数. RTC特点:能从RTC获取到具体的日期时间,断掉后再 ...
- 循迹传感器(TCRT5000)的介绍以及使用(STM32)
循迹传感器(TCRT5000)的介绍以及使用STM32 循迹传感器型号 实物图 用途 循迹传感器原理图 引脚 特点 工作原理 注意 循迹传感器部分代码 实验现象 源码获取 循迹传感器型号 TCRT50 ...
- 4、外部中断(STM32)
文章目录 写在前面 一些概念 中断 中断优先级 中断嵌套 STM32中断 EXTI外部中断 AFIO 中断点灯 KEY0(PC5)进行按键电灯和灭灯 1) 建文件夹 2)外部中断EXTI的初始化 配置 ...
- MQ-2烟雾传感器模块功能实现(STM32)
认识MQ-2模块与其工作原理 MQ-2型烟雾传感器属于二氧化锡半导体气敏材料,属于表面离子式N型半导体.当处于200~300摄氏度时,二氧化锡吸附空气中的氧,形成氧的负离子吸附,使半导体中的电子密度减 ...
最新文章
- SSM框架 mybatis-plus + spring + springmvc + redis 水果生鲜产品交易平台
- 网络公司千千万,放心委托看这里!
- 二叉树的前序,中序,后序,层序遍历的递归和非递归实现
- linux系统调用函数(C语言):open,close函数和文件描述符
- (五)C语言之二维数组
- 国内外独立IP行情及网站用独立IP优势面面观
- Codeforces Round #182 (Div. 1)题解【ABCD】
- HDOJ 5184 Brackets 卡特兰数扩展
- eclipse新建java项目_用eclipse创建Java项目(以一个初学者的角度全面教学)
- java倒序输出英文句子_Java实现英文句子中的单词顺序逆序输出的方法
- PPT可以直接剪裁视频
- 证券业上云内参:国泰君安
- 亲历骗子通过闲鱼、江苏猎宝网络科技股份有限公司进行诈骗!
- PLS-00905: 对象 SCOTT.QUERYEMPINFO 无效;PL/SQL: Statement ignored
- 怎么将sql文件加载到数据库
- 用Java写一个集合竞价抓涨停的策略
- 利用pyechart绘制简单的迁徙流向图、世界地图
- 了解什么是形式化方法?
- mc是电子计算机的什么键,计算机上的mc是什么键
- matlab中m文件的好处,请教matlab中M文件问题?
热门文章
- 无人驾驶岗平均月薪4.14万:因为稀缺,所以高薪
- CSDN博客如何转载(技术贴)
- oracle+事务开始+结束,Oracle事务和对象上集(视图、索引)
- xrdp安装包linux,linux xrdp0.6 安装
- yolov4网络结构_重磅更新!YoLov4最新论文!解读YoLov4框架!
- python什么时候诞生的_关于RFC 3339日期时间:在Python中产生timestamp
- python版本升级后编译_python学习笔记(7)--python版本升级
- idea 代码自动补全快捷键
- 获取mysql可行方法_Mysql学习Java实现获得MySQL数据库中所有表的记录总数可行方法...
- mysql数据库唯一性_mysql表的字段怎么设置唯一性