C 如何在STm32核子板(mbed)上写入SRAM
我想在芯片上的SRAM中存储一个简单的整数。(皮质M4) 我使用的程序是在线mbed。 我知道SRAM的地址从0x2000 0000开始,芯片有4KB的内存 我已经阅读了数据表和位绑定部分,但这对我来说毫无意义 有人能向我解释一下我如何将数字5存储在SRAM中并再次读取吗 当前代码是这样的(c是一个整数,用户可以通过按钮更改):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;//
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