RT-Thread完整版入门

463 阅读5分钟

先入门RT-Thread Studio 参考

比较常用的

项目编译碰到一些奇怪问题,可以清理一下再全部构建试一下

常用的快捷键,鼠标放到在某个函数上点一下,按F3进入函数体内,或者按住ctrl点击函数;Alt+左键,返回上一级;ctrl+H进行搜索;ctrl+/进行注释,再点一次取消注释

 

关于串口的dma,下面这么写,串口2是没问题的,串口4会报错
'UART4_RX_DMA_INSTANCE' undeclared (first use in this function)    uart_config.h    /TEST_L476RCT6_RTTSDIO/drivers/include/config    第 174 行    C/C++ 问题···  原因可以去dma_config.h里面看一下,因为里面没有为串口4的接收分配DMA通道

#define BSP_UART4_RX_USING_DMA
#define BSP_UART2_RX_USING_DMA

#define BSP_USING_UART2
#define BSP_UART2_TX_PIN       "PA2"
#define BSP_UART2_RX_PIN       "PA3"

#define BSP_USING_UART4
#define BSP_UART4_TX_PIN       "PC10"
#define BSP_UART4_RX_PIN       "PC11"

 

studio自带的串口工具只能显示字符串,不能显示hex

和裸板不同的是,RT系统有一种自动初始化机制,就是函数不一定用放到main函数里面去初始化,一个宏就解决,参考  官方

移植软件包dhtxx时发现RT_SENSOR_VENDOR_ASAIR一直未定义,定位到下图只是在报错时把这个传感器是谁家卖的打印出来,不太重要就自己定义了 #define RT_SENSOR_VENDOR_ASAIR RT_SENSOR_VENDOR_UNKNOWN

还报错描述    资源    路径    位置    类型
conflicting types for 'rt_hw_dht_init'    sensor_asair_dhtxx.c    /TEST_L476RCT6_RTTSDIO/packages/dhtxx-latest/src    第 389 行    C/C++ 问题

 

出现错误:


\ | /
- RT -     Thread Operating System
/ | \     4.0.2 build Jan 13 2021
2006 - 2019 Copyright by rt-thread team
psr: 0xa1000000
r00: 0x20001718
r01: 0x00000100
r02: 0x00000000
r03: 0xdeadbeef
r04: 0xdeadbeef
r05: 0xdeadbeef
r06: 0xdeadbeef
r07: 0x20005a10
r08: 0xdeadbeef
r09: 0xdeadbeef
r10: 0xdeadbeef
r11: 0xdeadbeef
r12: 0x00000000
lr: 0x08000999
pc: 0xdeadbeee
hard fault on thread: main  thread   pri  status      sp     stack size max used left tick  error
-------- ---  ------- ---------- ----------  ------  ---------- ---
nh3_data  25  ready   0x00000048 0x00000200    14%   0x0000000a 000

tled      31  ready   0x00000048 0x00000010    100%   0x00000005 000
tshell    20  ready   0x00000048 0x00001000    01%   0x0000000a 000
tidle0    31  ready   0x00000044 0x00000100    26%   0x00000020 000
timer      4  suspend 0x0000007c 0x00000200    24%   0x00000009 000
main      10  running 0x00000044 0x00004000    01%   0x00000014 000
mem manage fault:
SCB_CFSR_MFSR:0x01 IACCVIOL 

问题原因是线程堆栈溢出

 

psr: 0x01000000
r00: 0xdeadbeef
r01: 0x10000000
r02: 0x2000221c
r03: 0xdeadbeef
r04: 0x00000000
r05: 0x00000058
r06: 0x00000000
r07: 0x20004b80
r08: 0x20004ba8
r09: 0xdeadbeef
r10: 0xdeadbeef
r11: 0xdeadbeef
r12: 0x00000000
lr: 0x0801f51d
pc: 0x0800e49a
hard fault on thread: hln_th

thread   pri  status      sp     stack size max used left tick  error
-------- ---  ------- ---------- ----------  ------  ---------- ---
beep      27  ready   0x00000048 0x00000100    28%   0x0000000a 000
led_0     31  suspend 0x000000d8 0x00000200    42%   0x00000005 000
cfg_th    17  suspend 0x000000b0 0x00000400    28%   0x00000031 000
led_th    30  suspend 0x000000b8 0x00000400    25%   0x00000032 000
tst_th    26  suspend 0x000000c8 0x00000100    78%   0x0000000a 000
ZIG_th    22  suspend 0x000000c8 0x00000200    39%   0x0000000a 000
bla_th    25  suspend 0x000000d0 0x00000400    20%   0x0000000a 000
hln_th    22  running 0x00000110 0x00000600    17%   0x00000007 -02
littled   27  suspend 0x000000e8 0x00000400    31%   0x00000014 000
tshell    20  suspend 0x000000cc 0x00001000    05%   0x0000000a 000
tidle0    31  ready   0x0000005c 0x00000100    57%   0x0000001e 000
timer      4  suspend 0x0000007c 0x00000200    24%   0x00000009 000
main      10  suspend 0x00000178 0x00000800    27%   0x0000000e 000
bus fault:
SCB_CFSR_BFSR:0x82 PRECISERR SCB->BFAR:DEADBEEF

问题解决:在串口回调的一个子函数最后面放了一个return 1 ,而这个子函数调用了一个线程,线程调用了一个串口发送函数,在在串口回调的一个子函数后面也调用了同样一个串口发送函数,不知道是不是时间太近造成的,把return去了就行了

修改串口波特率

呼吸灯pwm  先使能RT_USING_PWM 再去board.h里面定义PWM几  比如#define BSP_USING_PWM2

定时器要#define BSP_USING_TIM 没有找到取消定义的地方,要自己定义  然后去board.h里面参考HARDWARE TIMER CONFIG BEGIN里面内容

再在 tim_config.h 中 添加或修改 TIM2、TIM4的配置

配置PWM要去pwm_config.h 配置PWM2_CONFIG的定时器 通道 名称

pwm配置参考  参考2  如果不把移植过来的函数放到board.c中要声明

注意

 定时器初始化MX_TIM2_Init();要放在引脚配置rt_pin_mode(LED_CTR1, PIN_MODE_OUTPUT);之后

线程出现error=-2的意思是线程超时