Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.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
如何查找STM32F103RET的设备id_Stm32_Libopencm3 - Fatal编程技术网

如何查找STM32F103RET的设备id

如何查找STM32F103RET的设备id,stm32,libopencm3,Stm32,Libopencm3,我被告知,每个STM32F103RET设备都带有一个唯一的设备id。如果是这样,检索id的过程是什么?我正在运行一个系统,其中我与多个STM Borad进行通信。要区分每个STM板,我可以使用此唯一Id。 谢谢您可以在中找到此信息。更具体地说,您需要阅读章节30.2唯一设备ID寄存器(96位) 因此,您的设备ID包含在只读寄存器中,称为U\U ID。此寄存器地址为0x1fff7e8。它的长度为96位,因此可以使用3个读取操作读取(例如),每个操作的长度为32位。当然你不能把它放在一个变量里。所以

我被告知,每个STM32F103RET设备都带有一个唯一的设备id。如果是这样,检索id的过程是什么?我正在运行一个系统,其中我与多个STM Borad进行通信。要区分每个STM板,我可以使用此唯一Id。
谢谢

您可以在中找到此信息。更具体地说,您需要阅读章节30.2唯一设备ID寄存器(96位)

因此,您的设备ID包含在只读寄存器中,称为U\U ID。此寄存器地址为
0x1fff7e8
。它的长度为96位,因此可以使用3个读取操作读取(例如),每个操作的长度为32位。当然你不能把它放在一个变量里。所以你应该想办法把它存储在内存中。它可以是数组或结构等

为此,我可能会使用结构,使用参考手册中描述的偏移量:

#包括
结构u_id{
uint16关闭0;
uint16办公室2;
单元32(四);
单元32(8);
};
如何阅读它取决于您(取决于您正在使用的框架,例如,您对此的理解)。一般情况下,我会这样做:

#定义MMIO16(addr)(*(易失性uint16_t*)(addr))
#定义MMIO32(地址)(*(挥发性uint32_t*)(地址))
#定义U_ID 0x1FFF7E8
/*读U_ID寄存器*/
无效uid_读取(结构id*id)
{
id->off0=MMIO16(U_id+0x0);
id->off2=MMIO16(U_id+0x2);
id->off4=MMIO32(U_id+0x4);
id->off8=MMIO32(U_id+0x8);
}
您还需要一个函数来比较两个ID。您可以使用
memcmp()
,也可以使用一些自定义函数。在这种情况下,我更喜欢定制的:

#包括
/*如果ID相同,则返回true*/
bool-uid\u-cmp(结构单元id*id1,结构单元id*id2)
{
返回id1->off0==id2->off0&&
id1->off2==id2->off2&&
id1->off4==id2->off4&&
id1->off8==id2->off8;
}
您可以这样使用它:

int main(无效)
{
结构u_id id1={0x0,0x1,0x2,0x3};
结构u_id id2;
bool相同的id;
uid\u读取(&id2);
相同的\u id=uid\u cmp(&id1和&id2);
printf(“%s\n”,相同的id?“相等”:“不相等”);
返回0;
}
更新 据我了解你的情况:

  • 每个板都应该发送一些到主板上(更具体地说,就是钉在主板上)
  • 一旦主板接收到中断,它将启动传输(请求)到中断产生的主板(可能使用或类似的方式在主板之间通信)
  • 然后客户端板用它的设备ID进行响应
  • 中断是按顺序处理的,因此将逐个获取设备ID
  • 下图说明了I2C总线用于ID传输的情况

    对于单板1,将执行GPIO1中断处理程序;对于单板2,执行GPIO2中断处理程序。因此,您知道需要哪个设备ID。因此,设备ID将一次获取一个。从这里您可以了解如何存储这些ID。我建议使用常规数组:

    struct u_id device_id[2];
    
    下面是显示如何填充此数组的伪代码:

    void gpio1\u isr(void)
    {
    uint8_t i2c_buf[12];
    i2c_-get(i2c_-buf);
    memcpy(&device_id[0],i2c_buf,12);
    }
    无效gpio2_isr(无效)
    {
    uint8_t i2c_buf[12];
    i2c_-get(i2c_-buf);
    memcpy(和设备ID[1],i2c_buf,12);
    }
    
    isr
    代表,与中断处理程序相同)


    如果您确信在主板要求其提供ID时,您的两个客户端板已准备好进行I2C传输,您可以去掉2条GPIO线,只要在需要时使用从主板到客户端的I2C事务即可。

    打开记事本,写下以下内容:

    openocd -f interface/jlink.cfg -f board/olimex_stm32_h103.cfg -c "init" -c "stm32f1x.cpu mdw 0x1FFFF7E8 3" -c "exit"
    
    @pause
    
    然后将其保存为“.bat”文件,然后运行它