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




------------------------------------------------------------------------------------------------





------------------------------------------------------------------------------------------------




+ Recent posts