This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] EK-TM4C1294XL:ADC Reg32保留空间

Guru**** 2482225 points
Other Parts Discussed in Thread: INA240

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/728243/ek-tm4c1294xl-adc-reg32-reserved-space

器件型号:EK-TM4C1294XL
主题中讨论的其他器件:INA240

C++语言如何能够将 保留 的寄存器位 31:16读取 到 Int32_t 变量数组中、但  在 REG17、18、19、20中只有较低的位11:0被标记为 R0? 为什么 Tivaware 会尝试读取 FIFO 寄存器中的保留寄存器位? 更好的是 Thumb 指令集在某种程度上不允许在保留空间中读取寄存器? 如果是 、UINT32_t 变量传输如何影响未  邀请到该方的 REG17、18、19、20的高31:16位上试图崩溃的已合规应用程序?  FIFO 读取是一个1:1触发电平事件到任何 C++数组变量单元中、在任何高于0的序列发生器中、情况似乎并不总是如此。

HWREG 32宏通过 适当 的 uint16_t 变量数组读取这些寄存 器、但不会返回所有序列发生器1或2配置步骤的 FIFO 第0步结果数据。 通常   、只有当被读取到 uint16_t 数组中时、步骤1或2才不是通过 FIFO 的典型中断处理的预期数据。 似乎能够正确读取循环 FIFO 的任何单步执行、因为数据表 中的裕度 已经排除了有关头指针或尾指针在  采样后何时准确变化的许多细节。 每个人都只是假设最后 一个采样步骤的 IE 结束时尾指针返回到第0步。 然而、数据表 为   进行假设留下了所有此类必要的详细信息、其中大多数错误或不 会在所有序列发生器中产生一致的结果。 Tivaware 原油 ADCSequenceDataGet ()试图突破极限 ,以产生无用的函数调用。 请编写 FIFO 读取数据函数、以便正确地用于业务、它可以传递任何单步变量、以便在不重新调整所有 FIFO 步进数据的情况下将序列发生器中的任何单步数据检索到 C++ uint_16数组中。 如果它无法对所有序列发生器执行该简单的步进、则 M3没有 M4 ADC 存在问题。  

使用 while (1) 等待循环 中断处理的 Tivaware 示例项目不是处理 NVIC 中断 以在 任何 强大的应用中检索 FIFO 数据的安全或实用方法。 请在未来的示例软件中使用适当的 NVIC 处理中断 、这 是 任何 MCU 业务应用中使用的典型方法。 在大型应用中、不会使用任何主体、while (1)循环 等待来自  GPTM、PWM0、PWM1、 GPIO 或任何其他可能的触发源的触发 ADC 采样产生中断。  这一特性使得 while (1)循环更多地采用较低的编程形式 、从而浪费宝贵的 CPU 时间并教授错误的编程方法! 同样 、while (1)循环不是 TI 工程师确认 ADC 模块没有潜在问题的好方法。 也许 TI 知道  存在奇怪的行为 M4 ADC 序列发生 器,并且正在尝试更改典型和正确 ADC 外设使用的叙述 ,试图 通过 ADCSequnceDataGet ()来覆盖它们?

ADC 触发器应按顺序激活采样转换、这是对序列发生器0步进执行的 、但似乎经常跳过   SS1或 SS2 (ADC0/1)中的第0步或第1步、不确定 SS3。 Tivaware 省略了任何检索特定序列发生器步骤的能力 、这似乎有点欺骗性。  ADC0 序列发生器中也存在底层行为、 ADC1 控制 19:16通道、导致 ADC0 和 ADC1之间共享控制出现问题 、在非 1个但2个 ADC 模块中的模拟多路复用器 Tivaware 控制中、似乎遗漏了该控制。 由于 M3可以 通过单个 ADC 轻松完成、因此似乎忽略了有关 ADC0和 ADC1如何检索任何通道的特定 FIFO 数据的信息。  ADC 模块配置中存在一些问题、勘误文档中未予披露。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    为什么要读取保留字段? 很抱歉、如果这不是您的问题。 至于 ADCSequenceDataGet 为缓冲区指定32位指针的原因、我不确定、因为我没有 TivaWare 和 ADC 规格的历史记录。 我可以在一个时间点对 ADC 模块进行映像、该模块可能设想提供两种读取 FIFO 的方法。 一种方法是当前支持的方法、即以 FIFO 方式从位于0x48的 ADCSSFIFO0寄存器中读取数据。 另一种方法是允许 CPU 发出 LDMIA 以读取多达8个转换结果。 如果您看看 REG17、18、19和20的偏移地址、它们位于0x48、0x68、0x88和0xA8、每个 FIFO 地址用8个字隔开。 也许在一个时间点、每个序列发生器支持8个步骤。 CPU 可能会发出从起始地址0x48到读取8的 LDMIA 转换、这会导致突发操作更快。 我之所以合理化这个可能的方案、是因为这是我们在 Hercules ADC 模块中实现的。 无论如何、它今天的方式只是浪费缓冲区中的一些未使用的空间、但保留的空间应该被应用程序忽略。

    int32_t
    ADCSequenceDataGet (uint32_t ui32Base、uint32_t ui32SequenceNum、
    uint32_t * pui32Buffer)
    {
    uint32_t ui32Count;
    
    //
    //检查参数。
    //
    assert (((ui32Base == ADC0_BASE)||(ui32Base == ADC1_base));
    assert (ui32SequenceNum < 4);
    
    //
    //获取要读取序列的偏移量。
    //
    ui32Base += ADC_SEQ +(ADC_SEQ_STEP * ui32SequenceNum);
    
    //
    //从 FIFO 中读取样本,直至其为空。
    //
    ui32Count = 0;
    while (!(HWREG (ui32Base + ADC_SSFSTAT)& ADC_SSFSTAT0_EMPTY)&&
    (ui32Count < 8))
    {
    //
    //读取 FIFO 并将其复制到目的地址。
    //
    *pui32Buffer++= HWREG (ui32Base + ADC_SSFIFO);
    
    //
    //递增读取的样本数。
    //
    ui32Count++;
    }
    
    //
    //返回读取的样本数。
    //
    return (ui32Count);
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    [引用用户="Charles Tsaa"]不管怎样,它今天的方式只是浪费缓冲区中的一些未使用空间,但保留空间应该被应用程序忽略[/引用]

    如果 您注意 到 ADCSequenceDataGet ()使用 uint32_t DECL 变量数组将 12位 FIFO 数据读取到, 31:15位仍为 mayhem 打开,则会出现问题? 在读取每个 FIFO 时、ui32_t 是否专门访问每个 FIFO 的保留存储器空间?

    即使使用 HWREGH (uint16_t)数组检索任何单步进索引数组单元、 也会以某种方式更改 步骤0 Rs 阻抗、从而 仅增加开环 增益100x、该步骤。 这也可以是 ADCSequenceDataGet ()的属性,但 现在不 能使用该调用来检索 FIFO 数据的任何人都可以不使用该属性。

    更大的问题是 ADC1与   SS1中的19:16 FIFO 数据相对于 ADC0 3:0 AIN 输入重叠 。当 ADCCLK 将 ADC0   STEP 0的 Rs 阻抗从32MHz 更改为16MHz 时 、  ACDC1 SS1 STEP 0  1降低、FIFO 数据 ADC1 可产生 ADC0 STEP 0 FIFO 数据。 KISS 测试确认 ADCCLK 速度 对 ADC 模块序列发生器步骤 0开环增益 受到其他模块 FIFO 数据的影响有影响。

    在本例中、ADC1 SS1被分配 给 AIN 通道 (19:16的任意通道)、 ADCCLK 2MSPS、这 使得 ADC0 SS1 STEP 0 AIN ( 3:0的任意 通道)输入 Rs 阻抗在 序列发生器的其他步长上非常敏感。   这是三 个 INA240 AINx 输入依赖于开环 SAR 通道增益(Rs 阻抗)的真正问题。  

    ADC0 SS1第0步是电流相位 A、  如果软件未减去过大的增益、则很容易在第0步的100倍增益中产生电流故障、从而降低 其他2个 AIN 输入 FIFO 值。  该增益通过  kiss 测试 跳线在 EK/EVM 的 SS1第0步中出现、 在 (3:0)个通道中的任何一个通道上10k 至接地。 较低的 Rs 通道阻抗 SS1第0步从 ADC0移动到 ADC1 SS1第 0步(ADCCLK 速度)、该 ADC1 序列发生器的 FIFO (第0步)数据可以通过   模拟多路复用器在内部通过 LAP ADC0 SS1第0步进0。 尽管 ADC0 SS1第0步 Rs 阻抗增加 、但它 从 ADC1 SS1第0步接收到重叠的 FIFO 数据。  更改 ADCCLK 32MHz 和 ADC0 FIFO 阶跃0 Rs 阻抗 与 相同序列发生器中的任何其他步骤相比、无论15:0的 ANIx 分配如何、都可以降低灵敏度。 然而、步骤1、2 AINx 通道 的 Rs 阻抗在采样间隔期间保持非常高。   

      在 AINx 采样期间、所有 ADC0/1 SS1配置步骤的 AINx Rs 阻抗必须相当相等、这是最重要的方面。  步骤0与 同一序列发生器中的其他 AINx 通道相比具有极低阻抗(100倍增益)的 Rs 将永远不起作用。

    部分 WA 是 禁用序列发生器的步骤0。  这就引出 了一些问题、   为什么 Rs (采样)阻抗在序列发生器步骤0中的 ADC0/1之间移动 、它 如何影响 HWREGH 对循环 FIFO 数据的读取? 为什么 ADCCLK 速率会 对 SS1的第0步(ADC0/1)中的其他步骤产生显著的 Rs 阻抗影响?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="BP101]\n 如果您注意 到 ADCSequenceDataGet ()使用 uint32_t DECL 变量数组将 12位 FIFO 数据读取到中, 则会出现问题,可能会发生混乱? 在读取每个 FIFO 时、ui32_t 是否专门访问每个 FIFO 的保留存储器空间?

    不、您的理解不正确。 FIFO 的"物理"宽度仅为12位。 FIFO 仅"内存映射"到32位空间。 这并不意味着 FIFO 被执行为一个32位存储器。 在物理设计中、12位 FIFO 数据输出被路由到 CPU 存储器 AHB 总线的11:0、而其余的31:12位在读取 ADCSSFIFOx 寄存器时被强制为零。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Charles Tsaaa">为什么要读取保留字段? 抱歉、如果这不是您的问题。

    您的权利、这不是问题的意图。

    而 ADCSequenceGet ()为什么也会入侵保留位空间,而不会以某种方式影响 较低(15:0)位 (11:0),这一点就更重要了。 上述测试 HWREGH (uint_16T) 在 通过 AIN 硬件的步骤0 FIFO 数据的 Rs 阻抗方面没有差异。 然而、即使 HWREGH 入侵低字的15:12 、也可能会在汇编器级别对 CPU 指令造成某种程度的混乱、从而正确读取硬件 FIFO 数据区域的(11:0) 12位。  

    也许更多的问题是 ARM Cortex 如何通过 CPU R/W 指令处理 REG 保留位、以及  在任何此类违反行为期间、硬件可能会发生什么情况!  旧学校方法本来可以屏蔽低12位 0xFFF 、但[HWREG (ADC1_BASE + ADC_O_SSFIFO1)&0x0FFF ]不能校正步进0 Rs 阻抗低于 任何其他序列发生器阶跃。

    重点是   、在 FIFO 硬件 读取 软件 C++阵列单元时、可能需要通过 C++对 FIFO 进行特殊处理、以免干扰第0步 Rs 阻抗。  如果您没有查找 或检查硬件以解决 此特定问题、您甚至不会知道它可能存在!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    总线上的31:12和 Rs 阻抗之间没有任何关系。 很抱歉、我真的不明白为什么要把不存在的东西关联起来-位31:12应该一直读取为0、应用程序应该一直屏蔽它们-以对数据转换或 Rs 值的精度产生任何影响。 一段时间前、我发布了该图。 转换由模数转换器完成。 FIFO 只是转换结果的存储。 FIFO 不会影响 ADC 对其模拟输入进行采样的方式。 如果你只是不想相信、我什么也做不到。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Charles Tsaa"] FIFO 不会影响 ADC 对其模拟输入的采样方式。由于 FIFO 时序与转换器采样帧时间相关、这可能是错误的结论。

    软件当前正在屏蔽 FIFO、所有可能 的方式(11:0)位 都不控制 AD 转换器相对于 ADCCLK 速度在芯片级上的行为方式。  下面的捕捉显示 了一些人认为 真理不是全部真理的选择。

    EKXL/EVM:ADC1 SS1 STEP 0 CH0、STEP 2 CH9   均 通过100k 电阻器连接至3V3。  LM94002温度公式 读取  FIFO1数据并进行展示 。 当我从 AIN CH9提取3V3时 、另一个阶跃数据将在读取 FIFO1的中断处理程序中更改为特定名称的2个数组变量 LowTemp[0]  HighTemp[0]。  CH0 3V3保持连接、但 CH0 (之前的 CH16)中的值发生变化。  测试低于1MSPS、无硬件、平均480MHz PLL。  

    将 ADCCLK 上调至32MHz、CH0的低阻抗随后移至 ADC0 STEP 0 CH5、这意味 着 AIN 低 Rs 阻抗 的作用类似于天线、在其他序列发生器步长不是如此的情况下非常敏感。  这直接证明 AD 转换器相对于 FIFO 访问时序 与 步骤0中的转换有关。 AINx 第0步与 同一序列发生器中的其他 AINx 相比变得超级敏感、这是怎么做的? 简单地说、通道的作用更像天线、而不是受 Rs 阻抗控制的采样源。 问题是、为什么会发生这种情况、是否可以通过 ADC 序列发生器和 步进的软件配置来纠正?

    //配置 ADC0和 ADC1模拟块采样时钟速率
    // 32MHz 2MSPS 返回序列发生器样本已满。
    // 2MSPS:系统时钟 PLL480/15=32MHz 31.25ns。
    // 1MSPS:系统时钟 PLL480/30=16MHz 59.6ns。
    // ADC 模块可以使用通过 ADCALTCK
    
    ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_FULL、30)设置的替代时钟源 PIO;
    
    //配置 ADC0/1 VREFP =外部+VRefA[1]或 VDDA[0] 3V3 */
    MAP_ADCReferenceSet (ADC0_BASE、ADC_REF_INT);//ADC_REF_EXT_3V、ADC_Reference_INT
    MAP_ADCEXT (ADC1_BASE、ADC_REF_INT);ADC_REF_INT_3V 

    HWREG (ADC1_BASE + ADC_O_SSTSH1)= 0x2222;
    
    MAP_ADCSequenceStepConfigure (ADC1_BASE、1、0、PIN_MOSTEMP_LOW1); //AIN0为 AIN16
    MAP_ADCSequenceStepConfigure (ADC1_BASE、1、1、PIN_MOSTEMP_HIGH1 | ADC_CTL_IE);//AIN9
    MAP_ADCSequenceStepConfigure (ADC1_BASE、 1、2、ADC_CTL_END); 

    hw_types.h
    
    #define HWREGI (x) \
    (*(volatile int16_t *)(x)))(
    
    ********* /
    void
    ADC1MOSTempHandler (void)
    {
    
    volatile int16_t int16Temp;
    int16_t int16ADC1MOSTempLow[1];
    静态 int16_t int16TempLow;
    int16_t int16ADC1MOSTempHigh[1];
    静态 int16_t int16TempHigh
    
    
    /*清除 ADC1 SS1中断*/
    MAP_ADCIntClear (ADC1_BASE、1);
    
    
    /*禁用 SS1序列。*/
    HWREG (ADC1_BASE + ADC_O_ACTSS)&=~(ADC_ACTSS_ASEN1);
    
    /*读取敏感原始采样序列步长 ADC1 FIFO-1。 //
    int16ADC1MOSTempLow[0]= HWREGI (ADC1_BASE + ADC_O_SSFIFO1)& 0x0FFF;
    int16ADC1MOSTempHigh[0]= HWREGI (ADC1_BASE + ADC_O_SSFIFO1)& 0x0FFF;
    //步骤2的虚拟读取;
    
    
    
    * HWREG/ ADC1_BASE = ADC1_SSFIFO1;/ADC1_ENO1 + ADFIFO1 + ADC1_ENO1。 //
    while (!(HWREG (ADC1_base + ADC_O_SSFSTAT1)& ADC_SSFSTAT1_EMPTY)
    ){
    /*清空循环 FIFO。 *
    int16Temp = HWREGI (ADC1_BASE + ADC_O_SSFIFO1);
    }
    //清除(RW1C) FIFO SS1上溢和下溢状态位。*/
    (HWREGBITW (ADC1_BASE、ADC_O_OSTAT)|= ADC_OFIFO_OV1
    
    
    
    
    
    );(HWREGBITW (ADC1_BASE)|ADC1_ADC1_ADC1_ADC1_ADC1_ADC1*或 ADC1_ADC1_ADC1_RESUDC1上溢;(ADC1_ADC1_ADC1_ADC1_ADC1_OUTSS)| ADC1_ADC1_ADC1_RESULT (ADCK_RETURN)| ADC1_ADC1_ADC1_ADC1_ADC1_ADC1_ADCK_RESULT_ 或者
    、如果* FIFO-1在读取本应包含的所有数据后已满(RO)。*/
    if (HWREG (ADC1_BASE + ADC_O_OSTAT)和 ADC_OSTAT_OV1)||
    (HWREG (ADC1_BASE + ADC_O_USTAT)和 ADC_USTSS)||
    (HWREG (ADC_STAT_1_BASE)
    
    
    + ADC1_ADAP1 ~+ ADAP_SAFRATES + ADC_1)+ ADAP_1 (ADAP_ACSS_1)+ ADAP_FAST1 (ADC_FRATES + ADC_1)+ ADAP_1 + ADAP_1 (ADAP_1)。
    
    /*排空 SS1 FIFO 1。 //
    while (!(HWREG (ADC1_base + ADC_O_SSFSTAT1)& ADC_SSFSTAT1_EMPTY)
    ){
    //清空循环 FIFO。 //
    int16Temp = HWREGI (ADC1_BASE + ADC_O_SSFIFO1);
    }
    //将模拟温度变量归零*/
    int16ADC1MOSTempLow[0]= 0;
    int16ADC1MOSTempHigh[0]= 0;
    
    //清除(RW1C) FIFO SS1上溢和下溢状态位。* HW16ADC1_ADC_RESTSS_BASE
    
    
    
    = 0;*(ADC1_ADC1_ADC1_ADC1_ADC1_RESTSS)| EN1_BASE = 0;// HW1_ADC1_ADC1_ADC1_ADC1_ADC1*(AD_RESTSS_AD_AD_ADC1*(AD_RESTSS)|AD_RESTSS_RESTSS_RESTSS_RESTSS_BASE = 0;//(AD_AD_AD_AD_ADC1_AD_AD_AD_RESTSS_RESTSS
    
    
    返回;
    }
    
    /*过滤 ADC1序列发生器1模拟输入 PIN_MOSTEMP_LOW1、PIN_MOSTEMP_HIGH1 *
    
    耦合输出每个安装在 LM94002Q PCB 上的温度传感器。
    *温度至模拟电压范围 GS0/1=11、数据表中的表*
    
    int16TempLow =(((int16TempLow * 7)+ int16ADC1MOSTempLow[0])/ 8);
    int32MOSTempValueLow =(((1884 * 4096)-(2284 * int16TempLow))/ 4870);
    
    int16TempHigh =(((int16TempHigh * 7)+ int16ADC1MOSTempHigh[0])/ 8);
    int32MOSTempValueHigh =(((1884 * 4096)-(2284 * int16TempHigh))/ 4870); 
    /*打印 MOSFET Q1和 Q5的当前温度*/
    UARTprintf (">MOSTempLow -->:%i*C\n"、int16ADC1MOSTempLow[0]);
    UARTprintf (">MOSTempHigh -->:%i*C\n"、int16ADC1MOSTemp0];[0] 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不理解下面显示的公式、即1884、2284和4870以及所有乘法和除法。 为什么不将原始 FIFO 值打印到显示屏上、并准确显示在 AIN9连接到3.3V 而不是移除之前获得的结果与预期的结果。
    int16TempLow =(((int16TempLow * 7)+ int16ADC1MOSTempLow[0])/ 8);
    int32MOSTempValueLow =(((1884 * 4096)-(2284 * int16TempLow))/ 4870);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [报价用户="Charles Tsaaaaa">为什么不将原始 FIFO 值打印到显示屏上、并准确显示在 AIN9连接到3.3V 之前获得的结果与预期的结果。 [/报价]

    奇怪的是当步骤 1 AIN9 (MOSTempLow)被接地时,步骤0 AIN0仍然相当接近-28.5*C (+3.295v), 假定为小数点。 然而、当步骤0 AIN0接地时、两个值都变为正整数。 当 AIN0和 AIN9都接地时 ,“低”和“高    ”都是完全相同的值(158.4*C),因此公式刻度在数据表中是相当线性的。   

    诚然 、ADCCLK 频率变化中提到的阻抗移动问题 是我的部分缺点。  使用  剪切粘贴修改 ADC0 SS0代码 从 ADC1 SS1代码进行虚拟 FIFO 阶跃加载、 随后、CTRL-Z 在编辑后将其切换回。   昨天晚了很多次检查了相同的代码、没有看到与 ADC1的任何连接、但它的使用寿命很长。

    仍然没有解释自定义 PCB 中的(MOSTempLow) ADC1 SS1 AIN16如何受到 ADC0 SS1的困扰、即使在检查 CTRL-Z 直击错误后、 也找不到任何问题。 希望 HWREGI (Int16_t)宏 也能在该序列发生器中提供帮助、因为它在今天之前并不存在于 Tivaware 中。   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Charles Tsaaa"]我不理解下面显示的1884、2284和4870的公式以及所有乘法和除法[/引用]

    在 ADC 序列发生器上试用、 公式是与 LM94002温度范围-50 * C (+3.25v)至150 * C (538mV) 或接地的低通噪声滤波器、以简化设计。 LM94002 传输表 未显示 数十摄氏度的电压 、但公式比传输表1更准确、 低至10mV/摄氏度似乎非常接近精度。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    即使 在将 CH9更改为 CH16后、结果仍然无法校正 VREFP (3V3)看起来是 AIN=3V3时的1/2。

    UARTprintf()位于 FIFO 读取数据和 USBprintf() 左侧打印的结果的右侧。  结果似乎表示相对于步骤1的步骤0以某种方式进入 AINx 差分模式、或者当两  个通道之间交换了通道电压极性时已经处于差分模式。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Charles Tsaaaa">不是,您的理解不正确。 FIFO 的"物理"宽度仅为12位。 FIFO 仅"内存映射"到32位空间。

    我必须 相信 外设寄存器 被视为物理 数据 I/O 地址空间。 存储器映射地址 通常与  涉及的 SRAM、闪存和 EEROM 相关。 然而、Bob 认为 FIFO 12位只是移位寄存    器、因此保留空间更多地与物理地址空间相关、而不是与存储器映射的地址空间相关。   当被保留空间时、我不会得到31:12被强制为任何值的印象、   CPU 指令不应该访问它、或者导致尝试 将32位读取 到16位 CPU 累加器中的奇数行为。 似乎还记得、英特尔486 CPU 曾经采用  16位寄存器和 32位 CPU 内核进行设计、曾经发生过瓶颈、但当时速度很快。

    尽管如此、数据表中并未显示 AHB/HB 为32位宽(总线矩阵) 、但说明了 ARM cortex M4F 32位 (内核) 、并且让人质疑 AHB 甚至是32位宽、更可能是16位宽的总线矩阵。

    μ■Thumb-2混合16/32位指令集以通常与8位和16位器件相关的紧凑内存大小提供32位 ARM 内核所期望的高性能、通常在微控制器级应用的几千字节内存范围内