最近没事琢磨了一下使用设备框架的问题。因为将串口注册到设备框架可以应用十分丰富的软件包。
于是就整理了一下手上的工程,重新将工程梳理了一遍。
像这样是十分清爽了,其中RTOS是操作系统源代码
并且学习rtconfig.h将硬件模块也单独使用settig.h进行设置,就可以对工程进行很好的功能管理,想开什么功能就改个数字就可以了
下面开始今天的正式话题。如何添加串口设备,
1)第一步,将RT Thread 的device.c加入到工程中
2)第二步,在rtconfig.h中添加一行
#define RT_USING_DEVICE
3)第三步,新建一个bspdev-uart.c文件和对应的头文件
h文件
#include "gd32f10x.h"
#include "systick.h"
#include <stdio.h>
#include <stdarg.h>
#include "rtthread.h"
#ifdef RT_USING_DEVICE
rt_err_t (*init) (rt_device_t dev);
rt_err_t (*open) (rt_device_t dev, rt_uint16_t oflag);
rt_size_t (*read) (rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size);
rt_size_t (*write) (rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size);
#endif
c文件‘
#ifdef RT_USING_DEVICE
rt_err_t uart_init(rt_device_t dev)
{
usart0_init();
return 0;
}
rt_err_t uart_open(rt_device_t dev, rt_uint16_t oflag)
{
return uart_init(dev);
}
rt_size_t uart_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size)
{
while(1){
if( usart_recevie(USART0,buffer,1,0) == 0) { return 1;};
}
}
rt_size_t uart_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size)
{
rt_size_t i = 0;
char a = '\r';
const char *val = 0;
val = (const char *)(buffer);
for (i = 0; i < size; i++)
{
if (*(val + i) == '\n')
{
while(RESET == usart_flag_get(USART0, USART_FLAG_TC));
usart_data_transmit(USART0, (uint8_t)a);
}
while(RESET == usart_flag_get(USART0, USART_FLAG_TC));
usart_data_transmit(USART0, (uint8_t)(*(val + i)));
}
while(RESET == usart_flag_get(USART0, USART_FLAG_TC));
return 1;
}
struct rt_device uart0_dev;
static int uart0_register(void)
{
uart0_dev.init = uart_init;
uart0_dev.open = uart_open;
uart0_dev.read = uart_read;
uart0_dev.write = uart_write;
rt_device_register(&uart0_dev,"uart0",0);
return 0;
}
INIT_BOARD_EXPORT(uart0_register);
#endif
其中 ,uart_read的功能是轮询读取一个字符,那个其中的usart_recevie(USART0,buffer,1,0)函数是一个利用标准库函数一个实现。具体的可以参考我上次发的。注册函数一定要在板级初始化的时候成功注册!这十分重要!而且一定要注释掉componets.c文件中的 rt_show_version()函数,不然你的串口控制台回变的不幸。
int usart_recevie(uint32_t usartname,uint8_t *rxbuffer,uint16_t size,uint32_t timeout)
{
int ch = -1;
if(size == 1){
if( usart_flag_get(usartname,USART_FLAG_RBNE) != RESET)
{
ch = (uint8_t)usart_data_receive(usartname);
}
else{
if ( usart_flag_get(usartname,USART_FLAG_ORERR) != RESET)
{
usart_flag_clear(usartname, USART_FLAG_RBNE);
rt_thread_mdelay(10);
}
}
*rxbuffer = ch;
return 0;
}
}
第四步,最重要的是将设备“uart0”绑定到shell console上
经过我半个小时的查找吗,终于找到了nano版本的RT Thread如何添加了。
按照教程在rtconfig,h中加入“//#define RT_CONSOLE_DEVICE_NAME "uart0"并不能起作用。
那么要怎么实现?咱先找到shell.c,,找到finsh_system_init(void)函数,在刚开始的第一行加入 rt_console_set_device("uart0");语句,就可以了!