本示例演示了在 STM32F103CBT6 开发板上,使用 Semtech Radio Access Controller (RAC) 驱动 LR2021 或 Ra-11 射频芯片实现 LoRa 双向 Ping-Pong 通信。
git clone https://github.com/Ai-Thinker-Open/ra11-ra20.git Ra-20_Ra-11
cd Ra-20_Ra-11
git submodule update --init --recursive # 如果仓库包含子模块
sudo apt update
# 1. ARM 交叉编译工具链(推荐 10.x 或 12.x)
sudo apt install -y gcc-arm-none-eabi binutils-arm-none-eabi gdb-multiarch
# 2. 构建系统
sudo apt install -y cmake ninja-build
# 3. ST-Link 烧录与调试工具
sudo apt install -y stlink-tools
# 4. Python3 + pyserial(用于 debug.py 串口监视和烧录辅助脚本)
sudo apt install -y python3 python3-pip
pip3 install --user pyserial
# 5. Git(通常已预装)
sudo apt install -y git
运行以下指令确定工具是否均已成功安装
arm-none-eabi-gcc --version
cmake --version # 要求 ≥ 3.16
ninja --version
st-info --version
python3 -c "import serial; print('pyserial OK')"
如果 arm-none-eabi-gcc 不在默认 PATH 中,请导出工具链目录:
export ARM_GNU_BIN=/usr/bin
# 或
export ARM_GNU_BIN=/opt/gcc-arm-none-eabi-10/bin
建议将上述命令加入 ~/.bashrc 或 ~/.zshrc。
~/project/stm32_project/semtech_chip_driver/Ra-20_Ra-11/
├── examples/ # CMake 入口(包含readme文档)
├── smtc_rac_lib/
├── examples/smtc_hal_f1/ # F103-specific HAL
├── build/ # 编译生成的中间文件以及最终文件 (可删除)
└── ...
rm -Rf build/ ; \
cmake -L -S examples \
-B build \
-DCMAKE_BUILD_TYPE=MinSizeRel \
-DLEGACY_EVK_LR20XX=true \
-DBOARD=STM32F103CB \
-DRAC_RADIO=lr1121 \
-G Ninja ; \
cmake --build build --target ping_pong
| 射频芯片 | 编译参数示例 | 说明 |
|---|---|---|
| Ra-20 | -DRAC_RADIO=lr2021 -DLEGACY_EVK_LR20XX=true |
老版 EVK 引脚定义 |
| Ra-11 | -DRAC_RADIO=lr1121 |
标准 LR11xx 引脚 |
| STM32F103CB | -DBOARD=STM32F103CB ... |
使用 STM32F103CB HAL |
编译成功后在 build/ 目录下会生成:
ping_pong.elfping_pong.hexping_pong.bin| STM32F103CBT6 引脚 | 射频芯片引脚 | 功能 | 备注 |
|---|---|---|---|
| PA4 | NSS / CS | SPI 片选 | — |
| PA5 | SCK | SPI 时钟 | — |
| PA6 | MISO | SPI MISO | — |
| PA7 | MOSI | SPI MOSI | — |
| PB14 | NRST | 射频复位 | 低电平有效 |
| PB1 | DIO1 / DIOX | 射频中断 | 上升沿触发 |
| PA0 | BUSY | 射频忙信号 | LR11xx / LR20xx |
| PA8 | — | LED_TX | 发送时亮 |
| PB15 | — | LED_RX | 接收时亮 |
| PA9 | UART_TX | 调试串口 | 115200 8N1 |
| PA10 | UART_RX | 调试串口 | — |
-DLEGACY_EVK_LR20XX=trueRAC_RADIO=lr1121时天线切换与 LNA 控制由驱动自动处理电源建议:MCU 与射频共用 3.3V 电源,靠近每个 VDD 引脚放置 100nF + 10µF 去耦电容。
st-flash --serial <ST-LINK序列号> --reset write build/ping_pong.bin 0x08000000
STM32_Programmer_CLI -c port=SWD sn=<ST-LINK序列号> -w build/ping_pong.bin 0x08000000 -v -rst
cmake ... -DPING_PONG_START_AS_SUBORDINATE=0 # 默认
cmake ... -DPING_PONG_START_AS_SUBORDINATE=1
成功运行后应持续看到以下日志(计数器不断递增):
INFO: smtc_rac_init
INFO: USP/RAC Version: 1.0.0
...
INFO: starting ping-pong as manager
INFO: sending (value=0, delay=0ms)
INFO: usp/rac: transaction is starting
INFO: usp/rac: new event: transaction (transmission) has ended (success)
INFO: receiving...
INFO: usp/rac: transaction is starting
INFO: usp/rac: new event: transaction (reception) has ended (success)
INFO: payload is correct, continuing
INFO: sending (value=1, delay=250ms)
...
smtc_rac_init 或看门狗复位smtc_rac_init / 看门狗复位:通常是 DIO 引脚在回调注册前就配置了中断,或主循环中存在 1000ms 长延时导致 radio_planner 无法及时处理。本仓库已修复上述问题。ping_pong target 未定义 ENABLE_PERIODIC_UPLINK(该宏会与 ping-pong 事务冲突)。-DRAC_RADIO=lr2021 或 lr1121)。