RFID系统之激活RC522
STM32+RC522实现一个简单的读IC的唯一识别号的功能,使用的时STM32F103C8T6和RC522两块板子,使用STM32CubeMX创建项目,Keil 5编辑项目。
一、STM32CubeMX 配置清单
1. 新建工程
- 芯片选择 STM32F103C8Tx(LQFP48 封装)
2. System Core
| 配置项 | 值 | 原因 |
|---|---|---|
| SYS → Debug | Serial Wire |
⚠️ 必选!否则 ST-Link 烧录一次后芯片被锁 |
| RCC → HSE | Crystal/Ceramic Resonator |
使用板载 8MHz 晶振 |
3. 时钟树(Clock Configuration 页)
- HSE = 8MHz → PLL Source = HSE → ×9 → SYSCLK = 72MHz
- AHB = 72MHz、APB1 = 36MHz(÷2)、APB2 = 72MHz
4. Connectivity → SPI1(Full-Duplex Master)
| 参数 | 值 | 关键说明 |
|---|---|---|
| Frame Format | Motorola | |
| Data Size | 8 Bits | |
| First Bit | MSB First | RC522 寄存器地址高位在前 |
| Prescaler | 32(APB2 72MHz÷32 = 2.25MHz) | RC522 手册上限 10MHz,调试期保守些更稳 |
| CPOL | Low | 模式 0 |
| CPHA | 1 Edge | 模式 0 |
| NSS | Software | 片选必须手动拉低/拉高,不能用硬件 NSS |
| CRC | Disabled |
5. GPIO 手动配置(在芯片图上点引脚)
| 引脚 | 配置 | 说明 |
|---|---|---|
PA3 → GPIO_Output |
上电默认 High | 接 RC522 的 RST(驱动里会主动复位) |
PA4 → GPIO_Output |
上电默认 High | 接 RC522 的 SDA/NSS,高电平=不选中 |
| PA5/PA6/PA7 | SPI1 自动分配(SCK/MISO/MOSI) | |
| PA9/PA10 | USART1 自动分配(TX/RX) |
6. Connectivity → USART1
- Connectivity → USART1 → Mode 选 Asynchronous
Parameter Settings:
- Baud Rate:115200
- Word Length:8 Bits
- Parity:None
- Stop Bits:1
7. Project Manager
- Toolchain/IDE =
MDK-ARM V5 - Code Generator 页:勾选 "Generate peripheral initialization as a pair of .c/.h files"(推荐,spi.c/usart.c 分开便于阅读)
- Minimal Heap Size =
0x200,Stack =0x400(printf 需要一定栈空间)
点击 GENERATE CODE。
二、Keil5 打开后:添加文件
1.
创建驱动文件rc522.c和rc522.h
rc522.h文件 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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/* ==================== Pin Definitions ==================== */
/* Modify these to match your CubeMX GPIO configuration */
/* ==================== RC522 Register Addresses ==================== */
/* ==================== PCD Commands ==================== */
/* ==================== PICC Commands ==================== */
/* ==================== Function Declarations ==================== */
void RC522_Init(void);
uint8_t RC522_ReadUID(uint8_t *uid);
/* Low-level functions; may be useful during debugging */
void RC522_WriteReg(uint8_t addr, uint8_t value);
uint8_t RC522_ReadReg(uint8_t addr);
void RC522_SetBitMask(uint8_t addr, uint8_t mask);
void RC522_ClearBitMask(uint8_t addr, uint8_t mask);
void RC522_AntennaOn(void);
void RC522_AntennaOff(void);
void RC522_Reset(void);
uint8_t RC522_ToCard(uint8_t command, uint8_t *sendData, uint8_t sendLen,
uint8_t *recvData, uint16_t *recvLen);
uint8_t RC522_Request(uint8_t reqMode, uint8_t *tagType);
uint8_t RC522_Anticoll(uint8_t *uid);
void RC522_CalcCRC(uint8_t *data, uint8_t len, uint8_t *crcOut);
/* Single-shot WUPA probe; always drains FIFO. rx[8] out, returns status */
uint8_t RC522_DebugRequest(uint8_t *rx, uint8_t *err, uint8_t *lastBits, uint8_t *level);
rc522.c文件
1 |
|
2. 添加驱动组
把驱动文件夹拷进工程(在项目根目录的MDK-ARM\目录创建rc522_driver\文件夹并进入,创建两个文件
rc522.c / rc522.h),然后: - Project 窗口 →
右键 Target → Add Group → 命名 rc522_driver → 组内
Add Existing Files 加入 rc522.c
3. 添加头文件搜索路径
- 魔法棒 → C/C++ → Include Paths →
添加
..\MDK-ARM\rc522_driver(相对路径按工程文件位置写)
4. 勾选 MicroLIB
- 魔法棒 → Target → 勾选 ✅ Use MicroLIB
- 因为我们用自定义
fputc重定向 printf,MicroLIB 可避免标准库半主机(semihosting)导致的卡死
三、需要修改的文件(只有 main.c)
1. printf 重定向(USER CODE 0 区,main.c:62)
1 | /* USER CODE BEGIN 0 */ |
2. 初始化(USER CODE 2 区)
⚠️ 重点:所有用户初始化代码必须写在
/* USER CODE BEGIN 2 */ 和
/* USER CODE END 2 */ 之间。
1
2
3
4
5/* USER CODE BEGIN 2 */
RC522_Init();
printf("Version: 0x%02X\r\n", RC522_ReadReg(RC522_REG_VERSION));
printf("Waiting for 13.56MHz ISO14443A tag...\r\n");
/* USER CODE END 2 */
3. 主循环(USER CODE WHILE 区,当前 main.c:123 的最终形态)
1 | /* USER CODE BEGIN WHILE */ |
注意:
RC522_Init()的调用、RC522 的头文件引用等,都必须套在USER CODE BEGIN/END注释对内,CubeMX 重新生成时只保留这些区内的内容。