RT_Thread:4.0.2版本的BSP制作要点

4.0.2版本的rt-thread已经支持了标准的STM32各系列的bsp模板,可以参考rt-thread的如下路径文章《rt-thread/bsp/stm32/docs/STM32系列BSP制作教程.md》进行移植。本文主要记录需要注意的几点

1.路径不能有任何中文和空格,需要特别注意

2.templates的里面没有L0系列的例子,可以参考《stm32l053-st-nucleo》这个demo

3.如添加了PM组件,则

1)需要注意手动添加如下几个文件,这几个文件中lptime时L4系列芯片的,好在STM32的兼容性做得非常好,基本都通用了。这个给点赞。

 

2)以及这个lptim文件

3)并在文件《stm32l0xx_hal_conf.h》中将宏定义 HAL_LPTIM_MODULE_ENABLED 打开

在board的SystemClock_Config()函数中,需要在最后添加如下两句代码,分别表示从休眠唤醒采用HSI作为主时钟,以及将MSI关闭。如果不讲HSI作为唤醒的主时钟,则会出现唤醒之后HSI被关闭的情况,造成systick时间不准确。

  /**Ensure that HSI is wake-up system clock 
  */ 
  __HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_HSI);
  
  /**Turn off the MSI 
  */ 
  __HAL_RCC_MSI_DISABLE();

4)sleep和run函数,根据实际情况进行调整。特别是sleep函数,根据需要的集中睡眠模式调整即可。

5)注意rt_pm_request要和rt_pm_release成对出现使用

 

/* * 程序清单:这是一个串口设备 开启 DMA 模式后使用例程 * 例程导出了 uart_dma_sample 命令到控制终端 * 命令调用格式:uart_dma_sample uart1 * 命令解释:命令第二个参数是要使用的串口设备名称,为空则使用默认的串口设备 * 程序功能:通过串口输出字符串 "hello RT-Thread!",并通过串口输出接收到的数据,然后打印接收到的数据。 */ #include <rtthread.h> #include <rtdevice.h> #define SAMPLE_UART_NAME "uart1" /* 串口设备名称 */ /* 串口接收消息结构 */ struct rx_msg { rt_device_t dev; rt_size_t size; }; /* 串口设备句柄 */ static rt_device_t serial; /* 消息队列控制块 */ static struct rt_messagequeue rx_mq; /* 接收数据回调函数 */ static rt_err_t uart_input(rt_device_t dev, rt_size_t size) { struct rx_msg msg; rt_err_t result; msg.dev = dev; msg.size = size; result = rt_mq_send(&rx_mq, &msg, sizeof(msg)); if (result == -RT_EFULL) { /* 消息队列满 */ rt_kprintf("message queue full!\n"); } return result; } static void serial_thread_entry(void *parameter) { struct rx_msg msg; rt_err_t result; rt_uint32_t rx_length; static char rx_buffer[BSP_UART1_RX_BUFSIZE + 1]; while (1) { rt_memset(&msg, 0, sizeof(msg)); /* 从消息队列中读取消息 */ result = rt_mq_recv(&rx_mq, &msg, sizeof(msg), RT_WAITING_FOREVER); if (result > 0) { /* 从串口读取数据 */ rx_length = rt_device_read(msg.dev, 0, rx_buffer, msg.size); rx_buffer[rx_length] = '\0'; /* 通过串口设备 serial 输出读取到的消息 */ rt_device_write(serial, 0, rx_buffer, rx_length); /* 打印数据 */ rt_kprintf("%s\n",rx_buffer); } } } static int uart_dma_sample(int argc, char *argv[]) { rt_err_t ret = RT_EOK; char uart_name[RT_NAME_MAX]; static char msg_pool[256]; char str[] = "hello RT-Thread!\r\n"; if (argc == 2) { rt_strncpy(uart_name, argv[1], RT_NAME_MAX); } else { rt_strncpy(uart_name, SAMPLE_UART_NAME, RT_NAME_MAX); } /* 查找串口设备 */ serial = rt_device_find(uart_name); if (!serial) { rt_kprintf("find %s failed!\n", uart_name); return RT_ERROR; } /* 初始化消息队列 */ rt_mq_init(&rx_mq, "rx_mq", msg_pool, /* 存放消息的缓冲区 */ sizeof(struct rx_msg), /* 一条消息的最大长度 */ sizeof(msg_pool), /* 存放消息的缓冲区大小 */ RT_IPC_FLAG_FIFO); /* 如果有多个线程等待,按照先来先得到的方法分配消息 */ /* 以 DMA 接收及轮询发送方式打开串口设备 */ rt_device_open(serial, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); /* 设置接收回调函数 */ rt_device_set_rx_indicate(serial, uart_input); /* 发送字符串 */ rt_device_write(serial, 0, str, (sizeof(str) - 1)); /* 创建 serial 线程 */ rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10); /* 创建成功则启动线程 */ if (thread != RT_NULL) { rt_thread_startup(thread); } else { ret = RT_ERROR; } return ret; } 根据此代码 使用串口2解析sbus乐迪接收器代码
最新发布
07-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tristan Tsai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值