rt-thread 下,配置 stm32 的 uart

注意

cubeMX 导出配置,引脚位置在 xxxx_hal_msp.c 中

步骤

参考下面的改 board/Kconfig

1
2
3
4
5
6
7
8
9
10
11
12
13
menuconfig BSP_USING_UART
bool "Enable UART"
default y
select RT_USING_SERIAL
if BSP_USING_UART
config BSP_USING_UART1
bool "Enable UART1"
default y
config BSP_UART1_RX_USING_DMA
bool "Enable UART1 RX DMA"
depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA
default n
endif
1
2
scons --menuconfig 启用 uart,默认启用
stm32XXxx_hal_conf.h 需要启用 HAL_UART_MODULE_ENABLED

rt-thread 下,配置 stm32 的 timer

步骤

修改 board/Kconfig,添加 TIM 部分,以下为参考

1
2
3
4
5
6
7
8
9
menuconfig BSP_USING_TIM
bool "enable timer"
default n
select RT_USING_HWTIMER
if BSP_USING_TIM
config BSP_USING_TIM11
bool "Enable TIM11"
default n
endif

如果启用的定时器不自带,需要手工修改,修改libraries/HAL_Drivers/config/f4/tim_config.h,irq 部分参考 f1 的模板修改

1
2
3
4
5
6
7
8
9
10
#ifdef BSP_USING_TIM2
#ifndef TIM2_CONFIG
#define TIM2_CONFIG \
{ \
.tim_handle.Instance = TIM2, \
.tim_irqn = TIM2_IRQn, \
.name = "timer2", \
}
#endif
#endif
1
2
3
scons --menuconfig 启用 timer 配置
stm32XXxx_hal_conf.h 需要启用 HAL_TIM_MODULE_ENABLED
注意,硬件定时器的 timer 的超时时间结构体内,`秒和微秒不支持小数点`,开发板的时钟一定要设置正确,否则会出现延迟错误

rt-thread 下,配置 stm32 的 spi

1
2
mode 选择`Full-Duplex Master`全双工主模式,NSS Signal 选`Disable`即可
接线的时候,MOSI 和 MISO 不需要反接

步骤

修改 board/Kconfig,添加 SPI 部分,以下为参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
menuconfig BSP_USING_SPI
bool "Enable SPI BUS"
default n
select RT_USING_SPI
if BSP_USING_SPI
config BSP_USING_SPI1
bool "Enable SPI1 BUS"
default n

config BSP_SPI1_TX_USING_DMA
bool "Enable SPI1 TX DMA"
depends on BSP_USING_SPI1
default n

config BSP_SPI1_RX_USING_DMA
bool "Enable SPI1 RX DMA"
depends on BSP_USING_SPI1
select BSP_SPI1_TX_USING_DMA
default n
endif
1
2
scons --menuconfig 启用 spi
stm32XXxx_hal_conf.h 需要启用 HAL_SPI_MODULE_ENABLED

rt-thread 下,配置 stm32 的 sensor

以 aht10 为例

用法见 这里

注意, 由于 aht 为温湿度传感器,因此,sensor 框架会抽象出 温度和湿度两个设备

1
rt_hw_aht10_init("aaa", &cfg);

list_device 查看结果

1
2
3
4
5
6
7
device           type         ref count
-------- -------------------- ----------
humi_aaa Sensor Device 0
temp_aaa Sensor Device 0
i2c1 I2C Bus 0
uart1 Character Device 2
pin Miscellaneous Device 0

rt-thread 下,配置 stm32 的 rtc

rtc 用于提供精确的实时时间,分为硬件 rtc 和软件模拟 rtc

提醒

1
硬件 rtc,cubeMX 里面配置的时候,选中`Activate Clock Source`,时钟树里面,rtc 的时钟需要配置为`LSE`

步骤

修改 board/Kconfig,添加 rtc 相关部分,以下为参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
menuconfig BSP_USING_ONCHIP_RTC
bool "enable rtc"
select RT_USING_RTC
select RT_USING_LIBC
default n
if BSP_USING_ONCHIP_RTC
choice
prompt "select clock source"
default BSP_RTC_USING_LSE

config BSP_RTC_USING_LSE
bool "rtc using lse"

config BSP_RTC_USING_LSI
bool "rtc using lsi"
endchoice
endif

如果没有硬件 rtc,则参考下面,选中软件 rtc 部分

1
2
3
4
RT-Thread Components →
Device Drivers:
-*- Using RTC device drivers
[*] Using software simulation RTC device

ntp

我们使用 rtc 一般用于启用 NTP 时间自动同步,这个功能需要联网

先开启 ntp

1
2
3
4
RT-Thread online packages →
IoT - internet of things →
netutils: Networking utilities for RT-Thread:
[*] Enable NTP(Network Time Protocol) client

设置同步周期和首次同步的延时时间

1
2
3
4
5
6
7
RT-Thread Components →
Device Drivers:
-*- Using RTC device drivers /* 使用 RTC 设备驱动 */
[ ] Using software simulation RTC device /* 使用软件模拟 RTC */
[*] Using NTP auto sync RTC time /* 使用 NTP 自动同步 RTC 时间 */
(30) NTP first sync delay time(second) for network connect /* 首次执行 NTP 时间同步的延时。延时的目的在于,给网络连接预留一定的时间,尽量提高第一次执行 NTP 时间同步时的成功率。默认时间为 30S; */
(3600) NTP auto sync period(second) /* NTP 自动同步周期,单位为秒,默认一小时(即 3600S)同步一次。 */

注意

1
rtc 无论使用硬件还是软件模拟,目前只支持一个,名字就叫 rtc

rt-thread 下,配置 stm32 的 pwm

cubeMX 里面配置的时候,一定要注意,Clock Source 记得选一下,默认是 disable; ChannelX 选 PWM Generation CHX

一个定时器只能产生一个频率的 pwm,可以产生多个通道 pwm 信号,不同信道可以占空比不同但频率必须相同,否则会被后面启用的 pwm 覆盖

步骤

修改 board/Kconfig,添加 pwm 相关部分,以下为参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
menuconfig BSP_USING_PWM
bool "enable pwm"
default n
select RT_USING_PWM
if BSP_USING_PWM
menuconfig BSP_USING_PWM2
bool "enable timer2 output pwm"
default n
if BSP_USING_PWM2
config BSP_USING_PWM2_CH4
bool "enable pwm2 channel4"
default n
endif
endif

如果启用的 pwm 不自带,需要手工修改,修改libraries/HAL_Drivers/config/f4/pwm_config.h

1
2
3
4
5
6
7
8
9
10
#ifdef BSP_USING_PWM2
#ifndef PWM2_CONFIG
#define PWM2_CONFIG \
{ \
.tim_handle.Instance = TIM2, \
.name = "pwm2", \
.channel = 0 \
}
#endif
#endif
1
2
3
scons --menuconfig 启用 pwm
stm32XXxx_hal_conf.h 需要启用 HAL_TIM_MODULE_ENABLED
开发板的时钟一定要设置正确,否则会出现正确的周期和占空比,但是电机转的结果错误

rt-thread 下,配置 stm32 的脉冲编码器

cubeMX 里面配置,选某定时器 TIM ,比如 TIM3,Combined Channels 里面,选择 Encoder Mode,记住下面 gpio 部分的两个引脚

步骤

修改 board/Kconfig,添加 pulse encoder 相关部分

以下为参考

1
2
3
4
5
6
7
8
9
menuconfig BSP_USING_PULSE_ENCODER
bool "enable pulse encoder"
default n
select RT_USING_PULSE_ENCODER
if BSP_USING_PULSE_ENCODER
config BSP_USING_PULSE_ENCODER3
bool "enable pulse encoder3"
default n
endif

如果启用的 pulse encoder 不自带,需要手工修改

修改libraries/HAL_Drivers/config/f4/pulse_encoder_config.h

1
2
3
4
5
6
7
8
9
10
#ifdef BSP_USING_PULSE_ENCODER3
#ifndef PULSE_ENCODER3_CONFIG
#define PULSE_ENCODER3_CONFIG \
{ \
.tim_handler.Instance = TIM3, \
.encoder_irqn = TIM3_IRQn, \
.name = "pulse3" \
}
#endif
#endif
1
2
scons --menuconfig 启用 pulse encoder
stm32XXxx_hal_conf.h 需要启用 HAL_TIM_MODULE_ENABLED

注意

如果发现旋转过程中突然产生了很大的数,需要改一下驱动

libraries/HAL_Drivers/drv_pulse_encoder.c, ,pulse_encoder_init方法内, sConfig.IC1FiltersConfig.IC2Filter 都改成最大 15

但是不能根本解决,根本上解决的话,需要滤波电容。

rt-thread 下,配置 stm32 的 i2c

修改 board/Kconfig,添加 i2c 的配置部分,以下为参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
menuconfig BSP_USING_I2C1
bool "Enable I2C1 BUS (software simulation)"
default n
select RT_USING_I2C
select RT_USING_I2C_BITOPS
select RT_USING_PIN
if BSP_USING_I2C1
config BSP_I2C1_SCL_PIN
int "i2c1 scl pin number"
range 1 216
default 22
config BSP_I2C1_SDA_PIN
int "I2C1 sda pin number"
range 1 216
default 23
endif

步骤

1
2
3
scons --menuconfig 启用 i2c
stm32XXxx_hal_conf.h 需要启用 HAL_I2C_MODULE_ENABLED
i2c 需要从机的地址,可以看手册,也可以通过 i2c-tools

注意

1
2
3
目前 i2c 均为软件模拟 i2c
不需要在 cubeMX 里面的引脚配置
直接 Kconfig 里面配置即可

测试命令

1
2
3
i2c scan
i2c read
i2c write

rt-thread 下,配置 stm32 的 dac

配置

修改 board/Kconfig,添加 dac 相关部分,以下为参考

1
2
3
4
5
6
7
8
9
menuconfig BSP_USING_DAC
bool "Enable DAC"
default n
select RT_USING_DAC
if BSP_USING_DAC
config BSP_USING_DAC1
bool "Enable DAC1"
default n
endif

如果启用的 dac 不自带,需要手工修改,步骤如下

1
2
3
4
复制
libraries/HAL_Drivers/config/h7/dac_config.h

libraries/HAL_Drivers/config/f4/dac_config.h
1
2
3
4
5
6
修改
libraries/HAL_Drivers/drv_config.h
搜索
defined(SOC_SERIES_STM32F4)
添加
#include "f4/dac_config.h"

修改 libraries/STM32F4xx_HAL/SConscript, 添加

1
2
3
if GetDepend(["RT_USING_DAC"]):
src += ["STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dac.c"]
src += ["STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dac_ex.c"]
1
2
3
使用 cubeMX 配置项目, 启用 dac 和对应的 channel
scons --menuconfig 启用 dac
stm32XXxx_hal_conf.h 需要启用 HAL_ADC_MODULE_ENABLED

rt-thread 下,配置 stm32 的 can

步骤

修改 board/Kconfig,添加 can 相关部分,以下为参考

1
2
3
4
5
6
7
8
9
menuconfig BSP_USING_CAN
bool "enable can"
default n
select RT_USING_CAN
if BSP_USING_CAN
config BSP_USING_CAN1
bool "enable CAN1"
default n
endif
1
2
scons --menuconfig 启用 can
stm32XXxx_hal_conf.h 需要启用 HAL_CAN_MODULE_ENABLED

注意

一定要注意 cubeMX 里面的时钟配置apb1 peripheral clocks,这个和 PSC, BS1, BS2, SJW, 会共同影响波特率错误,导致收不到数据

波特率计算公式 baud = APB_PERIPHERAL_CLOCK / ( PSC*( BS1 + BS2 + SJW) )