在项目中,原来使用的是八根数据线,读取数据没有问题,在后来改用十六根地址线并把数据宽度改为十六位之后读出来的数据就很奇怪了,经过仔细分析师由于STM32的内外地址映射造成的,具体参照STM32技术参考手册中文翻译第十版的327页,根据我的理解叙述如下:
块1存储区被划分为4个NOR/PSRAM区,这四个区在内部地址上是连续排列的。但是实际上每个区共用的是同一组地址线与数据线,因此需要有内外的一个地址映射,因此在STM32中实际上有两个地址,一个是在内部访问的地址,另外一个是实际地址线输出的地址。
HADDR[27:0]对应的是需要转换到外部存储器的内部AHB地址线,其中HADDR[27:26]位用于选择四个存储块之一。
HADDR[25:0]包含外部存储器地址。HADDR是字节地址,而不同的外部存储器数据长度也不一样,因此在数据宽度为8位和16位时映射关系也不一样。
在数据宽度为8位时HADDR[25:0]与FSMC_A[25:0]对应相连,这时候在STM32中访问的地址和实际地址线产生的地址是一致的。而在16位数据宽度时HADDR[25:1]与FSMC_A[24:0]对应相连,HADDR[0]未接,这时候实际地址线上给出的地址为需要访问的偏移地址的一半。
在本系统中由于使用了高精度的16位AD,实际数据读取与处理也都是16位,为了快速访问STM32采用的就是16位数据宽度,因此需要针对两者的地址进行相应的映射。重新计算地址之后问题解决。
关键字:STM32 数据宽度 地址问题
引用地址:
STM32 在16位数据宽度下的地址问题
推荐阅读最新更新时间:2024-11-04 18:32
STM32串口介绍
串口作为 MCU 的重要外部接口,同时也是软件开发重要的调试手段, 其重要性不言而喻。STM32 的串口资源相当丰富的,功能也相当强劲。ALIENTEK 战舰 STM32 开发板所使用的 STM32F103ZET6 最多可提供 5 路串口,有分数波特率发生器、支持同步单线通信和半双工单线通讯、支持 LIN、 支持调制解调器操作、 智能卡协议和 IrDA SIR ENDEC 规范、具有 DMA等。 串口设置的一般步骤可以总结为如下几个步骤: 1) 串口时钟使能,GPIO 时钟使能 2) 串口复位 3) GPIO 端口模式设置 4) 串口参数初始化 5) 开启中断并且初始化 NVIC(如果需要开启中断才需要这个步骤) 6) 使能串
[单片机]
STM32-(02):结识STM32
全新的Cortex架构系列,为嵌入式市场提供了一个三管齐下的解决方案。 1、 Cortex-A:高性能应用处理器;(越来越接近电脑) 2、 Cortex-R:专门针对实时、深度嵌入式解决方案;(又要快又要实时); 3、 Cortex-M:专注于低成本嵌入式微控制器;(好用又便宜) A:需要运行复杂应用程序的“应用处理器”,支持大型嵌入式操作系统(不一定实时),比如Symbian (诺基亚智能手机用),Linux,以及微软的WindosCE和智能手机操作系统Windos Mobile。这些应用需要劲爆的处理能力,并且需要硬件MMU实现的完整而强大的虚拟内存机制,还基本上配有Java支持,有时还要求一个安全程序执行环境(用于电子商务
[单片机]
(八)STM32的CAN模块实验
bxCAN是基本扩展CAN(Basic Extended CAN)的缩写,它支持CAN协议2.0A和2.0B。它的设计目标是,以最小的CPU负荷来高效处理大量收到的报文。它也支持报文发送的优先级要求(优先级特性可软件配置)。 主要特点 *****; 支持CAN协议2.0A和2.0B主动模式 *****; 波特率最高可达1兆位/秒 *****; 支持时间触发通信功能 发送 *****;3个发送邮箱 *****; 发送报文的优先级特性可软件配置 *****;记录发送SOF时刻的时间戳 接收 *****; 3级深度的2个接收FIFO *****; 14个位宽可变的过滤器组-由整个CAN共享 ***
[单片机]
STM32 IIC读写AT24C02(二)
上次已经完成了IIC读写AT24C02的协议层,现在开始编写读写AT24C02的驱动函数。先从单字节的读写开始。 字节写要求在接收器件地址和ACK应答后,接收位的字地址。接收到这个地址后AT24C02应答“0”,然后是一个8位数据。在接收8位数据后,AT24C02应答“0”,接着必须由主器件发送停止条件来终止写序列。 此时AT24C02进入内部写周期tWR,数据写入非易失性存储器中,在此期间所有输入都无效。直到写周期完成,AT24C02才会有应答。 void AT24C02_ByteWrite(u8 wordAdd,u8 dat,s8 *err) { u8 ack = 0; IIC_Start(); IIC_
[单片机]
stm32专题二十一:LCD控制原理
使用的液晶屏内部包含有一个液晶控制芯片 ILI9341,它的内部结构非常复杂,如图所示。该芯片最主核心部分是位于中间的 GRAM(Graphics RAM),它就是显存。GRAM 中每个存储单元都对应着液晶面板的一个像素点。它右侧的各种模块共同作用把 GRAM 存储单元的数据转化成液晶面板的控制信号,使像素点呈现特定的颜色,而像素点组合起来则成为一幅完整的图像。 框图的左上角为 ILI9341 的主要控制信号线和配置引脚,根据其不同状态设置可以使芯片工作在不同的模式,如每个像素点的位数是 6、16 还是 18 位;可配置使用 SPI 接口、8080 接口还是 RGB 接口与 MCU 进行通讯。MCU 通过 SPI、8080 接
[单片机]
STM32/GD32芯片信息
因为需要自动适配芯片进行系统配置,所以我们有必要通过读取一些系统寄存器来获取必要信息。 我们的代码需要兼容STM32F1/GD32F1/STM32F0/STM32F4 代码如下: #ifdef STM32F0XX void* p = (void*)0x1FFFF7AC; #else void* p = (void*)0x1FFFF7E8; #endif memcpy(ID, p, ArrayLength(ID)); CPUID = SCB- CPUID; uint MCUID = DBGMCU- IDCODE; // MCU编码。低字设备版本,高字子版本 RevID = MC
[单片机]
stm32使用systick精确延时
利用系统滴答定时器来实现精确延时,需要以下五步: 1、设置滴答定时器的时钟,通过设置其控制寄存器,选择外部时钟,即为系统时钟的八分之一,若系统时钟为72M,则滴答定时器时钟为9M。即定时一秒需要9M个时钟周期。 2、设置滴答定时器的重装载寄存器的数值,即需要延时的时钟周期数。如:若需要延时20微秒,则重装载值为20*9.若要延时20毫秒,则设置重装载值为20*9000. 3、清空滴答定时器当前值寄存器的值,使之为零,以便使能计数时能够从设定值开始倒数计时。 4、设置滴答定时器的控制寄存器,开始倒计数。 5、查询滴答定时器的状态位,定时时间到,关闭定时器,清空定时器当前值。 void delay_init(u8 SYSCLK) {
[单片机]
017_STM32程序移植之_AS608指纹模块
BUG说明: 硬件接线图如图所示 STM32引脚 指纹模块引脚 功能 3.3V 3.3V PA3 Tx PA2 Rx GND GND PA1 WAK 3.3V Vt U+ 悬空 U- 悬空 STM32引脚 CH340引脚 GND GND 3.3V 3.3V TXD RXD RXD TXD 指纹模块的资料在这个文件,超级详细,里面包含了51和STM32的程序 本次移植修改战舰源码,不用屏幕来测试,只用串口助手来进行指纹模块的测试 测试是使用C8T6来进行测试,
[单片机]