与C中的STM32芯片内存交互

时间:2017-05-05 12:41:28

标签: c embedded stm32 memory-address jtag

我想与STM32芯片的内存 STM32L476互动,首先要读取并存储其电子签名(MCU_ID)和然后在其内存中写入数据。我正在使用链接到JTAG STM32QFP64ST-LINK套接字 我在C方面做得很好但是真的开始嵌入式编程所以我选择了Atollic Studio IDE,因为它看起来非常完整并且基于Eclipse,我之前已经使用过。

我的问题是我无法找到列出函数,变量等的某种文档。我可以用来与芯片进行交互。我搜索了ST网站上提供的几乎所有PDF文件,阅读ST的GitHub,但由于我是初学者,我可能错过了这些信息,因为我不知道我在搜索什么样的内容。

下面的代码是不完整的,完全想象的,但它可以帮助理解我想要做的事情,我想象的是这样:

#define MEMORY_ADRESS_MCU_ID FFFFF // A memory adress ( I should be able to find it in STM32L476 documentation)
#define MEMORY_ADRESS_TO_WRITE FFFF // Same

unsigned extractMCUID() {

   return READ_IN_MEMORY(MEMORY_ADRESS_MCU_ID); // Returns the ID stored in a particular memory adress

}

void writeData(char* d) {

   WRITE_IN_MEMORY(MEMORY_ADRESS_TO_WRITE, d); // Writes data in specified memory adress

}

因此,在这种情况下,甚至更普遍

1)我应该在哪里寻找这样的文件?

2)这些功能和变量是否会根据我正在处理的STM32芯片而改变?

3)如果不在StackExchange上,我在哪里可以找到 1) 2)的答案?

2 个答案:

答案 0 :(得分:1)

STM为每个MCU发布了几种类型的文档,我很难猜测哪个文档将包含我正在寻找的信息。所以我在文档中搜索相关的关键词,直到我缩小信息范围。最重要的两个文件是数据表和参考手册,所以我总是从它们开始。

在这种情况下,我开始在Datasheet搜索" MCU_ID"什么都没找到,所以我搜索了更通用的#34; ID"并发现它与更具体的关键字" unique"相关联。我搜索了数据表以获得" unique"但是没有找到寄存器地址信息。然后,我在Reference Manual搜索了"唯一ID"并在第1808页的第49.1节中找到了寄存器的基址。

是的,这样的细节可以从一个STM MCU变为下一个,因此您需要确保使用正确的数据表和参考手册。但是,STM提供了一个名为STM32Cube的硬件抽象层(HAL),它抽象出类似于此的MCU特定细节,并允许您调用更多与MCU无关的通用功能。

编辑:我可能已将您指向错误的ID寄存器。 Clifford在评论中指出,在地址0xE0042000处有一个MCU设备ID寄存器。该MCU器件ID寄存器与Unique器件ID寄存器不同,它在参考手册的第1782页第48.6.1节中有所描述。

答案 1 :(得分:-1)

你可能想看看这里: http://www.openstm32.org

这部分可能会给你一个提示: char in_ccram_buffer[1024] __attribute__((section("ccmram")));

我的AVR代码中有类似内容:

 const uint16_t tempTable[42] __attribute__((section(".eeprom"))) = ...

有魅力。