Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
rc522
星火一号的MFRC522
发布于 2025-05-26 17:50:45 浏览:65
订阅该版
main.c代码 只有这一个代码,使用硬件spi,接口连接正确。         ```c #include
#include
#include
#include "stm32f4xx_hal.h" #define MAX_LEN 16 // 最大数据长度 /* RC522寄存器定义 */ #define PCD_IDLE 0x00 // 空闲状态 #define PCD_AUTHENT 0x0E // 认证状态 #define PCD_TRANSCEIVE 0x0C // 传输状态 /* RC522命令定义 */ #define PICC_REQA 0x26 // 寻卡请求 #define PICC_ANTICOLL1 0x93 // 防冲突级别1 #define PICC_ANTICOLL2 0x95 // 防冲突级别2 /* 函数声明 */ static void RC522_SPI_Config(void); // SPI硬件初始化 void RC522_CS_Enable(void); // 片选使能 void RC522_CS_Disable(void); // 片选禁用 uint8_t SPI_RC522_SendByte(uint8_t byte); // SPI发送单字节 void RC522_WriteReg(uint8_t reg, uint8_t value); // 写寄存器 uint8_t RC522_ReadReg(uint8_t reg); // 读寄存器 void RC522_SetBitMask(uint8_t reg, uint8_t mask); // 设置寄存器位掩码 void RC522_ClearBitMask(uint8_t reg, uint8_t mask); // 清除寄存器位掩码 void RC522_Init(void); // RC522初始化 uint8_t PICC_Request(uint8_t req_code, uint8_t *back_bits); // 寻卡请求 uint8_t PICC_Anticoll(uint8_t *ser_num); // 防冲突获取UID SPI_HandleTypeDef hspi1; // SPI句柄 /** * @brief SPI硬件初始化 * 配置SPI1的引脚和参数 */ static void RC522_SPI_Config(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; // 使能GPIOA和SPI1时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_SPI1_CLK_ENABLE(); // 配置SPI1的SCK、MISO、MOSI引脚为复用推挽输出 GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 配置NSS引脚为推挽输出 GPIO_InitStruct.Pin = GPIO_PIN_4; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 配置SPI1参数 hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; // 主机模式 hspi1.Init.Direction = SPI_DIRECTION_2LINES; // 全双工 hspi1.Init.DataSize = SPI_DATASIZE_8BIT; // 8位数据 hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH; // 时钟极性高 hspi1.Init.CLKPhase = SPI_PHASE_2EDGE; // 第二边沿采样 hspi1.Init.NSS = SPI_NSS_SOFT; // 软件控制NSS hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; // 4分频 hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; // MSB优先 HAL_SPI_Init(&hspi1); } /** * @brief 片选使能 * 拉低CS引脚电平选中RC522 */ void RC522_CS_Enable(void) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); } /** * @brief 片选禁用 * 拉高CS引脚电平取消选中RC522 */ void RC522_CS_Disable(void) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); } /** * @brief SPI发送单字节 * @param byte 要发送的字节 * @return 接收到的字节 */ uint8_t SPI_RC522_SendByte(uint8_t byte) { uint8_t received; HAL_SPI_TransmitReceive(&hspi1, &byte, &received, 1, HAL_MAX_DELAY); return received; } /** * @brief 写寄存器 * @param reg 寄存器地址 * @param value 要写入的值 */ void RC522_WriteReg(uint8_t reg, uint8_t value) { RC522_CS_Enable(); SPI_RC522_SendByte((reg << 1) & 0x7E); // 写命令:地址左移1位,bit0=0 SPI_RC522_SendByte(value); RC522_CS_Disable(); } /** * @brief 读寄存器 * @param reg 寄存器地址 * @return 读取到的值 */ uint8_t RC522_ReadReg(uint8_t reg) { uint8_t value; RC522_CS_Enable(); SPI_RC522_SendByte(((reg << 1) & 0x7E) | 0x80); // 读命令:地址左移1位,bit0=1 value = SPI_RC522_SendByte(0x00); // 发送dummy字节获取返回值 RC522_CS_Disable(); return value; } /** * @brief 设置寄存器位掩码 * @param reg 寄存器地址 * @param mask 要设置的位掩码 */ void RC522_SetBitMask(uint8_t reg, uint8_t mask) { uint8_t tmp = RC522_ReadReg(reg); RC522_WriteReg(reg, tmp | mask); // 或运算设置指定位 } /** * @brief 清除寄存器位掩码 * @param reg 寄存器地址 * @param mask 要清除的位掩码 */ void RC522_ClearBitMask(uint8_t reg, uint8_t mask) { uint8_t tmp = RC522_ReadReg(reg); RC522_WriteReg(reg, tmp & (~mask)); // 与运算清除指定位 } /** * @brief RC522初始化 * 配置RC522的寄存器和工作模式 */ void RC522_Init(void) { RC522_SPI_Config(); // 软复位 RC522_WriteReg(0x01, 0x0F); HAL_Delay(50); // 定时器配置 RC522_WriteReg(0x2A, 0x8D); // TModeReg RC522_WriteReg(0x2B, 0x3E); // TPrescalerReg RC522_WriteReg(0x2D, 30); // TReloadRegH RC522_WriteReg(0x2C, 0); // TReloadRegL RC522_WriteReg(0x15, 0x40); // TxASKReg RC522_WriteReg(0x11, 0x3D); // ModeReg // 开启天线 RC522_SetBitMask(0x14, 0x03); } /** * @brief 寻卡请求 * @param req_code 请求码(PICC_REQA或PICC_WUPA) * @param back_bits 返回的位数 * @return 1-成功 0-失败 */ uint8_t PICC_Request(uint8_t req_code, uint8_t *back_bits) { uint8_t status; // 清除中断标志 RC522_WriteReg(0x0D, 0x07); // 写入命令 RC522_WriteReg(0x02, req_code); // 发送命令 RC522_WriteReg(0x01, PCD_TRANSCEIVE); RC522_SetBitMask(0x0D, 0x80); // 等待命令完成 uint16_t i = 2000; uint8_t n; do { n = RC522_ReadReg(0x04); i--; } while ((i!=0) && !(n&0x01)); if (i == 0 || (RC522_ReadReg(0x06) & 0x1B)) { status = 0; // 超时或错误 } else { *back_bits = RC522_ReadReg(0x0C) & 0x07; status = 1; // 成功 } // 返回IDLE状态 RC522_WriteReg(0x01, PCD_IDLE); return status; } /** * @brief 防冲突获取UID * @param ser_num 返回的UID(4字节) * @return 1-成功 0-失败 */ uint8_t PICC_Anticoll(uint8_t *ser_num) { uint8_t status; uint8_t i; // 清除中断标志 RC522_WriteReg(0x0D, 0x07); // 防冲突命令 RC522_WriteReg(0x02, PICC_ANTICOLL1); RC522_WriteReg(0x03, 0x20); // 发送命令 RC522_WriteReg(0x01, PCD_TRANSCEIVE); RC522_SetBitMask(0x0D, 0x80); // 等待命令完成 uint16_t i_wait = 2000; uint8_t n; do { n = RC522_ReadReg(0x04); i_wait--; } while ((i_wait!=0) && !(n&0x01)); if (i_wait != 0) { if (!(RC522_ReadReg(0x06) & 0x1B)) { // 读取UID for (i = 0; i < 4; i++) { ser_num[i] = RC522_ReadReg(0x09 + i); } // 校验 uint8_t check = 0; for (i = 0; i < 4; i++) { check ^= ser_num[i]; } if (check == RC522_ReadReg(0x0D)) { status = 1; // 校验成功 } } } // 返回IDLE状态 RC522_WriteReg(0x01, PCD_IDLE); return status; } /** * @brief 主函数 * 初始化RC522并循环检测卡片 */ int main(void) { HAL_Init(); SystemClock_Config(); RC522_Init(); rt_kprintf("RC522 Init OK\n"); uint8_t serNum[5]; // 存储UID uint8_t backBits; // 存储返回位数 while (1) { // 寻卡请求 if (PICC_Request(PICC_REQA, &backBits) == 1) { // 防冲突获取UID if (PICC_Anticoll(serNum) == 1) { rt_kprintf("Card UID: %02X %02X %02X %02X\n", serNum[0], serNum[1], serNum[2], serNum[3]); } } HAL_Delay(500); // 500ms检测一次 } } ``` 
查看更多
3
个回答
默认排序
按发布时间排序
RTT_逍遥
认证专家
3天前
https://github.com/supperthomas
格式调整一下。用markdown语法。
加菲不如咖啡
3天前
这家伙很懒,什么也没写!
```c #include
#include
#include
#include "stm32f4xx_hal.h" #define MAX_LEN 16 // 最大数据长度 /* RC522寄存器定义 */ #define PCD_IDLE 0x00 // 空闲状态 #define PCD_AUTHENT 0x0E // 认证状态 #define PCD_TRANSCEIVE 0x0C // 传输状态 /* RC522命令定义 */ #define PICC_REQA 0x26 // 寻卡请求 #define PICC_ANTICOLL1 0x93 // 防冲突级别1 #define PICC_ANTICOLL2 0x95 // 防冲突级别2 #define PICC_READ 0x30 // 读取数据块 #define PICC_WRITE 0xA0 // 写入数据块 /* 函数声明 */ static void RC522_SPI_Config(void); // SPI硬件初始化 void RC522_CS_Enable(void); // 片选使能 void RC522_CS_Disable(void); // 片选禁用 uint8_t SPI_RC522_SendByte(uint8_t byte); // SPI发送单字节 void RC522_WriteReg(uint8_t reg, uint8_t value); // 写寄存器 uint8_t RC522_ReadReg(uint8_t reg); // 读寄存器 void RC522_SetBitMask(uint8_t reg, uint8_t mask); // 设置寄存器位掩码 void RC522_ClearBitMask(uint8_t reg, uint8_t mask); // 清除寄存器位掩码 void RC522_Init(void); // RC522初始化 uint8_t PICC_Request(uint8_t req_code, uint8_t *back_bits); // 寻卡请求 uint8_t PICC_Anticoll(uint8_t *ser_num); // 防冲突获取UID SPI_HandleTypeDef hspi1; // SPI句柄 /** * @brief SPI硬件初始化 * 配置SPI1的引脚和参数 */ static void RC522_SPI_Config(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; // 使能GPIOA和SPI1时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_SPI1_CLK_ENABLE(); // 配置SPI1的SCK、MISO、MOSI引脚为复用推挽输出 GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 配置NSS引脚为推挽输出 GPIO_InitStruct.Pin = GPIO_PIN_4; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 配置SPI1参数 hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; // 主机模式 hspi1.Init.Direction = SPI_DIRECTION_2LINES; // 全双工 hspi1.Init.DataSize = SPI_DATASIZE_8BIT; // 8位数据 hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH; // 时钟极性高 hspi1.Init.CLKPhase = SPI_PHASE_2EDGE; // 第二边沿采样 hspi1.Init.NSS = SPI_NSS_SOFT; // 软件控制NSS hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; // 4分频 hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; // MSB优先 HAL_SPI_Init(&hspi1); } /** * @brief 片选使能 * 拉低CS引脚电平选中RC522 */ void RC522_CS_Enable(void) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); } /** * @brief 片选禁用 * 拉高CS引脚电平取消选中RC522 */ void RC522_CS_Disable(void) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); } /** * @brief SPI发送单字节 * @param byte 要发送的字节 * @return 接收到的字节 */ uint8_t SPI_RC522_SendByte(uint8_t byte) { uint8_t received; HAL_SPI_TransmitReceive(&hspi1, &byte, &received, 1, HAL_MAX_DELAY); return received; } /** * @brief 写寄存器 * @param reg 寄存器地址 * @param value 要写入的值 */ void RC522_WriteReg(uint8_t reg, uint8_t value) { RC522_CS_Enable(); SPI_RC522_SendByte((reg << 1) & 0x7E); // 写命令:地址左移1位,bit0=0 SPI_RC522_SendByte(value); RC522_CS_Disable(); } /** * @brief 读寄存器 * @param reg 寄存器地址 * @return 读取到的值 */ uint8_t RC522_ReadReg(uint8_t reg) { uint8_t value; RC522_CS_Enable(); SPI_RC522_SendByte(((reg << 1) & 0x7E) | 0x80); // 读命令:地址左移1位,bit0=1 value = SPI_RC522_SendByte(0x00); // 发送dummy字节获取返回值 RC522_CS_Disable(); return value; } /** * @brief 设置寄存器位掩码 * @param reg 寄存器地址 * @param mask 要设置的位掩码 */ void RC522_SetBitMask(uint8_t reg, uint8_t mask) { uint8_t tmp = RC522_ReadReg(reg); RC522_WriteReg(reg, tmp | mask); // 或运算设置指定位 } /** * @brief 清除寄存器位掩码 * @param reg 寄存器地址 * @param mask 要清除的位掩码 */ void RC522_ClearBitMask(uint8_t reg, uint8_t mask) { uint8_t tmp = RC522_ReadReg(reg); RC522_WriteReg(reg, tmp & (~mask)); // 与运算清除指定位 } /** * @brief RC522初始化 * 配置RC522的寄存器和工作模式 */ void RC522_Init(void) { RC522_SPI_Config(); // 软复位 RC522_WriteReg(0x01, 0x0F); HAL_Delay(50); // 定时器配置 RC522_WriteReg(0x2A, 0x8D); // TModeReg RC522_WriteReg(0x2B, 0x3E); // TPrescalerReg RC522_WriteReg(0x2D, 30); // TReloadRegH RC522_WriteReg(0x2C, 0); // TReloadRegL RC522_WriteReg(0x15, 0x40); // TxASKReg RC522_WriteReg(0x11, 0x3D); // ModeReg // 开启天线 RC522_SetBitMask(0x14, 0x03); } /** * @brief 寻卡请求 * @param req_code 请求码(PICC_REQA或PICC_WUPA) * @param back_bits 返回的位数 * @return 1-成功 0-失败 */ uint8_t PICC_Request(uint8_t req_code, uint8_t *back_bits) { uint8_t status; // 清除中断标志 RC522_WriteReg(0x0D, 0x07); // 写入命令 RC522_WriteReg(0x02, req_code); // 发送命令 RC522_WriteReg(0x01, PCD_TRANSCEIVE); RC522_SetBitMask(0x0D, 0x80); // 等待命令完成 uint16_t i = 2000; uint8_t n; do { n = RC522_ReadReg(0x04); i--; } while ((i!=0) && !(n&0x01)); if (i == 0 || (RC522_ReadReg(0x06) & 0x1B)) { status = 0; // 超时或错误 } else { *back_bits = RC522_ReadReg(0x0C) & 0x07; status = 1; // 成功 } // 返回IDLE状态 RC522_WriteReg(0x01, PCD_IDLE); return status; } /** * @brief 防冲突获取UID * @param ser_num 返回的UID(4字节) * @return 1-成功 0-失败 */ uint8_t PICC_Anticoll(uint8_t *ser_num) { uint8_t status; uint8_t i; // 清除中断标志 RC522_WriteReg(0x0D, 0x07); // 防冲突命令 RC522_WriteReg(0x02, PICC_ANTICOLL1); RC522_WriteReg(0x03, 0x20); // 发送命令 RC522_WriteReg(0x01, PCD_TRANSCEIVE); RC522_SetBitMask(0x0D, 0x80); // 等待命令完成 uint16_t i_wait = 2000; uint8_t n; do { n = RC522_ReadReg(0x04); i_wait--; } while ((i_wait!=0) && !(n&0x01)); if (i_wait != 0) { if (!(RC522_ReadReg(0x06) & 0x1B)) { // 读取UID for (i = 0; i < 4; i++) { ser_num[i] = RC522_ReadReg(0x09 + i); } // 校验 uint8_t check = 0; for (i = 0; i < 4; i++) { check ^= ser_num[i]; } if (check == RC522_ReadReg(0x0D)) { status = 1; // 校验成功 } } } // 返回IDLE状态 RC522_WriteReg(0x01, PCD_IDLE); return status; } /*卡片认证*/ uint8_t PICC_Authenticate(uint8_t block_addr, uint8_t *key, uint8_t *ser_num) { uint8_t status; uint8_t buffer[6]; // 清除中断标志 RC522_WriteReg(0x0D, 0x07); // 写入密钥 for (int i = 0; i < 6; i++) { RC522_WriteReg(0x09 + i, key[i]); } // 写入卡片序列号 for (int i = 0; i < 4; i++) { RC522_WriteReg(0x09 + 6 + i, ser_num[i]); } // 发送认证命令 RC522_WriteReg(0x02, PCD_AUTHENT); RC522_WriteReg(0x03, block_addr); RC522_WriteReg(0x01, PCD_TRANSCEIVE); RC522_SetBitMask(0x0D, 0x80); // 等待命令完成 uint16_t i = 2000; uint8_t n; do { n = RC522_ReadReg(0x04); i--; } while ((i != 0) && !(n & 0x01)); if (i == 0 || (RC522_ReadReg(0x06) & 0x1B)) { status = 0; // 超时或错误 } else { status = 1; // 成功 } // 返回IDLE状态 RC522_WriteReg(0x01, PCD_IDLE); return status; } /*读取数据块*/ uint8_t PICC_ReadBlock(uint8_t block_addr, uint8_t *buffer, uint8_t *back_bits) { uint8_t status; // 清除中断标志 RC522_WriteReg(0x0D, 0x07); // 写入块地址 RC522_WriteReg(0x02, PICC_READ); RC522_WriteReg(0x03, block_addr); // 发送读取命令 RC522_WriteReg(0x01, PCD_TRANSCEIVE); RC522_SetBitMask(0x0D, 0x80); // 等待命令完成 uint16_t i = 2000; uint8_t n; do { n = RC522_ReadReg(0x04); i--; } while ((i != 0) && !(n & 0x01)); if (i == 0 || (RC522_ReadReg(0x06) & 0x1B)) { status = 0; // 超时或错误 } else { *back_bits = RC522_ReadReg(0x0C) & 0x07; for (int i = 0; i < *back_bits; i++) { buffer[i] = RC522_ReadReg(0x09 + i); } status = 1; // 成功 } // 返回IDLE状态 RC522_WriteReg(0x01, PCD_IDLE); return status; } /*写入数据块*/ uint8_t PICC_WriteBlock(uint8_t block_addr, uint8_t *buffer) { uint8_t status; // 清除中断标志 RC522_WriteReg(0x0D, 0x07); // 写入块地址 RC522_WriteReg(0x02, PICC_WRITE); RC522_WriteReg(0x03, block_addr); // 写入数据 for (int i = 0; i < 16; i++) { RC522_WriteReg(0x09 + i, buffer[i]); } // 发送写入命令 RC522_WriteReg(0x01, PCD_TRANSCEIVE); RC522_SetBitMask(0x0D, 0x80); // 等待命令完成 uint16_t i = 2000; uint8_t n; do { n = RC522_ReadReg(0x04); i--; } while ((i != 0) && !(n & 0x01)); if (i == 0 || (RC522_ReadReg(0x06) & 0x1B)) { status = 0; // 超时或错误 } else { status = 1; // 成功 } // 返回IDLE状态 RC522_WriteReg(0x01, PCD_IDLE); return status; } /*选择卡片*/ uint8_t PICC_Select(uint8_t *ser_num) { uint8_t status; uint8_t buffer[7]; // 清除中断标志 RC522_WriteReg(0x0D, 0x07); // 写入选择命令 RC522_WriteReg(0x02, PICC_ANTICOLL1); RC522_WriteReg(0x03, 0x70); // 写入卡片序列号 for (int i = 0; i < 4; i++) { RC522_WriteReg(0x09 + i, ser_num[i]); } // 发送选择命令 RC522_WriteReg(0x01, PCD_TRANSCEIVE); RC522_SetBitMask(0x0D, 0x80); // 等待命令完成 uint16_t i = 2000; uint8_t n; do { n = RC522_ReadReg(0x04); i--; } while ((i != 0) && !(n & 0x01)); if (i == 0 || (RC522_ReadReg(0x06) & 0x1B)) { status = 0; // 超时或错误 } else { status = 1; // 成功 } // 返回IDLE状态 RC522_WriteReg(0x01, PCD_IDLE); return status; } /** * @brief 主函数 * 初始化RC522并循环检测卡片 */ int main(void) { HAL_Init(); SystemClock_Config(); RC522_Init(); rt_kprintf("RC522 Init OK\n"); uint8_t serNum[5]; // 存储UID uint8_t backBits; // 存储返回位数 uint8_t key[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // 默认密钥 uint8_t blockData[16] = {0}; // 存储块数据 while (1) { // 寻卡请求 if (PICC_Request(PICC_REQA, &backBits) == 1) { // 防冲突获取UID if (PICC_Anticoll(serNum) == 1) { rt_kprintf("Card UID: %02X %02X %02X %02X\n", serNum[0], serNum[1], serNum[2], serNum[3]); // 选择卡片 if (PICC_Select(serNum) == 1) { rt_kprintf("Card selected.\n"); // 认证卡片 if (PICC_Authenticate(1, key, serNum) == 1) { rt_kprintf("Authentication successful.\n"); // 读取数据块 if (PICC_ReadBlock(1, blockData, &backBits) == 1) { rt_kprintf("Block data: "); for (int i = 0; i < 16; i++) { rt_kprintf("%02X ", blockData[i]); } rt_kprintf("\n"); } else { rt_kprintf("Failed to read block.\n"); } } else { rt_kprintf("Authentication failed.\n"); } } else { rt_kprintf("Failed to select card.\n"); } } } HAL_Delay(500); // 500ms检测一次 } } ```
三世执戟
3天前
这家伙很懒,什么也没写!
看了半天没看到在哪里描述问题? 是SPI不通?接了逻辑分析仪看了没? 还是芯片读不到卡?射频那边检查了没有,有没有信号发出? 522的状态寄存器显示啥?
撰写答案
登录
注册新账号
关注者
0
被浏览
65
关于作者
加菲不如咖啡
这家伙很懒,什么也没写!
提问
2
回答
2
被采纳
0
关注TA
发私信
相关问题
1
rc522 软件包 问题
2
onenet软件包和RC522冲突
3
瑞萨RA6M4使用RC522软件包示例无反馈
4
MFRCC522适配星火一号stm32F407
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
6
五分钟玩转RT-Thread新社区
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
基于RT-Thread的STM32F4开发第九讲——硬件看门狗(IWDG)
2
STM32内存扩展,SRAM-RMC
3
基于RT-Thread的STM32F4开发第八讲——SPI(普通、DMA、SFUD)
4
artpi2的drv-eth修改使用eth与设备驱动学习笔记
5
【面向零基础】基于星火1号开发板从头学习基于RT-Thread的嵌入式开发 第一讲
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
Bootloader
AT
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
FAL
RTC
rt-smart
I2C_IIC
cubemx
UART
ota在线升级
ESP8266
WIZnet_W5500
BSP
PWM
packages_软件包
flash
freemodbus
潘多拉开发板_Pandora
GD32
ADC
定时器
编译报错
flashDB
keil_MDK
ulog
socket
rt_mq_消息队列_msg_queue
中断
Debug
SFUD
msh
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
8
个答案
4
次被采纳
xiaorui
4
个答案
1
次被采纳
tjrong
2
个答案
1
次被采纳
yans
2
个答案
1
次被采纳
alight
2
个答案
1
次被采纳
本月文章贡献
Pai同学
10
篇文章
12
次点赞
Rick98
3
篇文章
12
次点赞
RTT_逍遥
2
篇文章
11
次点赞
WenShan
2
篇文章
2
次点赞
加缪
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部