LCD地址设置
图中只画出了数据线与地址线 其他的线我没有花,请各位脑部一下,实在不行去看原子提供的LCD的原理图。
LCD有一个引脚是D/C引脚,用来区分往LCD中写入的数据是命令还是数据Data/Command
比如说我要给LCD控制器的X寄存器写入数据Y 那么我需要先给LCD发送一个命令----X寄存器的地址,此时D/C引脚为低电平
然后再发送一个数据Y,此时D/C引脚为高电平。但是正常的FSMC总线中没有控制命令与数据的功能(或许我不知道)。
正常的FSMC是绝对地址寻址。也就是需要硬件地址线A0-AX(X为地址的长度)去控制。
所以STM32使用了一根地址线不是说往LCD控制的的某个地址写入数据。而是用这一根地址线去控制往LCD输入是命令还是数据。
那么是怎么控制的,咱们一点一点来分析。
首先数据手册上说
为什么16位的时候要右移1位?这是因为宽度为16位的时候每写入一个数据,即为两个字节,那么地址就应该加2.
所以这样的话,用FSMC配置为16位数据宽度时,每次设置地址都只改变了HADDR[25:1],那么就会保证地址为2的倍数,不会出现从半个数据宽度的地址处写入数据的情况。搞清楚这个然后再来看原子提供的LCD结构体
1 2 3 4 5 6 7 8 | typedef struct { vu16 LCD_REG; vu16 LCD_RAM; } LCD_TypeDef; #define LCD_BASE ((u32)(0x6C000000 | 0x0000007E)) #define LCD ((LCD_TypeDef *) LCD_BASE) |
这段代码,结构体中包含两个双字节成员LCD_REG跟LCD_RAM;
大家都知道结构体中的地址是从上到下连续增加的。
结构体的地址即为LCD_REG的地址。那么LCD_RAM的地址将为LCD_REG地址加2,因为是u16,双字节类型。
FSMC使用了NOR/SRAM的 Bank1 sector4 那么根据数据手册可以得知NOR/SRAM的起始地址为0x6000 0000
但是FSMC又把NOR这部分区域的地址分为了四块,在这使用的是第四块,所以HADDR[27 26] == 11
即27与26位为1,所以地址应该基地址应该为0x6C00 0000
然后再看地址线选用了A6当作LCD的D/C区分线,那么就应该是写入LCD_RAM时,第七位(还有A0嘛 这反应一下)应该为1。但是设置的数据宽度为16位,STM32会自动的右移1位,所以咱们需要反过来左移一位,那么就应该是1000 0000b 把这个数减2就应该是
0111 1110b 即为0x7E
那么0x6C00 0000 | 0x7E 这个地址将会是LCD结构体的首地址。
1 | #define LCD_BASE ((u32)(0x6C000000 | 0x0000007E)) |
而这句话,将LCD_BASE代表这个地址数据
1 | #define LCD ((LCD_TypeDef *) LCD_BASE) |
这句话将LCD定义为一个结构体指针,而这个结构体指针的地址为LCD_BASE
现在再反过来推一遍。
定义了这个结构体指针,第一个成员的地址为0x6C00 007E,第二个成员的地址为0x6C00 0080
把这两个数写成二进制格式
0110 1100 0000 0000 0000 0000 0111 1110
0110 1100 0000 0000 0000 0000 1000 0000
通过对比是不是看出来第8位从0变为了1,即为A7的电平状态,但是由于16位数据格式,要右移一位,所以就会成为A6的电平状态。
所以通过这个结构体对不同地址写入数据,就能控制是对LCD写入的是命令还是数据。
关键字:STM32 结构体定义 FSMC
引用地址:
STM32采用结构体定义FSMC的地址
推荐阅读最新更新时间:2024-03-16 15:42
STM32串口的基本用法
前言:本来用不到串口,但在最近在读取传感器数据的时候数据发生了错误,被师兄推荐用串口来检查一下究竟读出的数据是什么,因此学习了串口的使用。事实证明,串口很有用,也没有想象中的那么复杂... 一、关于串口需要了解的几个知识点: 1.波特率:在串行通讯中,数据是按位进行传送的,因此传送速率用每秒钟传送格式位的数目来表示,称之为波特率。 波特率决定了串口传输的速度,1波特=1bps(位/秒)。波特率为9600的话就是1s传输9600位的数据。 串口的传输与网络等其他的传输有着相似之处,比如我么常用的wifi,区别在与这些网络的单位是k,只有串口是按位来计数的。 2.单工,半双工,全双工: 单工:只能一个方向传输 半双工:可以两个
[单片机]
STM32空闲中断+DMA解决接收不定长数据问题
串口的中断类型: #define USART_IT_PE ((uint16_t)0x0028) #define USART_IT_TXE ((uint16_t)0x0727) #define USART_IT_TC ((uint16_t)0x0626) #define USART_IT_RXNE ((uint16_t)0x0525) #define USART_IT_IDLE ((uint16_t)0x0424) #define USART_IT_LBD ((uint16_t)0
[单片机]
【菜鸟入门】stm32 之 DMA
DMA是个好东西,他可以帮助CPU分担好多工作,减轻CPU的工作压力,我们可以一边传输数据,一边干别的事情,很不错! 今天可谓是配置的好艰辛啊,看电视把我看蒙了,好多注意事项都木有看见,浪费了我好多时间。 好吧,开始进入主题! 时钟配置我就不用罗嗦了!大家自己去RCC里面的AHBENR找: RCC- AHBENR |= 1 0;//DAM1 Clock Enable 主要来看看DMAx的控制寄存器CCR 这个寄存器看着很容易理解,今天对控制寄存器有了新的认识,一般的寄存器可能要在控制寄存器的某一位关闭或者打开才能修改,而控制寄存器基本上可以在任意时刻进行修改,所以,在配置控制寄存器的时候我们没必要考
[单片机]
如何选择合适的MCU
什么是 STM32 STM32,从字面上来理解,ST 是意法半导体,M 是 Microelectronics 的缩写,32 表示 32 位,合起来理解,STM32 就是指 ST 公司开发的 32 位微控制器。在如今的 32 位控制器当中,STM32 可以说是最璀璨的新星,它受宠若娇,大受工程师和市场的青睐,无芯能出其右。 STM32 属于一个微控制器,自带了各种常用通信接口,比如 USART、I2C、SPI 等,可接非常多的传感器,可以控制很多的设备。现实生活中,我们接触到的很多电器产品都有 STM32 的身影,比如智能手环,微型四轴飞行器,平衡车、移动 POST 机,智能电饭锅,3D 打印机等等。下面我们以最近最为火爆的两个
[单片机]
STM32 KEIL 串口打印printf使用详解
常规打印方法 在STM32的应用中,我们常常对printf进行重定向的方式来把打印信息printf到我们的串口助手。 在MDK环境中,我们常常使用MicroLIB+fputc的方式实现串口打印功能,即: 要实现fputc函数的原因是:printf函数依赖于fputc函数,重新实现fputc内部从串口发送数据即可间接地实现printf打印输出数据到串口。 不知道大家有没有看过正点原子裸机串口相关的例程,他们的串口例程里不使用MicroLIB,而是使用标准库+fputc的方式。相关代码如: #if 1 #pragma import(__use_no_semihosting) //标准库需要的支持函数 struct __F
[单片机]
Stm32的io口模拟spi例程分析
以下是硬件电路图,主芯片为stm32rbt6. 贴上代码 void SPI_FLASH_Init1(void)//io初始化配置 { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_9;//CS CLK GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruc
[单片机]
关于STM32初学者必知
STM32的核心Cortex-M3处理器是一个标准化的微控制器结构,希望思考一下,何为标准化?简言之,Cortex-M3处理器拥有32位CPU,并行总线结构,嵌套中断量控制单元,调试系统以及标准的存储映射。 嵌套中断向量控制器(Nested Vector Interrupt Controller,简称NVIC)是Cortex-M3处理器中一个比较关键的组件,它为基于Cortex-M3的微控制器提供了标准的断架构和优秀的中断响应能力,为超过240个中断源提供专门的中断入口,而且可以赋予每个中断源单独的优先级。利用NVIC从可以达到极快的中断响应速度,从中断请求到执行中断服务的第一条指令仅需12个周期。这种极快的响应速度一方面得益
[单片机]
如何快速上手STM32学习?
单片机用处这么广,尤其是STM32生态这么火!如何快速上手学习呢? 你要考虑的是,要用STM32实现什么? 为什么使用STM32而不是用8051?是因为51的频率太低,无法满足计算需求?是51的管脚太少,无法满足众多外设的IO?是51的功耗太大,电池挺不住?是51的内存太小而你要存储的东西太多?还是51的功能太弱,而你要使用SPI、I2C、ADC、DMA? 当你需要使用STM32某些功能,而51实现不了的时候,那STM32自然不需要学习,你会直接去寻找STM32某方面的使用方法。比如要用spi协议的网卡、要使用串口通信、要使用rtos等等。 寄存器vs库函数 我的观点是:当你debug的时候寄存器很重要,当你需要理解芯片工作细
[单片机]