STM32 使用说明
- 本章节展示的是 LoRa 官方 USP 库 示例
- 相关使用文档可以直接访问官方 GitHub:USP 文档说明
硬件连接
参考下表进行连接:
| Core2021-XF | STM32L476RG |
|---|---|
| CLK | PA5 |
| MISO | PA6 |
| MOSI | PA7 |
| CS | PA8 |
| DIO8 | PA1 |
| RESET | PA0 |
| BUSY | PB3 |
示例程序
- STM32 示例程序位于 Lora-net/usp 的
examples/main_examples目录中 - 测试需准备 两个 Core2021-XF 模块:一个发送,一个接收
- 以下对几个示例程序进行说明,包括使用方法和运行效果
main_porting_tests
【程序说明】
- 基于 STM32L476RG + Core2021-XF,实现端口功能验证示例
- 用于测试以下内容:
- SPI 接口功能
- 中断 IRQ 响应
- 定时器和低功耗模式
- 随机数生成
- 无线电配置时间
- MCU 睡眠时间
- Flash 仿真存储(可选)
- 测试覆盖模块初始化、发送/接收配置以及 MCU 相关硬件接口
- 通过串口打印测试结果
【代码分析】
- 硬件抽象层:
smtc_modem_hal.h、smtc_hal_mcu.h、smtc_hal_gpio.h、smtc_hal_watchdog.h- IRQ 回调函数:
radio_tx_irq_callback、radio_rx_irq_callback、timer_irq_callback
- LoRa/Radio 参数:
ralf_params_lora_t rx_lora_param/tx_lora_param:用于端口测试的模拟 RX/TX 配置- 固定频率、符号率、带宽、同步字和发射功率
- 主要测试函数:
porting_test_spi():验证 SPI 端口与芯片固件版本porting_test_radio_irq():验证收发中断触发porting_test_get_time():检测 HAL 获取时间函数porting_test_timer_irq():验证定时器中断porting_test_stop_timer():验证定时器停止功能porting_test_disable_enable_irq():验证中断禁用/启用逻辑porting_test_random():验证随机数生成与分布porting_test_config_rx_radio()/porting_test_config_tx_radio():检测收发配置时间porting_test_sleep_ms():检测 MCU 睡眠时间porting_test_timer_irq_low_power():验证定时器低功耗模式
- Flash 测试(可选):
porting_test_flash()/test_context_store_restore() main_porting_tests():- 初始化 MCU 外设
- 禁用 IRQ 避免初始化冲突
- 循环执行端口测试,根据
ENABLE_TEST_FLASH选择是否进行 Flash 测试 - 结束后进入无限循环并刷新看门狗
【运行效果】
- 上电启动后串口打印:

ping_pong_example
【程序说明】
- 基于 STM32L476RG + Core2021-XF,实现 Ping-Pong + 周期性上行通信示例
- 支持用户按键触发 Manager 模式:
- Manager 发起 PING
- Subordinate 自动响应 PONG
- 每次发送或接收完成后自动触发回调处理
- 支持周期性上行(默认每 10 秒发送一次固定 payload
"LoRa") - LED 指示 TX/RX 状态
- 使用 Watchdog 防止 MCU 死锁
- 自动进入低功耗睡眠,节省能量
【代码分析】
- MCU 初始化:
hal_mcu_init():初始化 MCU 外设smtc_rac_init():初始化 Radio Abstraction Layer
- 用户按键:
user_button_t保存状态和按下时间user_button_callback():按键防抖,触发 Manager 模式
- LED 初始化:
SMTC_LED_TX/SMTC_LED_RX - 应用初始化:
ping_pong_init():初始化 Ping-Pong 事务periodic_uplink_init():初始化周期上行
- 主循环:
- 喂狗:
hal_watchdog_reload() - 执行 Radio 事务:
smtc_rac_run_engine() - 处理按键事件:
ping_pong_on_button_press() - MCU 睡眠:判断是否有待处理事务,通过
hal_mcu_set_sleep_for_ms(SLEEP_DELAY)
- 喂狗:
- 核心逻辑:
ping_pong_init():设置交易上下文、Payload、调制参数ping_pong_tx()/ping_pong_rx():发送/接收 PING 或 PONGpre_ping_pong_callback()/post_ping_pong_callback():- LED 控制
- 处理事务完成状态(TX_DONE / RX_PACKET / RX_TIMEOUT / CRC_ERROR / TASK_ABORTED)
- 自动重试或重启
- 周期性上行逻辑:通过回调函数调度下一次发送
【运行效果】
- 上电后串口打印:

main_periodical_uplink
【程序说明】
- 基于 STM32L476RG + Core2021-XF,实现:
- LoRaWAN OTAA 入网
- 周期性上行(Periodic Uplink)
- 用户按键触发即时上行
- 使用
example_options.h提供 LoRaWAN 用户凭据:USER_LORAWAN_DEVICE_EUIUSER_LORAWAN_JOIN_EUIUSER_LORAWAN_GEN_APP_KEYUSER_LORAWAN_APP_KEY
- 配置区域:
MODEM_EXAMPLE_REGION(EU868 或 WW_2G4) - Watchdog 和低功耗睡眠保护 MCU
- 串口打印事件、上行/下行数据和调试信息
【代码分析】
- 初始化:
hal_mcu_init()、hal_gpio_init_in()配置外设smtc_rac_init()和smtc_modem_init()初始化 Modem,回调modem_event_callback()
- 用户按键:
user_button_callback()处理按键事件,触发即时上行
- 周期性上行:
periodical_uplink_init()初始化事务- 每次发送完成后,
post_periodic_callback()调度下一次上行
- 事件回调:
modem_event_callback()处理 Modem 各类事件:RESET:设置凭据和区域,发起 JoinJOINED:入网成功,启动第一次周期上行ALARM:周期上行触发TXDONE:上行发送完成DOWNDATA:下行数据接收- 其他事件:
LINK_CHECK、CLASS_B_PING_SLOT_INFO等打印调试信息
- 上行数据:
- 32-bit uplink counter
- 可选端口发送(默认 101/102)
- 主循环:
- 检查按键触发即时上行
- 调用
smtc_modem_run_engine()和smtc_rac_run_engine()处理事务 - MCU 睡眠至下次事务或 Watchdog reload
【运行效果】
- 上电后串口打印:
