关于GD32外挂8080LCD芯片的疑问(非面向公开的,用于记录踩坑点)

通过ESMC来外挂外部存储器,通过地址映射来管理外部存储器的地址。
EA0~EA24是对外暴露的地址线接口,
在这里插入图片描述

在这里插入图片描述

问题1:esmc接口LCD驱动

RS为0表示CMD,RS为1表示DATA
RS接了FSMC地址线A0上,所以只需要A0为0就表示cmd,A0为1就表示DATA,我这种方法#define LcdSendData(dataVal) (*(volatile uint16_t *)0x64000003) = dataVal ,A0应该也是1呀?为什么不行呢

//数据寄存器和命令寄存器的起始地址  
//我们只需要和这些LCD的控制寄存器交换数据即可实现通过这些控制器来实现控制LCD
//EA0--RS--HA1 
#define LcdSendCmd(cmdVal) 		(*(volatile uint16_t *)0x64000000) = cmdVal      // 发送命令 0	
#define LcdSendData(dataVal) 	(*(volatile uint16_t *)0x64000002) = dataVal     // 发送数据 1
#define LcdGetData() 			(*(volatile uint16_t *)0x64000002)               // 读取数据

你提到的寄存器地址和访问问题可以从以下几个方面分析:

1. 地址对齐问题
  • 定义:地址对齐是指数据的起始地址需要在特定的字节边界上。例如,16位数据通常要求地址是2的倍数,32位数据要求地址是4的倍数。
  • 问题0x64000003 是一个未对齐的地址(奇数地址),可能会导致对16位寄存器的不稳定访问或硬件错误。大多数硬件设计要求16位寄存器地址必须是偶数地址。
2. 寄存器映射
  • 定义:寄存器映射是指特定的地址映射到特定的硬件寄存器。
  • 问题:如果LCD控制器的设计中,0x64000003 实际上并不存在或未被定义,访问这个地址可能会导致错误或不预期的结果。LCD控制器可能只能在对齐的地址(如 0x640000000x64000002)上正确处理数据。

问题二. 地址对齐问题 可以解释一下吗,不太清楚这个概念
当然可以,地址对齐是硬件和内存访问中的一个重要概念。它指的是数据存储和访问的地址在内存中的对齐方式。

地址对齐

1. 定义

  • 地址对齐是指数据的起始地址应该是特定的字节边界上的。例如,16位数据(2字节)通常要求其地址是2的倍数(偶数),32位数据(4字节)要求地址是4的倍数。

2. 为什么需要对齐

  • 性能优化:对齐的数据访问通常比非对齐的数据访问更高效。处理器可以一次性读取或写入对齐的数据块,而非对齐的数据可能需要分多次操作,影响性能。
  • 硬件限制:某些硬件设计要求数据必须在特定的边界上进行访问。例如,16位寄存器可能只能在偶数地址上进行有效操作。

3. 对齐的实例

  • 8位数据:可以在任何字节地址上访问(例如 0x64000001)。
  • 16位数据:地址必须是2的倍数(例如 0x640000000x64000002),不能是奇数地址(如 0x64000003)。
  • 32位数据:地址必须是4的倍数(例如 0x640000000x64000004),不能是其他地址(如 0x64000002)。

4. 对齐问题的影响

  • 性能下降:未对齐访问可能需要多个内存操作,导致额外的开销。
  • 硬件错误:某些硬件无法处理未对齐的访问,可能导致错误或异常。

实际应用

在你的例子中:

  • 正确地址0x640000000x64000002 是偶数地址,适合16位数据对齐。
  • 错误地址0x64000003 是奇数地址,对16位寄存器不对齐,可能导致错误。

总的来说,保持数据的地址对齐是确保系统高效稳定运行的关键。
如何对齐呢?
在这里插入图片描述

为什么地址线代表的数据 (地址)移动一位即可对齐呢?如何理解?

地址线移动一位对齐的原因是由于地址空间的组织方式。以下是详细的解释:

  1. 地址对齐的基本概念

    • 16位系统中的地址空间通常是以2的幂次方为单位对齐的,例如16位对齐,即每2个字节(16位)形成一个对齐单位。
    • 8位地址系统中的地址,每个地址代表一个字节。
  2. 地址空间的关系

    • 在8位地址系统中,地址范围是0到255(即0x00到0xFF),总共256个地址。
    • 在16位地址系统中,地址范围是0到65535(即0x0000到0xFFFF),总共65536个地址。
  3. 对齐的实现

    • 当你将8位地址转换为16位地址时,如果每个16位地址空间单位代表2个8位字节,那么8位地址空间需要在16位系统中扩展为2倍。
    • 移动一位(即左移1位)相当于乘以2,这样8位地址被映射到16位地址的正确对齐位置。例如,8位地址0x05转换成16位地址时,直接作为0x05是可以的,但如果需要确保16位对齐,则可以将其左移,变成0x0A。
  4. 示例

    • 8位地址0x01,在16位地址空间中,左移一位后是0x02,这相当于在16位对齐的地址空间中每两个8位字节使用一个16位地址单位。

总结起来,左移一位相当于将地址放大到16位对齐的单位,每个16位地址空间可以容纳两个8位地址,这样可以确保地址在16位系统中正确对齐。

  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值