K210学习记录(2)——UART(串口)
0、引言
本系列博客仅作为本人学习K210单片机的学习记录,主要学习其内部资源使用,作为初学者难免有错误之处,如有发现还望指出。
硬件:Sipeed Maix Dock开发板(推荐官方KD233开发板)
软件:Kendryte IDE(基于VS Code 开发)
文档:
Kendryte IDE使用手册
Standalone SDK编程指南
芯片技术规格书
SDK:
Kendryte SDK
MaixPy/drive
1、UART——interrupt
以下代码为官方代码库“kendryte_uart-interrupt-standalone”修改而成,实现的功能为将电脑发送的字符串,在中断回调函数中存入缓存v_buf中,字符串接收完成后,再将v_buf中的数据上传回电脑。管脚配置如下所示
main.c
#include <fpioa.h>
#include <gpio.h>
#include <stdio.h>
#include <string.h>
#include <sysctl.h>
#include <uart.h>//UART_NUM位于uart.h中 ,用于定义所使用的串口号
//#define UART_NUM UART_DEVICE_3
uint32_t v_uart_num = UART_NUM;//打印字符串,通过指针
void uart_print(const char const *str) {uart_send_data(UART_NUM, str, strlen(str));
}//发送中断回调函数(想不到用途)
int on_uart_send(void *ctx) {uint8_t v_uart = *((uint32_t *)ctx) + 1 + 0x30;//注销中断函数,保证该功能单次使用,否则会陷入局部死循环。uart_irq_unregister(UART_NUM, UART_SEND);uart_print("Send ok Uart\n"); //测试用uart_send_data(UART_NUM, (char *)&v_uart, 1); //标准发送程序,位于uart.creturn 0;
}int main() {plic_init();//中断初始化sysctl_enable_irq();//开启系统中断uart_init(UART_NUM); //初始化配置串口。通道3uart_configure(UART_NUM, 115200, 8, UART_STOP_1, UART_PARITY_NONE);//接收中断或 DMA 触发 FIFO 深度,当 FIFO 中的数据大于等于该值时触发中断或 DMA传输。uart_set_receive_trigger(UART_NUM, UART_RECEIVE_FIFO_8);//串口中断配置(通道、接收中断、回调函数)uart_irq_register(UART_NUM, UART_RECEIVE, on_uart_recv, NULL, 2);//发送中断配置// uart_set_send_trigger(UART_NUM, UART_SEND_FIFO_0);//当发送事件产生,触发中断及回调函数(想不到用途)// uart_irq_register(UART_NUM, UART_SEND, on_uart_send, &v_uart_num, 2);//发送字符串char *hel = {"hello world!\n"};uart_send_data(UART_NUM, hel, strlen(hel));while (1) {if (uart_recv_ztj) //当字符串接收完成,uart_recv_ztj置高{uart_send_data(UART_NUM, v_buf, uart_recv_len);//将收到的数据发送回去uart_recv_ztj = 0;//清除标志位}}
}
uart.h(其他部分与官方提供的库一致,后文不再赘述)
#define BUF_LEN 200//定义接收最大长度
#define UART_NUM UART_DEVICE_3//定义使用的通道
extern char v_buf[BUF_LEN];//将缓存配置位全局变量
extern char uart_recv_ztj; //接收数据状态机
extern int uart_recv_len; //实际接收到的数据长度void on_uart_recv(void);//中断函数,需要在uart_irq_register中配置
uart.c(可根据自己实际的报文格式,对代码进行二次修改)
char v_buf[BUF_LEN]; //接收数据缓冲区
char uart_recv_ztj = 0; //接收状态机
int uart_recv_len = 0;//实际长度//接收中断回调参数,处理接收数据
void on_uart_recv(void) {size_t i = 0;for (i = 0; i < BUF_LEN; i++) {//以下两行为官方所采用判断是否接收完成的代码,不完全理解其含义if (uart[UART_DEVICE_3]->LSR & 1)v_buf[i] = (char)(uart[UART_DEVICE_3]->RBR & 0xff);else {uart_recv_ztj = 1; //接收完成uart_recv_len = i; //将真实长度传递break;//跳出循环}}
}
测试结果如下所示
详情请参考 《Standalone SDK编程指南》——通用异步收发传输器 (UART)部分
2、UART——DMA
使用串口接收触发中断,后调用DMA收数据,再将数据发出去,其他函数看了很久,没弄得明白,在此不表。
#include <fpioa.h>
#include <gpio.h>
#include <stdio.h>
#include <string.h>
#include <sysctl.h>
#include <uart.h>//回调函数
void ztj() {uart_receive_data_dma(UART_NUM, DMAC_CHANNEL1, v_buf, 10);//将数据通过DMA方式接收uart_send_data_dma(UART_NUM, DMAC_CHANNEL0, v_buf, 10);
}int main() {dmac_init();plic_init(); //中断初始化sysctl_enable_irq(); //开启系统中断gpio_init(); //初始化GPIOgpio_set_drive_mode(0, GPIO_DM_OUTPUT); //将GPIO 0配置为输出模型gpio_set_pin(0, GPIO_PV_HIGH); // GPIO 0 输出高//初始化配置串口。通道3uart_init(UART_NUM);uart_configure(UART_NUM, 115200, 8, UART_STOP_1, UART_PARITY_NONE);//接收中断或 DMA 触发 FIFO 深度,当 FIFO 中的数据大于等于该值时触发中断或// DMA传输。// uart_set_receive_trigger(UART_NUM, UART_RECEIVE_FIFO_8);//串口中断配置(通道、接收中断、回调函数)uart_irq_register(UART_NUM, UART_RECEIVE, ztj, NULL, 1);//发送字符串char *hel = {"hello world!\n"};// uart_send_data(UART_NUM, hel, strlen(hel));uart_send_data_dma(UART_NUM, DMAC_CHANNEL0, hel, strlen(hel));while (1) {gpio_set_pin(0, 1);msleep(2000);gpio_set_pin(0, 0);msleep(2000);}
}
3、双串口使用
FPIOA很大程度方便了硬件设计,将GPIO 34/35 配置为UART1 RX/TX,GPIO 4/5 配置为UART3 RX/TX。
关于两个串口的配置也相对简单,再库函数中修改为对应的串口信道即可,详情见代码。
程序流程:使用UART3中断来接收PC下发的字符串,接收完成后用UART1再发送回PC。
main.c
#include <fpioa.h>
#include <gpio.h>
#include <stdio.h>
#include <string.h>
#include <sysctl.h>
#include <uart.h>int main() {plic_init(); //中断初始化sysctl_enable_irq(); //开启系统中断gpio_init(); //初始化GPIOgpio_set_drive_mode(0, GPIO_DM_OUTPUT); //将GPIO 0配置为输出模型gpio_set_pin(0, GPIO_PV_HIGH); // GPIO 0 输出高uart_init(UART_NUM); //初始化配置串口。通道3uart_configure(UART_NUM, 115200, 8, UART_STOP_1, UART_PARITY_NONE);uart_init(UART_DEVICE_1); //初始化配置串口。通道1uart_configure(UART_DEVICE_1, 115200, 8, UART_STOP_1, UART_PARITY_NONE);//接收中断或 DMA 触发 FIFO 深度,当 FIFO 中的数据大于等于该值时触发中断或//DMA传输。 uart_set_receive_trigger(UART_NUM, UART_RECEIVE_FIFO_8);//串口中断配置(通道、接收中断、回调函数)uart_irq_register(UART_NUM, UART_RECEIVE, on_uart_recv, NULL, 2);//发送中断配置// uart_set_send_trigger(UART_NUM, UART_SEND_FIFO_0);//当发送事件产生,触发中断及回调函数(想不到用途)// uart_irq_register(UART_NUM, UART_SEND, on_uart_send, &v_uart_num, 2);//发送字符串char *hel = {"hello world!\n"};uart_send_data(UART_NUM, hel, strlen(hel));while (1) {gpio_set_pin(0, 1);msleep(2000);gpio_set_pin(0, 0);msleep(2000);}
}
uart.c
//接收中断回调参数,处理接收数据
void on_uart_recv(void) {size_t i = 0;for (i = 0; i < BUF_LEN; i++) {if (uart[UART_DEVICE_3]->LSR & 1)v_buf[i] = (char)(uart[UART_DEVICE_3]->RBR & 0xff);else {uart_recv_ztj = 1; //接收完成uart_recv_len = i; //将真实长度传递//uart_send_data(UART_NUM, v_buf, uart_recv_len);break;}}if (uart_recv_ztj) //当字符串接收完成,uart_recv_ztj置高{// uart_send_data(UART_NUM, v_buf, uart_recv_len); //将收到的数据发送回去uart_send_data_dma(UART_DEVICE_1, DMAC_CHANNEL0, v_buf, uart_recv_len);//使用DMA发送数据uart_recv_ztj = 0; //清除标志位}
}
测试结果
参考资料
《Kendryte IDE使用手册》
《Standalone SDK编程指南》
《芯片技术规格书》
K210学习记录(1)——GPIO与软件使用
K210学习记录(2)——UART(串口)相关推荐
- TM4C123G学习记录(6)--UART
因为想申请 CSDN 博客认证需要一定的粉丝量,而我写了五年博客才 700 多粉丝,本文开启关注才可阅读全文,很抱歉影响您的阅读体验 为了准备电赛临时学一下TM4C123G,简单记录学习内容 大家可以 ...
- STM32Cube学习篇(1)---UART串口通信
学习目标: 熟悉串口的通信原理 掌握串口基本配置 掌握UART收发中断控制 1.串口通信协议 1.1物理层 串口通讯的物理层有很多标准及变种,RS-232 标准主要规定了信号 的用途.通讯接口以及信号 ...
- 学习记录:USART—串口通讯
目录 1.串口通讯协议简介 1.1物理层 1.2 电平标准 2.协议层 3.printf函数的支持代码 4.usart.h程序 5.main.c主函数 6.实验现象 1.串口通讯协议简介 对于通讯协议 ...
- K210学习记录(3)——kmodel生成与使用
0.引言 2022更新说明:这块芯片水太深,能不碰最好别碰,官方当时留的资料实在太少(或者说我太菜). 如果要调用最新的nncase工具箱所支持的算子,最好采用嘉楠自家工具链+VScode进行开发.不 ...
- 日常学习记录一_mcufly串口下载
MCUFLY下载 环境是STM32f407 第一部分 操作步骤 板卡部分注意板卡的引脚,boot0接高电平,boot1接低电平. 电脑打开mcufly,电脑通过usb串口线,连接STM32的USART ...
- stm32cubemx hal学习记录:JY901S串口
一.配置过程 1.配置RCC.SYS.USART1.时钟84MHz 2.配置TIM6,10ms,允许中断,作为控制周期 3.配置USART3,允许中断,其他默认 二.代码编写 1.移植入jy901s的 ...
- 正点原子 例程学习记录 实验四 串口实验
断断续续地看了一阵子 ,一度被工程下无数的文件劝退,今又看了开发指南,发现其实没有编译的工程包含的文件并不多,绝大部分文件都是编译后才出现的.其中还有很多是系统文件,不需要自己写. 观察还没有编译过的 ...
- K210学习笔记(三) K210与STM32进行串口通信,K210发STM收
文章目录 前言 一.以/r/n为结尾 二.K210端代码 三.STM32端 3.1 main函数 四.测试结果 4.1当收到1时 4.2当收到2时 4.3 测试视频 总结 前言 前面我们讲了STM32 ...
- 学习记录--蓝牙模块HC05(串口收发)
主要实现:PC上位机与蓝牙之间的通信(收发) 一,HC05模式等一系列设置 参考博客: (11条消息) stm32之蓝牙模块HC-05使用_一剃解千愁的博客-CSDN博客_stm32蓝牙模块的使用 ( ...
最新文章
- 便携式不锈钢管道焊接机器人_304不锈钢管居然可以发黑!?
- python 通过shutil.move移动图片出错xe5\xb8\xb8\xe7
- 中专计算机技术难吗,中专学计算机专业难不难?
- 谷歌40人发表59页长文:为何真实场景中ML模型表现不好?
- 垂直领域出海,多语言预训练好使吗?
- .NET Core 下使用 Exceptionless 记录日志
- Codeforces Round #590 (Div. 3) F. Yet Another Substring Reverse 子集dp
- java表格怎么添加按钮_1.6.2 在表格中添加按钮
- Oracle v$session/v$sql 表
- ISE_FIFO_IP核接口测试(一)
- 唐山大地震 昨夜万人首映 尚雯婕演唱《23秒,32年》使观众情绪得以第二次温暖爆发...
- CentOS linux系统将UTC时间修改为CST时间
- 软考网络工程师备考经验
- 机器学习中的忒修斯之船:那些“愚弄”专家的著名悖论
- 小牛采购管理系统 v3.01 bt
- 【OpenCV】双目相机测距及其深度恢复原理及其算法流程
- c语言1087答案,1087 有多少不同的值(C语言)
- 基于arduino的智能家居系统
- Wannafly Winter Camp Day 3 G排列(贪心)
- 精选文章:人生第一辆车购车八大流程及提车注意事项之最强攻略