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(串口)相关推荐

  1. TM4C123G学习记录(6)--UART

    因为想申请 CSDN 博客认证需要一定的粉丝量,而我写了五年博客才 700 多粉丝,本文开启关注才可阅读全文,很抱歉影响您的阅读体验 为了准备电赛临时学一下TM4C123G,简单记录学习内容 大家可以 ...

  2. STM32Cube学习篇(1)---UART串口通信

    学习目标: 熟悉串口的通信原理 掌握串口基本配置 掌握UART收发中断控制 1.串口通信协议 1.1物理层 串口通讯的物理层有很多标准及变种,RS-232 标准主要规定了信号 的用途.通讯接口以及信号 ...

  3. 学习记录:USART—串口通讯

    目录 1.串口通讯协议简介 1.1物理层 1.2 电平标准 2.协议层 3.printf函数的支持代码 4.usart.h程序 5.main.c主函数 6.实验现象 1.串口通讯协议简介 对于通讯协议 ...

  4. K210学习记录(3)——kmodel生成与使用

    0.引言 2022更新说明:这块芯片水太深,能不碰最好别碰,官方当时留的资料实在太少(或者说我太菜). 如果要调用最新的nncase工具箱所支持的算子,最好采用嘉楠自家工具链+VScode进行开发.不 ...

  5. 日常学习记录一_mcufly串口下载

    MCUFLY下载 环境是STM32f407 第一部分 操作步骤 板卡部分注意板卡的引脚,boot0接高电平,boot1接低电平. 电脑打开mcufly,电脑通过usb串口线,连接STM32的USART ...

  6. stm32cubemx hal学习记录:JY901S串口

    一.配置过程 1.配置RCC.SYS.USART1.时钟84MHz 2.配置TIM6,10ms,允许中断,作为控制周期 3.配置USART3,允许中断,其他默认 二.代码编写 1.移植入jy901s的 ...

  7. 正点原子 例程学习记录 实验四 串口实验

    断断续续地看了一阵子 ,一度被工程下无数的文件劝退,今又看了开发指南,发现其实没有编译的工程包含的文件并不多,绝大部分文件都是编译后才出现的.其中还有很多是系统文件,不需要自己写. 观察还没有编译过的 ...

  8. K210学习笔记(三) K210与STM32进行串口通信,K210发STM收

    文章目录 前言 一.以/r/n为结尾 二.K210端代码 三.STM32端 3.1 main函数 四.测试结果 4.1当收到1时 4.2当收到2时 4.3 测试视频 总结 前言 前面我们讲了STM32 ...

  9. 学习记录--蓝牙模块HC05(串口收发)

    主要实现:PC上位机与蓝牙之间的通信(收发) 一,HC05模式等一系列设置 参考博客: (11条消息) stm32之蓝牙模块HC-05使用_一剃解千愁的博客-CSDN博客_stm32蓝牙模块的使用 ( ...

最新文章

  1. 便携式不锈钢管道焊接机器人_304不锈钢管居然可以发黑!?
  2. python 通过shutil.move移动图片出错xe5\xb8\xb8\xe7
  3. 中专计算机技术难吗,中专学计算机专业难不难?
  4. 谷歌40人发表59页长文:为何真实场景中ML模型表现不好?
  5. 垂直领域出海,多语言预训练好使吗?
  6. .NET Core 下使用 Exceptionless 记录日志
  7. Codeforces Round #590 (Div. 3) F. Yet Another Substring Reverse 子集dp
  8. java表格怎么添加按钮_1.6.2 在表格中添加按钮
  9. Oracle v$session/v$sql 表
  10. ISE_FIFO_IP核接口测试(一)
  11. 唐山大地震 昨夜万人首映 尚雯婕演唱《23秒,32年》使观众情绪得以第二次温暖爆发...
  12. CentOS linux系统将UTC时间修改为CST时间
  13. 软考网络工程师备考经验
  14. 机器学习中的忒修斯之船:那些“愚弄”专家的著名悖论
  15. 小牛采购管理系统 v3.01 bt
  16. 【OpenCV】双目相机测距及其深度恢复原理及其算法流程
  17. c语言1087答案,1087 有多少不同的值(C语言)
  18. 基于arduino的智能家居系统
  19. Wannafly Winter Camp Day 3 G排列(贪心)
  20. 精选文章:人生第一辆车购车八大流程及提车注意事项之最强攻略

热门文章

  1. call apply 和 bind的区别
  2. 按一个按钮会随机死人_玩家集体吐槽支机石:坑死人不偿命的概率
  3. H3C ER3100路由器由于FAST路由器的ARP欺骗导致的断网的处理方法
  4. 华为鲲鹏HCIA考试-练习06
  5. 关于MPIO多路径存储课堂笔记
  6. 微信游戏背后蕴藏的大数据逻辑
  7. linux 进程内存 dump,linux core dump
  8. Java数据结构-双向链表的实现
  9. 关于clrscr函数的问题
  10. ASP.NET的IIS和IIS express配置的老大难问题