嵌入式技术论坛
直播中

王树林

7年用户 1672经验值
私信 关注
[经验]

分享一下AB32VG1开发板UART功能测评过程

接触RT_Thread已经有很长一段时间了,在平时工作中经常接触到ucosII和Linux的教学与开发工作,所以对国产的RT_Thread很容易上手,尤其是通过这次对中科蓝讯开发板的测评,对国产处理器和国产OS的强势崛起感触颇深!接下来分享一下测评过程。

一、安装好RT-Thread Studio V2.1.0,打开SDK管理器,安装RT-Thread Source_Code latest、Bluetrum板级支持包和工具链RISC-V-GCC V10.1.0,接下来基于蓝讯开发板创建工程AB32VG1_USART。

编译工程,同时打开蓝讯的下载工具Downloader_v2.0.0,选择通过USB转串口连接开发板的端口号,选择开发模式,并且在开始按钮里把擦除和自动选择上,这样在RT-Thread Studio编译好工程后会自动下载程序到开发板,这个做的很好,赞一下!

下载程序后

尝试着在添加一行程序

rt_kprintf(“Hello, world\n”);

rt_kprintf(“Hello AB32VG1_USART\n”);

重新编译运行,

说明软硬件环境没有问题了。

二、修改相关文件

这个定义不是手动改的,而是通过env环境配置,要添加串口1的配置 可以编辑Kconfig文件,在env环境下使用menuconfig进入图形配置界面。如果不从env配置的方式添加串口 ,可以直接在board.h中直接添加,#define BSP_USING_UART1 以及相关的定义。

在main.c中,添加如下代码,这里使用了静态信号量,用于触发中断时释放信号量,同时定义了串口1的线程函数。

static rt_thread_t usart1_thread = RT_NULL; //串口1线程

static void usart1_thread_entry(void* parameter);

static rt_err_t uart1_input(rt_device_t dev, rt_size_t size);

static rt_device_t serialuart1;

char str[] = “Hello AB32VG1_USART1!\r\n”;

static struct rt_semaphore rx_sem1;

在main函数之前实现如下函数,

static void usart1_thread_entry(void* parameter)

{

serialuart1 = rt_device_find("uart1");

rt_device_open(serialuart1 , RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX );

rt_device_set_rx_indicate(serialuart1 , uart1_input);

rt_device_write(serialuart1 , 0, str, (sizeof(str) - 1));

char ch;

while (1)

{

while (rt_device_read(serialuart1 , -1, &ch, 1) != 1)

{

    rt_sem_take(&rx_sem1, RT_WAITING_FOREVER);

}

ch = ch+1;

rt_device_write(serialuart1 , 0, &ch, 1);

}

}

static rt_err_t uart1_input(rt_device_t dev, rt_size_t size)

{

rt_sem_release(&rx_sem1);

return RT_EOK;

}

在main函数中,创建线程:

rt_sem_init(&rx_sem1, “rx_sem1”, 0, RT_IPC_FLAG_FIFO);

usart1_thread = rt_thread_create( “uart1”, //创建串口任务

usart1_thread_entry,

RT_NULL,

512,

5,

20);

if (usart1_thread != RT_NULL)

rt_thread_startup(usart1_thread);

else

return -1;

查看板子原理图,通过USB转TTL连接串口1和PC机,编译、自动下载后运行:

运行后发现乱码,考虑到串口波特率问题,在drv_usart.c中第191行添加如下代码后现实正常。

if(i == UART1_INDEX)

{

    uart_obj[i].serial.config.baud_rate = 115200;

}

在串口调试助手里输入字符,字符+1后返回。串口1测试正常。

三、添加LED线程

串口1运行以后,发现LED不亮了,也是为了测试一下多线程,又写了一个LED线程。

//LED线程

static rt_thread_t led_thread = RT_NULL;

static void led_thread_entry(void* parameter);

static rt_device_t led;

static void led_thread_entry(void* parameter)

{

uint32_t cnt = 0;

uint8_t led0 = rt_pin_get(“PE.1”);

rt_pin_mode(led0, PIN_MODE_OUTPUT);

while (1)

{

if (cnt % 2 == 0)

{

    rt_pin_write(led0, PIN_LOW);

}

else

{

    rt_pin_write(led0, PIN_HIGH);

}

cnt++;

rt_thread_mdelay(500);

}

}

在main函数中,创建LED线程。

//创建led任务

led_thread = rt_thread_create( “led0”,

led_thread_entry,

RT_NULL,

512,

6,

10);

if(led_thread != RT_NULL)

rt_thread_startup(led_thread);

else

return -1;

重新编译运行,LED快速的闪烁起来,串口1正常通信,多线程测试ok。

输入list_deivce和ps命令查看系统设备和线程情况,列出了线程名称、优先级、堆栈等信息。

原作者:永恒之约

更多回帖

发帖
×
20
完善资料,
赚取积分