如何查找STM32F103RET的设备id
我被告知,每个STM32F103RET设备都带有一个唯一的设备id。如果是这样,检索id的过程是什么?我正在运行一个系统,其中我与多个STM Borad进行通信。要区分每个STM板,我可以使用此唯一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位。当然你不能把它放在一个变量里。所以
谢谢您可以在中找到此信息。更具体地说,您需要阅读章节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;
}
更新
据我了解你的情况:
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”文件,然后运行它