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("\r\n您发送的消息为:\r\n");
			for(t=0;t<len;t++)
			{
    
    
				USART1->DR=USART_RX_BUF[t];
				while((USART1->SR&0X40)==0);//等待发送结束
			}
			//printf("\r\n\r\n");//插入换行
			USART_RX_STA=0;
		}else
		{
    
    
			times++;
			if(times%5000==0)
			{
    
    
				//printf("\r\nALIENTEK MiniSTM32开发板 串口实验\r\n");
				//printf("正点原子@ALIENTEK\r\n\r\n\r\n");
			}
			if(times%200==0)printf("请输入数据,以回车键结束\r\n");  
			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 = '1\r\n'
close_str = '2\r\n'

最终效果

MAIX BIT与STM32串口通讯

总结。

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

猜你喜欢

转载自blog.csdn.net/Thousand_drive/article/details/123921208