STM32F4
[STM32F4xx] Read Unique ID/Flash Size/#REV/Device Signature
트라이문
2018. 9. 6. 19:15
STM32 MCU는 칩마다 각각 다른 96bit(12-Byte)의 고유번호(Unique ID)를 갖고 있다.
이 고유 번호는 종종 쓸모가 있다.
- 1회용 싸구려 소모품이 아닌 이상, 제품 마다 이력 관리를 할 수도 있고,
- 가공 해서 암호를 만들 수도 있으며,
- 무선 장비의 경우에는 맥어드레스라고 하여, 서로 간의 통신할 때 충돌을 방지하는 용도로도 사용할 수 있다.
고유 번호가 없을 경우, 칩마다 각각 플래쉬 메모리에 서로 다른 번호를 만들어서 넣어 줘야 하는데,
여간 불편한 게 아니다.
고유 아이디를 만드려면, 코드에 직접 넣어서 컴파일해서 MCU에 프로그램해서 넣는 방법과
통신을 통해서 프로토콜로 플래쉬의 특정 주소에 써 넣는 방법이 주로 사용될 것이다.
고유 아이디를 만들어서 플래쉬에 쓰는 경우에는,
플래쉬에 썼기 때문에 잘못해서 지워지는 경우가 있을 수 있고,
사람이 하다 보니 중복해서 쓰거나 안 쓰고 넘어가는 경우도 종종 있다.
또한 칩 하나하나 마다 컴파일을 하거나 통신 프로토콜로 아이디를 쓰려면 툴을 사용해야 하고 시간도 많이 걸리니 모든것이 낭비여서, 고유 아이디가 제공된다는 점은 어떻게 보면 큰 장점이다.
STM32F4 MCU 에서 제공된 고유 아이디를 읽으려면, 고유 아이디가 위치한 특정 어드레스에서 값을 읽으면 된다.
아주 간단한 예로 끝내겠다.
다음 예는 유니크 아이디가 위치한 주소(0x1FFF7A10)에서 12바이트를
8비트/16비트/32비트 단위로 읽어서 각각 UART로 출력하는 예이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #define ID_UNIQUE_ADDRESS 0x1FFF7A10 uint8_t i; uint8_t uu_id_8b[12]; uint16_t uu_id_16b[6]; uint32_t uu_id_32b[3]; // 8-bit 12-EA Read for (i=0;i<12;i++) uu_id_8b[i] = *(uint8_t *)(ID_UNIQUE_ADDRESS+i); // 16-bit 6-EA Read for (i=0;i<6;i++) uu_id_16b[i] = *(uint16_t *)(ID_UNIQUE_ADDRESS+i*2); // 32-bit 3-EA Read for (i=0;i<3;i++) uu_id_32b[i] = *(uint32_t *)(ID_UNIQUE_ADDRESS+i*4); printf("UUID[8-Bit] "); for(i=0;i<12;i++) printf(":%02X",uu_id_8b[i]); printf("\n\rUUID[16-Bit] "); for(i=0;i<6;i++) printf(":%04X",uu_id_16b[i]); printf("\n\rUUID[32-Bit] "); for(i=0;i<3;i++) printf(":%08X",uu_id_32b[i]); while(1); | cs |
참고로 다음과 같은 정보도 있다.
읽는 방식은 메뉴얼을 참고로 위의 코드 예를 조금 변경하면 되겠고,
더 자세한 정보는 링크에 가서 코드를 다운 받아서 보면 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | /** * @brief Get STM32F4xx device signature * @note Defined as macro to get maximal response time * @param None * @retval Device signature, bits 11:0 are valid, 15:12 are always 0. * - 0x0413: STM32F405xx/07xx and STM32F415xx/17xx) * - 0x0419: STM32F42xxx and STM32F43xxx * - 0x0423: STM32F401xB/C * - 0x0433: STM32F401xD/E * - 0x0431: STM32F411xC/E */ /** * @brief Get STM32F4xx device revision * @note Defined as macro to get maximal response time * @param None * @retval Device revision value * - 0x1000: Revision A * - 0x1001: Revision Z * - 0x1003: Revision Y * - 0x1007: Revision 1 * - 0x2001: Revision 3 */ #define ID_DBGMCU_IDCODE 0xE0042000 /** * @brief Get STM32F4xx device's flash size in kilo bytes * @note Defined as macro to get maximal response time * @param None * @retval Flash size in kilo bytes */ #define ID_FLASH_ADDRESS 0x1FFF7A22 | cs |
------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------