一、开发板硬件信息
1.MCU信息
开发板采用中科蓝讯的32位RISC-V指令集的AB32VG1型号MCU,主频120M。MCU有8M的Flash,和192K SRAM,内存指定够用。和我接触的另外一款RISC-V架构的MCU一样都是宽电压供电,支持3.0V-5.0V供电。 与一般MCU不同的是,这款MCU具有MPU模块,就是电源管理模块,支持Charge电路、BUCK电路、LDO电路等等,手册第十页给出了MPU模块的详细参数。
2. 开发板特点
(1) 拿到开发板后最先看到就是一个Type-C和USB-A的母口,Type-C口肯定是用来调试和下载的,一般开发板都是采用micro u***或者Type-C接口来做,但是这个使用了USB-A,正好实验室有母对母的线,以后尝试使用使用。
(2) 开发板两侧排母是兼容Arduino接口的,可以将一些Arduino uno开发板的代码移植到这个开发板上来。但是这里需要注意下,Vin只支持最大5V输入,如果使用5V以上电源时必须要将Arduino 的VIN引脚断开。
(3) 开发板上有蓝牙天线,手册里也看到了支持蓝牙5.0协议,但是这次用户手册和硬件原理图中并没有给出蓝牙模块的资料,我评测的是串口模块,所以下次等有资料后再来做串口蓝牙来使用。
(4) 其余外设,开发板有三个微动开关,一个用作复位按键,其余两个供用户使用。有按键那必然就要点灯啦,有一个RGB灯使用三个IO口做控制。
3. 串口硬件信息
开发板有三个全双工的UART模块,Uart0有六组IO口的映射,Uart1和Uart2各有两组IO口。但是Uart0是开发板的调试串口,Type-C和USB-A都挂载在Uart0上所以用户使用Uart1和Uart2就可以了。
手册里没有找到Uart配置相关的详细信息,而且是借助我们RTT作为开发平台,肯定进行了封装无需用户调用。
二、开发Uart1评测
1.Uart1查看
因为Uart0已经被用来作为调试了,所以留给用户来使用UART1,查找手册后Uart1的RX1引脚为(PA6-G1,PA3-G2)TX1引脚为(PA7-G1,PA4-G2)。
2.新建RTT工程
新建完Demo,Download开发板,RTT有串口输出,使用list_device命令查看已初始化的驱动,发现Uart1已经被初始化,所以进入RTT的库查看初始程序。
void hal_uart_mspinit(struct uart_handle *huart)
{
struct gpio_init gpio_init;
if (huart->instance == UART0_BASE)
{
gpio_init.pin = GPIO_PIN_7;
gpio_init.pull = GPIO_PULLUP;
gpio_init.dir = GPIO_DIR_INPUT;
gpio_init.de = GPIO_DIGITAL;
gpio_init.alternate = GPIO_AF_MAP_Gx(UT0TXMAP_AF, GPIO_AF_G1) | UT0RXMAP_TX;
gpio_init.af_con = GPIO_AFEN | GPIO_AFCON0 | UT0TXMAP_AF;
hal_gpio_init(GPIOA_BASE, &gpio_init);
} else if (huart->instance == UART1_BASE)
{
gpio_init.pin = GPIO_PIN_4;
gpio_init.dir = GPIO_DIR_OUTPUT;
gpio_init.de = GPIO_DIGITAL;
gpio_init.alternate = GPIO_AF_MAP_Gx(UT1TXMAP_AF, GPIO_AF_G2);
gpio_init.af_con = GPIO_AFEN | GPIO_AFCON0 | UT1TXMAP_AF;
hal_gpio_init(GPIOA_BASE, &gpio_init);
gpio_init.pin = GPIO_PIN_3;
gpio_init.pull = GPIO_PULLUP;
gpio_init.dir = GPIO_DIR_INPUT;
gpio_init.de = GPIO_DIGITAL;
gpio_init.alternate = GPIO_AF_MAP_Gx(UT1RXMAP_AF, GPIO_AF_G2);
gpio_init.af_con = GPIO_AFEN | GPIO_AFCON0 | UT1RXMAP_AF;
hal_gpio_init(GPIOA_BASE, &gpio_init);
/* Interrupt */
}
}
这段代码里可以看到开发板在初始化时将Uart1初始化为A4-TX,A3-RX。所以我们将使用这两个IO口挂载串口外设。
int rt_hw_usart_init(void)
{
rt_size_t obj_num = sizeof(uart_obj) / sizeof(struct ab32_uart);
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
rt_err_t result = 0;
rt_hw_interrupt_install(IRQ_UART0_2_VECTOR, uart_isr, RT_NULL, "ut_isr");
for (int i = 0; i < obj_num; i++)
{
/* init UART object */
uart_obj.config = &uart_config;
uart_obj.serial.ops = &ab32_uart_ops;
uart_obj.serial.config = config;
uart_obj.serial.config.baud_rate = 1500000;
/* register UART device */
result = rt_hw_serial_register(&uart_obj.serial, uart_obj.config->name,
RT_DEVICE_FLAG_RDWR
| RT_DEVICE_FLAG_INT_RX
| RT_DEVICE_FLAG_INT_TX
| uart_obj.uart_dma_flag
, NULL);
RT_ASSERT(result == RT_EOK);
}
return result;
}
新建task.c如下:
/*Includes**********************************************************************/
#include "task.h"
#define THREAD_PRIORITY 2
#define THREAD_STACK_SIZE 512
#define THREAD_tiMESLICE 5
static rt_thread_t tid1 = RT_NULL;
#define SAMPLE_UART_NAME "uart1" /* 串口设备名称 */
static rt_device_t serial; /* 串口设备句柄 */
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; /* 初始化配置参数 */
/* 线程 的入口函数 */
static void thread_entry(void *parameter)
{
rt_uint32_t count = 1;
char str[] = "hello RT-Thread!rn";
/* step1:查找串口设备 */
serial = rt_device_find(SAMPLE_UART_NAME);
/* step2:修改串口配置参数 */
config.baud_rate = BAUD_RATE_9600; //修改波特率为 9600
config.data_bits = DATA_BITS_8; //数据位 8
config.stop_bits = STOP_BITS_1; //停止位 1
config.bufsz = 128; //修改缓冲区 buff size 为 128
config.parity = PARITY_NONE; //无奇偶校验位
/* step3:控制串口设备。通过控制接口传入命令控制字,与控制参数 */
rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config);
/* step4:打开串口设备。以中断接收及轮询发送模式打开串口设备 */
rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);
while (count++)
{
if(count == 5000)
{
count = 1;
}
rt_thread_mdelay(2000);
/* 发送字符串 */
rt_device_write(serial, 0, str, (sizeof(str) - 1));
}
}
/* 线程 */
int thread_serial(void)
{
/* 创建线程 ,名称是 thread,入口是 thread_entry*/
tid1 = rt_thread_create("thread",
thread_entry, RT_NULL,
THREAD_STACK_SIZE,
THREAD_PRIORITY, THREAD_TIMESLICE);
/* 如果获得线程控制块,启动这个线程 */
if (tid1 != RT_NULL)
rt_thread_startup(tid1);
return 0;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(thread_serial, thread serial);
新建task.h如下
#ifndef _TASK_H_
#define _TASK_H_
#include
#include "rtconfig.h"
#include
#include "drv_common.h"
int thread_serial(void);
#endif
编译下载,进入命令行开启线程thread_serial。
三、演示效果
1.串口调试助手
使用USB转TLL工具连接开发板的RX与TX引脚(开发板的丝印RX和TX即为Uart1,Uart0没有引出,便于调试。)打开命令行开启线程后,串口助手即可输出串口结果。
2.TTL语音合成外设。
TTL语音合成设备自带喇叭,支持5V和3.3V单片机,串口直接控制串口输出什么该产品就报什么语音。比如printf(大家好)﹔产品喇叭就播报“大家好”,支持数字,字母,中文的播报。通信波特率固定为9600,8,n,
三、体验心得
开发板兼容Arduino接口,所以以后可以尝试将Arduino做的产品移植到这个开发板来使用,最重要的是蓝牙模块呦,期待资料更新。
整个开发在RTT的软件包的加持下非常轻松,因为底层已经开发好所以用户无需关注RISC-V指令集与ARM指令集的异同,还是按照之前的开发方式进行开发,这样极大的简化了指令集更新带来的难度。
在ARM几乎垄断的境地下,国内众多原厂不断向开源的RISC-V指令集靠拢,希望未来借助RISC-V指令集诞生出一个像STM一样有影响力的国产MCU品牌。
|