Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在STm32核子板(mbed)上写入SRAM_C_Stm32_Mbed - Fatal编程技术网

C 如何在STm32核子板(mbed)上写入SRAM

C 如何在STm32核子板(mbed)上写入SRAM,c,stm32,mbed,C,Stm32,Mbed,我想在芯片上的SRAM中存储一个简单的整数。(皮质M4) 我使用的程序是在线mbed。 我知道SRAM的地址从0x2000 0000开始,芯片有4KB的内存 我已经阅读了数据表和位绑定部分,但这对我来说毫无意义 有人能向我解释一下我如何将数字5存储在SRAM中并再次读取吗 当前代码是这样的(c是一个整数,用户可以通过按钮更改): if(c==100){ 温度=c; MBX_B0=1;//字写入 temp=MBX_B7;//字读 计时器\u B0=temp;//字节写入 返回计时器\u B7;//

我想在芯片上的SRAM中存储一个简单的整数。(皮质M4) 我使用的程序是在线mbed。 我知道SRAM的地址从0x2000 0000开始,芯片有4KB的内存

我已经阅读了数据表和位绑定部分,但这对我来说毫无意义

有人能向我解释一下我如何将数字5存储在SRAM中并再次读取吗

当前代码是这样的(c是一个整数,用户可以通过按钮更改):
if(c==100){
温度=c;
MBX_B0=1;//字写入
temp=MBX_B7;//字读
计时器\u B0=temp;//字节写入 返回计时器\u B7;//字节读取 } pc.printf(“%d”,温度)

只要c==100,它就会停止运行 即使在断电后也应保存该值。

在阅读有关的内容时,我在

我把它抄出来并编译了。这应该让你开始

#define BITBAND_SRAM_REF   0x20000000
#define BITBAND_SRAM_BASE  0x22000000
#define BITBAND_SRAM(a,b)  ((BITBAND_SRAM_BASE + (a-BITBAND_SRAM_REF)*32 + (b*4))) // Convert SRAM address
#define BITBAND_PERI_REF   0x40000000
#define BITBAND_PERI_BASE  0x42000000
#define BITBAND_PERI(a,b)  ((BITBAND_PERI_BASE + (a-BITBAND_PERI_REF)*32  + (b*4))) // Convert PERI address
#define MAILBOX            0x20004000
#define TIMER              0x40004000 // Mailbox bit 0
#define MBX_B0             *((volatile unsigned int*)(BITBAND_SRAM(MAILBOX,0))) // Mailbox bit 7
#define MBX_B7             *((volatile unsigned int*)(BITBAND_SRAM(MAILBOX,7))) // Timer bit 0
#define TIMER_B0           *((volatile unsigned char*)(BITBAND_PERI(TIMER,0)))  // Timer bit 7
#define TIMER_B7           *((volatile unsigned char*)(BITBAND_PERI(TIMER,7)))

int main(void)
{
    unsigned int temp = 0;

    MBX_B0 = 1;      // Word write    
    temp = MBX_B7;   // Word read    
    TIMER_B0 = temp; // Byte write    
    return TIMER_B7; // Byte read
}
有人能向我解释一下我如何将数字5存储在SRAM中并再次读取吗

在上面的示例代码中,
temp
位于RAM中

如果您现在不关心使用位绑定,只需声明一个变量
intx=5
即可将数字5存储在RAM中。

在阅读有关的内容时,我在

我把它抄出来并编译了。这应该让你开始

#define BITBAND_SRAM_REF   0x20000000
#define BITBAND_SRAM_BASE  0x22000000
#define BITBAND_SRAM(a,b)  ((BITBAND_SRAM_BASE + (a-BITBAND_SRAM_REF)*32 + (b*4))) // Convert SRAM address
#define BITBAND_PERI_REF   0x40000000
#define BITBAND_PERI_BASE  0x42000000
#define BITBAND_PERI(a,b)  ((BITBAND_PERI_BASE + (a-BITBAND_PERI_REF)*32  + (b*4))) // Convert PERI address
#define MAILBOX            0x20004000
#define TIMER              0x40004000 // Mailbox bit 0
#define MBX_B0             *((volatile unsigned int*)(BITBAND_SRAM(MAILBOX,0))) // Mailbox bit 7
#define MBX_B7             *((volatile unsigned int*)(BITBAND_SRAM(MAILBOX,7))) // Timer bit 0
#define TIMER_B0           *((volatile unsigned char*)(BITBAND_PERI(TIMER,0)))  // Timer bit 7
#define TIMER_B7           *((volatile unsigned char*)(BITBAND_PERI(TIMER,7)))

int main(void)
{
    unsigned int temp = 0;

    MBX_B0 = 1;      // Word write    
    temp = MBX_B7;   // Word read    
    TIMER_B0 = temp; // Byte write    
    return TIMER_B7; // Byte read
}
有人能向我解释一下我如何将数字5存储在SRAM中并再次读取吗

在上面的示例代码中,
temp
位于RAM中


如果您现在不关心使用位绑定,只需声明一个变量
int x=5
即可将数字5存储在RAM中。

编辑,您的问题会完全改变答案,因为您对SRAM写入完全不感兴趣,只对闪存/eeprom

因此,在这个答案中添加一个主要部分,您的评论在这里是至关重要的:


但即使在断电后,是否仍存储了该值?这不是SRAM的功能吗 你会用它来代替普通的RAM吗?RAM=没有电源时失去价值, SRAM=无电源时保持值

SRAM表示静态RAM,RAM表示随机存取存储器。现在,根据这个定义,RAM可以安全地用于ROM(只读存储器)之类的东西,因为随机部分与寻址有关,我可以寻址我想要的任何随机地址,或者我只能按照一些规则使用一个接一个的线性地址来读这个东西

约定是ROM是非易失性的,RAM是易失性的,这是这里的相关术语。ROM的实现从技术上讲不是只读的,PROM是可编程的,这意味着可写的,所以有点打破了术语EPROM的电气可编程性,EEPROM是电气可擦除和可编程的。闪存是一种较新的技术,可电擦除、可编程rom或非易失性存储器

从这个意义上讲,挥发性意味着它能够或不能在一个电力循环中生存。volaitle意味着它不能,而非volatile意味着它可以

SRAM中的S是静态的,这一术语意味着它可能存活下来,特别是当你学习DRAM时。D表示动态的,假设一个在电源循环中存活下来,另一个没有存活下来是完全正确的,但不幸的是,这不是他们所指的。相反,在这两种情况下,它们都与保持通电的内存有关,它们都是易失性内存。去维基百科上查这些。静态使用四个晶体管,比如说,在一个经典的触发器实现中,两个带反馈的门,你写的位高或低,只要电源不关闭,它就保持它不会忘记的值(只要电源保持打开)。虽然DRAM使用一个晶体管,并且在某种程度上严重依赖于晶体管中的电容,有点像一个蹩脚的可充电电池,你想让它记住一个1,你必须给它充电,它会快速放电(以毫秒为单位),所以你必须不断提醒它是1或0(刷新)

静态ram是静态的,因为我们只需告诉它一次,它就会记住,动态ram是动态的,因为我们告诉dram系统该位是什么,作为一个系统,我们必须不断提醒它,这是通过读取该位,然后重新编程/以一定的频率对该位充电来实现的

DRAM价格便宜,可以将四倍于比特数的数据封装到相同数量的晶体管中,SRAM速度快,没有复杂的开销,也没有刷新周期,它只是门,所以可以像其他门一样快速运行,就像做其他事情(处理指令)的门一样快

微控制器将在其ROM、PROM、EEPROM或闪存中具有某种形式的非易失性存储器(现在有各种类型)。有时您同时拥有闪存和eeprom,eeprom用于您可能需要的东西,有时出于反向兼容性的原因,他们有一个eeprom遗留接口,但实际上是使用主闪存进行存储。在任何情况下,您都必须查看您的芯片和/或芯片系列的文档。如今,在应用程序中能够写入片内非易失性存储器(eeprom/flash)是很常见的(尽管有许多例外)。文档会告诉你怎么做

这一切都很好,但一些免费的建议是,如果你做错了,你可以在几个小时或几天内磨掉你的闪光灯……事实上……这个部分可能会被毁掉。理想情况下,您希望电路板上的支持能够检测到电源下降,同时具有足够的大容量电容或电池或两者,以使电路板/设备保持足够长的活动时间,以满足最坏情况下保存非易失性信息所需的时间(理想情况下,首先确认值已更改,否则不要烧掉擦除周期)。实现起来非常简单,但仍比磨损闪存要好

关于如何不磨损闪存,有很多解决方案和意见,可悲的是,一些闪存硬件具有写入均衡的逻辑,如果同时使用软件和硬件
#define MBX_B0             *((volatile unsigned int*)(BITBAND_SRAM(MAILBOX,0)))
#define MAILBOX            0x20004000
#define BITBAND_SRAM(a,b)  ((BITBAND_SRAM_BASE + (a-BITBAND_SRAM_REF)*32 + (b*4)))
#define BITBAND_SRAM_BASE  0x22000000
#define BITBAND_SRAM_REF   0x20000000
0x22000000+(0x20004000-0x20000000)*32 + (0*4)

= 0x22080000
MBX_B0 = 1;
#define SOME_ADD *((volatile unsigned int*)(0x20001234)
unsigned int x;
SOME_ADD = 5;
x = SOME_ADD;
#define BITBAND_SRAM_REF   0x20000000
#define BITBAND_SRAM_BASE  0x22000000
#define BITBAND_SRAM(a,b)  ((BITBAND_SRAM_BASE + (a-BITBAND_SRAM_REF)*32 + (b*4)))
#define MAILBOX            0x20004000
#define MBX_B0             *((volatile unsigned int*)(BITBAND_SRAM(MAILBOX,0)))

#define SOME_ADD *((volatile unsigned int*)(0x20001234))

unsigned int fun ( void )
{
    unsigned int x;

    MBX_B0 = 1;

    SOME_ADD = 5;
    x = SOME_ADD;

}
00000000 <fun>:
   0:   e3a0c001    mov r12, #1
   4:   e3a02005    mov r2, #5
   8:   e59f1010    ldr r1, [pc, #16]   ; 20 <fun+0x20>
   c:   e59f3010    ldr r3, [pc, #16]   ; 24 <fun+0x24>
  10:   e581c000    str r12, [r1]
  14:   e5832234    str r2, [r3, #564]  ; 0x234
  18:   e5933234    ldr r3, [r3, #564]  ; 0x234
  1c:   e12fff1e    bx  lr
  20:   22080000    andcs   r0, r8, #0
  24:   20001000    andcs   r1, r0, r0
unsigned int some_value;
void fun ( void )
{
    some_value = 5;
}
00000004 <fun>:
   4:   e3a02005    mov r2, #5
   8:   e59f3004    ldr r3, [pc, #4]    ; 14 <fun+0x10>
   c:   e5832000    str r2, [r3]
  10:   e12fff1e    bx  lr
  14:   20000000    andcs   r0, r0, r0

Disassembly of section .bss:

20000000 <some_value>:
20000000:   00000000    andeq   r0, r0, r0
void fun ( void )
{
    unsigned int some_value;
    some_value = 5;
}
00000000 <fun>:
   0:   e12fff1e    bx  lr