#申请原创#
@21小跑堂
使用rtthread快速部署双串口UART1+UART2
1. 开始快速部署
使用rtthread配合雅特力的开发,显然上手简单到令人发指,所以第一个帖子怎么写都像是灌水。那么,很有必要继续.......灌水,因为使用本次评测的板子的开发就更容易了。因为2021年2月1日,rtthread又更了一版,直接使用BSP支持这款AT-START-F407。 本帖介绍如何快速入手rtthread,使用isp tool,对照查找开发板的引脚和接口配置。
2、使用ISP tools
不过,在此之前,需要先解决掉一个bug,就是每次使用rtthread都不能直接写程序的事情,这个应该是板子自带了一个16M的Flash,那么startup对位没搞好,使用的是pyocd来刷,没搞好。不过没有关系,可以下载使用用雅特力的isp工具弄一下,同时也熟悉一下原厂的应用工具。启动后页面如下,可以先升级at-link。这里还是吐槽一下stlink,自从升级到v3之后,v2的stlink都必须要升级才能连接芯片,这样操作不当已经搞了好几块成砖了。当然使用jlink可以返老还童,不过很不爽。在上一个帖子看到芯片的量产工具不打算再跟着stlink,深表理解,还是早脱钩自己飞的好,省得被动升级。
点击连接,就可以快速读取芯片的完整信息,含ID号等等
点击设备操作->主存储器擦除,显示擦除完成,
3. 创建rtthread工程
首先需要下载安装rtthread studio,直接新建工程,参照下图,
可以看到最新的bsp刚刚支持这个板子,都不用选择串口的PA9和PA10,后面可以看到,这个直接启动了全部的3个uart接口,分别对应PA9和PA10,PA2和PA3和PA11和PA12。
不过需要先下载最新的sdk才可以,按照提示操作则可。
然后上电运行,显示的是出厂程序,3个LED灯流水行船。已经展示过就不再重述了。
4、使用并启动uart2
再rtthread中,使用uart和启动adc等,再bsp配置好之后是同等难度的。都是用类似的流程和操作实现的,详见rtthread的文档,检索和使用都很快的。这里就以uart为例介绍一下。首先,看源代码
int main(void)
{
uint32_t Speed = 1000;
/* set LED2 pin mode to output */
rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT);
/* set LED3 pin mode to output */
//rt_pin_mode(LED3_PIN, PIN_MODE_OUTPUT);
/* set LED4 pin mode to output */
//rt_pin_mode(LED4_PIN, PIN_MODE_OUTPUT);
while (1)
{
rt_pin_write(LED2_PIN, PIN_LOW);
rt_thread_mdelay(Speed);
//rt_pin_write(LED3_PIN, PIN_LOW);
//rt_thread_mdelay(Speed);
//rt_pin_write(LED4_PIN, PIN_LOW);
//rt_thread_mdelay(Speed);
rt_pin_write(LED2_PIN, PIN_HIGH);
rt_thread_mdelay(Speed);
//rt_pin_write(LED3_PIN, PIN_HIGH);
//rt_thread_mdelay(Speed);
//rt_pin_write(LED4_PIN, PIN_HIGH);
//rt_thread_mdelay(Speed);
}
}
注释掉的部分就是只保留一个灯blink一下就好了,重点是新定义一个uart2,然后初始化后启动,
#define SAMPLE_UART_NAME "uart2"
static rt_device_t serial;
static int uart2(void)
{
rt_err_t ret = RT_EOK;
rt_size_t send_len = 0;
/* 查找系统中的串口设备 */
serial = rt_device_find(SAMPLE_UART_NAME);
if (!serial)
{
rt_kprintf("find %s failed!\n", SAMPLE_UART_NAME);
return -RT_ERROR;
}
/* 以中断接收及轮询发送模式打开串口设备 */
ret = rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);
if (ret != RT_EOK)
{
rt_kprintf("open device failed\r\n");
return -RT_ERROR;
}
/* 发送字符串 */
send_len = rt_device_write(serial, 0, str, (sizeof(str) - 1));
if (send_len != sizeof(str) - 1)
{
rt_kprintf("send data failed\r\n");
return -RT_ERROR;
}
/* 关闭设备 */
ret = rt_device_close(serial);
if (ret != RT_EOK)
{
rt_kprintf("close device failed\r\n");
return -RT_ERROR;
}
//rt_kprintf("serial device test successful\r\n");
rt_kprintf("End of Uart2.\r\n");
return RT_EOK;
}
MSH_CMD_EXPORT(uart2, uart device sample);
这样就增加了一个MSH函数,不仅可以再程序中使用,也可以再msh交互界面直接调用,这里定义是不含参的,也可以定义了变参数的函数命令。这样运行后,系统自动启动了UART1作为控制台输入输出,然后自定义UART2作为和UART1交互的界面,uart1给uart2反馈“Try uart2 on Artery”,再uart1中显示串口启动成功,“serial device test successful”
详见下图的两个terminal,其中uart1使用的是rtthread自己启动的窗口,是调用putty显示的。显示的内容可以是
“Hello rt-thread.”
另一个是“Try uart2 on Artery”
调试成功。
具体的硬件连接如下,在丝印上选择PA2和PA3,
对应连接在usb TTL的TX和RX接口上。
具体需要阅读电路图,这样更便于使用。
5、上述过程看起来简单,但是还是踩了不少坑的。原来比较熟悉rtthread,但是这次rtthread更新比较大,原来在board.h中定义的功能选择都移到另一个文件中去,直接用scons定义,不用手动了。同时带来的问题就是不知道引脚如何定义,这个需要从msp目录下去找源码的说明,对照线路原理图才能识别。
虽然,其他接口的使用也是非常简便,但是还是要提示一下,直接选择rtthread setting,进入图形化的外设和软件包选择界面,那么对应雅特力的探索才刚刚开始。
|