在项目中,原来使用的是八根数据线,读取数据没有问题,在后来改用十六根地址线并把数据宽度改为十六位之后读出来的数据就很奇怪了,经过仔细分析师由于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-03-16 15:28
STM32PWM输出实验
一、PWM简介 要使STM32的通用定时器TIMx产生PWM输出,除了定时器中断实验中提到的寄存器外,还会用到另外三个寄存器,这三个寄存器是:捕获/比较模式寄存器(TIMx_CCMR1/2)、捕获/比较使能寄存器(TIMx_CCER)、捕获/比较寄存器(TIMx_CCR1~4)。 首先是捕获/比较模式寄存器(TIMx_CCMR1/2),该寄存器总共有两个,TIMx_CCMR1和TIMx_CCMR2。TIMx_CCMR1控制CH1和2,而TIMx_CCMR2控制CH3和4。 在这章用到该寄存器的模式设置位OCxM,此部分由3位组成。总共可以配置为7种模式,这里我们使用的是PWM模式,所以这三位设置为110/111。这两种PWM模式
[单片机]
【STM32】通用定时器的基本原理(实例:定时器中断)
STM32F1xx官方资料: 《STM32中文参考手册V10》-第14章通用定时器 STM32的定时器 STM32F103ZET6一共有8个定时器,其中分别为: 高级定时器(TIM1、TIM8);通用定时器(TIM2、TIM3、TIM4、TIM5);基本定时器(TIM6、TIM7)。 他们之间的区别情况见下表: STM32定时器的区别 定时器种类 位数 计数器模式 发出DMA请求 捕获/比较通道个数 互补输出 特殊应用场景 高级定时器 16 向上、向下、向上/下 可以 4 有 带死区控制盒紧急刹车,可应用于PW M电机控制 通用定时器 16 向上、向下、向上/下 可以 4 无 通用。定时计数,PWM
[单片机]
学习STM32单片机,从菜鸟到牛人就是这样简单
想说,为了学习单片机而去学习单片机的思路不对。 你问,如何系统地入门学习STM32? 本身就是一个错误的问题。假如你会使用8051 , 会写C语言,那么STM32本身并不需要刻意的学习。 你要考虑的是, 我可以用STM32实现什么? 为什么使用STM32而不是8051? 是因为51的频率太低,无法满足计算需求?是51的管脚太少,无法满足众多外设的IO? 是51的功耗太大,电池挺不住?是51的功能太弱,而你要使用SPI、I2C、ADC、DMA? 是51的内存太小而你要存储的东西太多? 当你需要使用STM32某些功能,而51实现不了的时候, 那STM32自然不需要学习,你会直接去寻找STM32某方面的使用方法。比如要用s
[单片机]
STM32 通用输入输出端口GPIO BRR、BSRR、ODR寄存器详解
详细页面:http://alanzjl.sinaapp.com/2015/02/gpio_brr_bsrr_odr/ BRR、BSRR、ODR都是用来控制16位针脚的。 其中,BRR和ODR高16位都不可用(Reserved),使用低16位控制针脚,而BSRR高16位和低16位皆可用,都用来控制16位针脚。 BRR与BSRR使用方法 BRR和BSRR的最显著用处就是可以只改变某一个或某几个针脚的值而不改变其他。 1.BRR:如果程序对其某针脚赋值0,则该针脚维持原值不变,比如BRR的位0本来为1,则GPIOx- BRR=0x0语句之后该位值还为1。若对其赋值1,则该位值变为0(即复位值),比如BRR的位0本来为1,则GPI
[单片机]
STM32堆和栈(Heap & Stack)及SRAM存储使用
编译一个程序,出现下面的信息: 明明程序没有什么内容,为什么变量大小就有RW+ZI=52+1836=1888字节大小了呢,就已经使用了1888字节的SRAM空间。让我们打开map文件: 可以看到每个文件所使用的SRAM大小,比如delay文件使用了4个字节,地址从0x20000014到0x20000017。其中可以看到HEAP和STACK占了大头,分别占了0x00000200和0x00000400的空间。STACK的起始地址是0x20000360,大小是0x00000400,那么最后的地址是0x20000760,刚好等于1888=0x760字节。于是我们就知道SRAM空间用来存放了什么东西了:1、各个文件中声明和定义的全局
[单片机]
STM32开发笔记73: C++中子类调用父类同名函数的处理方法
单片机型号:STM32L053R8T6 1、问题 父类有1方法:Enable_RS485,如下所示: class CUart { public: uint8_t u8_UartNumber; //端口号1-8 uint32_t u32_BaudRate; //波特率 uint8_t u8_Parity; //效验位 CC0 C0; //485控制引脚C0 CC1 C1; //485控制引脚C1 UART_HandleTypeDef hUART; uint8_t u8_UartReceiveBuffer ; public: CUart(uint8_t u8_UartNumber, uint3
[单片机]
stm32 在IAR的第一个程序 点亮led
//使用前要建立好了工程的模板,这个可以参考我的stm32工程模板的建立一文 1:工程文件加入我们的led驱动主要是由led.h和led.c组成,再根据这个写自己的main 2: led.c的编写 #include led.h //这个 是led.h这个头文件 void led_gpio_init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);//这个的配置可以查看原理图我的是 GPIOE GPIO_InitStructure.GPIO_P
[单片机]
基于STM32的数字示波器设计与实现
0 引言 随着集成电路的发展和数字信号处理技术的采用,数字示波器已成为集显示、测量、运算、分析、记录等各种功能于一体的智能化测量仪器。数字示波器在性能上也逐渐超越模拟示波器,并有取而代之的趋势。与模拟示波器相比,数字示波器不仅具有可存储波形、体积小、功耗低,使用方便等优点,而且还具有强大的信号实时处理分析功能。因此,数字示波器的使用越来越广泛。目前我国国内自主研发的高性能数字示波器还是比较少,广泛使用的仍是国外产品。因此,有必要对高性能数字示波器进行广泛和深入研究。本文通过采用高速高性能器件,设计了一实时采样率为60 Msa/s的宽带数字示波器。 1 数字示波器的性能参数设计 数字存储示波器的指标很多,包括采样率、带宽、灵敏
[测试测量]