基于GD32F103C8T6添加RT Thread nano设备框架并添加串口设备(以控制台console( uart0 )为例)

最近没事琢磨了一下使用设备框架的问题。因为将串口注册到设备框架可以应用十分丰富的软件包。

于是就整理了一下手上的工程,重新将工程梳理了一遍。

像这样是十分清爽了,其中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");语句,就可以了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值