网络知识 娱乐 K210学习笔记(五)——MAIX BIT(K210)与STM32串口通讯

K210学习笔记(五)——MAIX BIT(K210)与STM32串口通讯


前言

uart 模块主要用于驱动开发板上的异步串口,可以自由对 uart 进行配置。k210 一共有3个 uart,每个 uart 可以进行自由的引脚映射。

一、MAIX BIT串口使用步骤

1.引脚映射

在使用 uart 前,我们需要使用 fm 来对芯片引脚进行映射和管理。如下所示,将 PIN10 设置为 uart2 的发送引脚,PIN11 设置为 uart2 的接收引脚

fm.register(board_info.PIN10,fm.fpioa.UART2_TX)
fm.register(board_info.PIN11,fm.fpioa.UART2_RX)

2.构造函数

uart = machine.UART(uart,baudrate,bits,parity,stop,timeout, read_buf_len)

通过指定的参数新建一个 UART 对象
参数说明:
uart: UART 号,使用指定的 UART,可以通过 machine.UART. 按tab键来补全
baudrate: UART 波特率
bits: UART 数据宽度,支持 5/6/7/8 (默认的 REPL 使用的串口(UARTHS)只支持 8 位模式), 默认 8
parity: 奇偶校验位,支持 None, machine.UART.PARITY_ODD, machine.UART.PARITY_EVEN (默认的 REPL 使用的串口(UARTHS)只支持 None), 默认 None
stop: 停止位, 支持 1, 1.5, 2, 默认 1
timeout: 串口接收超时时间
read_buf_len: 串口接收缓冲,串口通过中断来接收数据,如果缓冲满了,将自动停止数据接收

3.串口初始化

uart.init(baudrate,bits,parity,stop,timeout, read_buf_len)

同构造函数,但不需要第一个UART号,用于初始化 uart,一般在构造对象时已经初始化,这里用在重新初始化 uart

3.功能函数

1、

uart.read(num)

用于读取串口缓冲中的数据
参数说明:
num: 读取字节的数量,一般填入缓冲大小,如果缓冲中数据的数量没有 num 大,那么将只返回缓冲中剩余的数据

2、

uart.readline(num)

用于读取串口缓冲数据的一行
参数说明:
num: 读取行的数量

3、

uart.write(buf)

用于使用串口发送数据
参数说明:
buf: 需要发送到数据

4、

uart.deinit()

注销 UART 硬件,释放占用的资源

5、

在这里插入代码片

二、MAIX BIT串口收发

准备MAIX BIT开发板一块,USB转TTL板一块,杜邦线若干;实现MAIX BIT与XCOM之间的通讯,接线:ch340的TX接MAIX BIT的PIN16,ch340的RX接MAIX BIT的PIN15。注意两块板子连接串口时要连接到不同的串口上,比如一块连COM1,另一块就连COM2。

代码:

from fpioa_manager import fm
from machine import UART
from fpioa_manager import fm


fm.register(15, fm.fpioa.UART1_TX, force=True)
fm.register(16, fm.fpioa.UART1_RX, force=True)

uart_A = UART(UART.UART1, 115200, 8, 0, 0, timeout=1000, read_buf_len=4096)

write_str = 'Get datas successful'
while True:   
    read_data = uart_A.read()
    if read_data:
        uart_A.write(write_str)
        read_str = read_data.decode('utf-8')
        print("string = ", read_str)
        

分析代码:
将PIN15、PIN16分别映射为TX,RX;
构建串口uart_A为UART1,波特率为115200,缓存数据长度为4096;
如果uart_A收到数据,则通过uart_A发送’Get datas successful’,并且打印出收到的数据;

MAIX BIT与XCOM通讯

三、MAIX BIT与STM32串口通讯

MAIX BIT与STM32一直是我最想实现的功能之一,奈何弄了几天一直有bug,最后通过串口助手发现了问题所在。这里我用的是stm32f103rct6。
MAIX BIT代码:

from fpioa_manager import fm
from machine import UART
from fpioa_manager import fm
import time

fm.register(15, fm.fpioa.UART1_TX, force=True)
fm.register(16, fm.fpioa.UART1_RX, force=True)

uart_A = UART(UART.UART1, 115200, 8, 0, 0, timeout=1000, read_buf_len=4096)

open_str = '1'
close_str = '2'
for i in range(1):
    read_data = uart_A.read()
    uart_A.write(open_str)
    time.sleep(2)
    uart_A.write(close_str)

分析代码:通过串口A向stm32发送1,延时两秒后发送2

STM32代码段:
代码可以直接用正点原子的串口实验代码,波特率改成115200下载连接

链接:https://pan.baidu.com/s/1T7mbhRUU5Vv28uFRXC8yeg
提取码:2333

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
 int main(void)
 {	
	u8 t;
	u8 len;	
	u16 times=0; 
 
	delay_init();	    	 //延时函数初始化	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
	uart_init(115200);	 //串口初始化为115200
	LED_Init();		  	 //初始化与LED连接的硬件接口 
 
	while(1)
	{
		if(USART_RX_BUF[0]==0x31)
		{
		LED1=0;
		}
		else if(USART_RX_BUF[0]==0x32)
		{
			LED1=1;
		}
		if(USART_RX_STA&0x8000)
		{					   
			len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
			//printf("rn您发送的消息为:rn");
			for(t=0;t<len;t++)
			{
				USART1->DR=USART_RX_BUF[t];
				while((USART1->SR&0X40)==0);//等待发送结束
			}
			//printf("rnrn");//插入换行
			USART_RX_STA=0;
		}else
		{
			times++;
			if(times%5000==0)
			{
				//printf("rnALIENTEK MiniSTM32开发板 串口实验rn");
				//printf("正点原子@ALIENTEKrnrnrn");
			}
			if(times%200==0)printf("请输入数据,以回车键结束rn");  
			if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
			delay_ms(10);   
		}
	}	 
}

因为MAIX BIT发送的是ASCII码的形式,所以我们判断只需要判断是否是对于的ASCII码。
重点来了,你以为到这里就结束了吗,并没有在这里插入图片描述
因为我们stm32的代码是直接使用的串口实验例程,并且只改了波特率,所以需要接收到0d0a后才会结束接收,在这里我们只需要改一下MAIX BIT发送的data就行了,将

open_str = '1'
close_str = '2'

改为

open_str = '1rn'
close_str = '2rn'

最终效果

MAIX BIT与STM32串口通讯

总结。

MAIX BIT再和STM32进行串口通讯时要注意几点:
1、MAIX BIT的波特率要和STM32的一样,不然会乱码甚至接收错误
2、MAIX BIT发送数据是以ASCII码的形式发送的
3、MAIX BIT发送的数据后需要加0d 0a
4、有待补充…