串口通讯是平时大家进行调试最常用的方法,嵌入式应用通常要求一个简单的并且占用系统资源少的方法来传输数据。通用异步收发传输器 (UART)即可以满足这些要求,它能够灵活地与外部设备进行全双工数据交换,那么本章我们来了解下,本节课主要学习K210的串口通讯。
串口通讯是指外设和计算机间,通过数据信号线、地线等,按位(bit)进行传输数据(发送和接收)的一种通讯方式,一个字符一个字符地传输,每个字符一位一位地传输,并且传输一个字符时,总是以“起始位”开始,以“停止位”结束,字符之间没有固定的时间间隔要求,但是数据是低位在前,高位在后,然后接上奇偶检验位。
串口支持全双工通讯,也就是使用一根线发送数据的同时,用另一根线接收数据。串口通讯最重要的参数是波特率、数据位、停止位和奇偶校验,对于两个通讯的端口,这些参数是必须设置为相同的。
也可以参考我的这篇文章STM32开发(7)----CubeMX配置串口通讯(轮询方式)
Tpye-C接口连接到串口芯片,具有供电和串口传输数据的功能,下载程序也是通过串口传输数据的功能把固件传输到K210芯片上的。
Type-C接口是目前主流的数据传输连接接口,市面上很多智能手机也是使用Type-C接口给手机充电和传输数据。Type-C接口是可以正反插的,不用担心反向拿反而插不进的问题。
通用UART 为UART1、UART2 和UART3,支持异步通信(RS232 和RS485 和IRDA,通信速率可达到5Mbps。UART 支持CTS 和RTS 信号的硬件管理以及软件流控(XON 和XOFF)。3 个接口均可被DMA 访问或者CPU 直接访问。每次传输数据为8字节,支持异步时钟,可单独配置数据时钟,实现全双工模式,保证两个时钟域中数据同步。
uart默认为RS232模式,也可以配置为软件可编程式RS485模式。
K210 Tpye-C接口连接K210的IO4和IO5接口,其中IO4为K210芯片的接收引脚,IO5为K210芯片的发送引脚。
对应的头文件 uart.h
为用户提供以下接口
? uart_init
? uart_config (0.6.0 后不再支持,请使用 uart_configure)
? uart_configure
? uart_send_data
? uart_send_data_dma
? uart_send_data_dma_irq
? uart_receive_data
? uart_receive_data_dma第 11 章 通用异步收发传输器 (UART) 125
? uart_receive_data_dma_irq
? uart_receive_data_dma_irq
? uart_irq_register
? uart_irq_deregister
? uart_set_work_mode
? uart_set_rede_polarity
? uart_set_rede_enable
? uart_set_tat
? uart_set_det
? uart_debug_init
? uart_handle_data_dma
新建一个uart的文件夹,在里面新建main.c,以后也都是这样,我们每一个实验放一个文件夹
#include "fpioa.h"
#include "uart.h"
#include <string.h>
// 硬件IO口,与原理图对应
#define PIN_UART_USB_RX (4)
#define PIN_UART_USB_TX (5)
/*****************************SOFTWARE-GPIO********************************/
// 软件GPIO口,与程序对应
#define UART_USB_NUM UART_DEVICE_3
/*****************************FUNC-GPIO************************************/
// GPIO口的功能,绑定到硬件IO口
#define FUNC_UART_USB_RX (FUNC_UART1_RX + UART_USB_NUM * 2)
#define FUNC_UART_USB_TX (FUNC_UART1_TX + UART_USB_NUM * 2)
/**
* Function hardware_init
* @brief 硬件初始化,绑定GPIO口
* @param[in] void
* @param[out] void
* @retval void
* @par History 无
*/
void hardware_init(void)
{
// fpioa映射
fpioa_set_function(PIN_UART_USB_RX, FUNC_UART_USB_RX);
fpioa_set_function(PIN_UART_USB_TX, FUNC_UART_USB_TX);
}
/**
* Function main
* @brief 主函数,程序的入口
* @param[in] void
* @param[out] void
* @retval 0
* @par History 无
*/
int main(void)
{
hardware_init();
// 初始化串口3,设置波特率为115200
uart_init(UART_USB_NUM);
uart_configure(UART_USB_NUM, 115200, UART_BITWIDTH_8BIT, UART_STOP_1, UART_PARITY_NONE);
/* 开机发送hello yahboom! */
char *hello = {"hello world!\n"};
uart_send_data(UART_USB_NUM, hello, strlen(hello));
char recv = 0;
while (1)
{
/* 等待串口信息,并通过串口发送出去 */
while(uart_receive_data(UART_USB_NUM, &recv, 1))
{
uart_send_data(UART_USB_NUM, &recv, 1);
}
}
return 0;
}
代码写好后,我们开始编译,注意:如果你编译过程中出现错误,可以先make clean掉之前生成的过程文件,重新生成
cd build
//注意这里的目标文件目录改成uart,和刚才新建的文件夹名称一致
cmake .. -DPROJ=uart -G "MinGW Makefiles"
make
烧录
然后来看看结果吧
那么还有其他方式进行串口输出调试吗?我们习惯用printf进行调试;这个系统初始化时候已经帮我们做好了一起来看看user_entry.c文件
系统在初始化bsp是有已经注册系统输出回调函数,printf 时会调用该函数。系统默认使用 UART3,如果需要修改 UART 则调用
uartdebuginit 函数,具体请到 uart 章节查看该函数;
void _init_bsp(int core_id, int number_of_cores)
{
extern int main(int argc, char* argv[]);
extern void __libc_init_array(void);
extern void __libc_fini_array(void);
if (core_id == 0)
{
/* Initialize bss data to 0 */
init_bss();
/* Init UART */
fpioa_set_function(4, FUNC_UART3_RX);
fpioa_set_function(5, FUNC_UART3_TX);
uart_debug_init(UART_DEVICE_3);
/* Init FPIOA */
fpioa_init();
/* Register finalization function */
atexit(__libc_fini_array);
/* Init libc array for C++ */
__libc_init_array();
/* Get reset status */
sysctl_get_reset_status();
/* Init plic */
plic_init();
/* Enable global interrupt */
sysctl_enable_irq();
}
因此我们直接使用printf之类的函数也是可以的,写个简单的示例如下:
这里注意包含头文件
#include <bsp.h>
#include <sysctl.h>
int main(void)
{
int data;
printf("Hello world\n");
/* Clear stdin buffer before scanf */
sys_stdin_flush();
scanf("%d", &data);
printf("\nData is %d\n", data);
while(1)
continue;
return 0;
}
代码编译
cd build
//注意这里的目标文件目录改成uart,和刚才新建的文件夹名称一致
cmake .. -DPROJ=printf -G "MinGW Makefiles"
make
烧录
这个方式是不是更简单?以后我们就直接用printf进行打印了
本章介绍了K210 串口通讯的相关知识
K210总共有三个,分别是UART1,UART2和UART3;uart默认使用RS232模式,可以另外配置成可编程式RS485模式;uart的引脚如果映射到其他硬件引脚上,需要连接其他串口芯片如CH340上才可以显示数据。
注册系统输出回调函数,printf 时会调用该函数。系统默认使用 UART3,如果需要修改 UART 则调用
uartdebuginit 函数,以后我们直接使用printf进行调试即可