高云FPGA系列教程(9):cmd-parser串口命令解析器移植

文章目录

    • @[toc]
      • cmd-parser库简介
      • cmd-parser库源码获取
      • GW1NSR-4C移植cmd-parser
      • 实际测试
      • cmd-parse命令解析器优化

本文是高云FPGA系列教程的第9篇文章。

上一篇文章介绍片上ARM Cortex-M3硬核处理器串口外设的使用,演示轮询方式和中断方式接收串口数据,并进行回环测试。

本文在上一篇工程的基础上,移植cmd-parser串口命令解析器,到高云GW1NSR-4C ARM处理器上,实现3个命令:

led_on:点亮LED
led_off:熄灭LED
get_sysclk:查询处理器频率

参考文档:Gowin_EMPU(GW1NS-4C)软件编程 参考手册

cmd-parser库简介

cmd-parser,是一款非常轻量、高效的命令解析器,作者jiejie,整个项目只有两个文件:cmd.c和cmd.h,采用哈希算法进行匹配,匹配速度非常快,占用资源也很少。

cmd-parser遵循 Apache License v2.0 开源协议。鼓励代码共享和尊重原作者的著作权,可以自由的使用、修改源代码,也可以将修改后的代码作为开源或闭源软件发布,但必须保留原作者版权声明

开源地址:

//Gitee
https://gitee.com/jiejieTop/cmd-parser
//Github
https://github.com/jiejieTop/cmd-parser

国内推荐使用Gitee码云平台访问。

cmd-parser库源码获取

访问以上开源地址下载cmd-parse源码,或通过如下命令clone到本地:

$ git clone https://gitee.com/jiejietop/cmd-parser.git --depth=1Cloning into 'cmd-parser'...
remote: Enumerating objects: 8, done.
remote: Counting objects: 100% (8/8), done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 8 (delta 0), reused 8 (delta 0), pack-reused 0
Receiving objects: 100% (8/8), 7.39 KiB | 7.39 MiB/s, done.

整个项目非常简单,只有两个文件是我们需要的,可以参考README文档和示例来帮助我们完成移植。

GW1NSR-4C移植cmd-parser

首先把cmd.c和cmd.h添加到用户目录,并在Keil环境添加到工程中。

串口初始化,并使能接收中断:

void uart0_init(uint32_t BaudRate)
{UART_InitTypeDef UART_InitStruct;NVIC_InitTypeDef InitTypeDef_NVIC;UART_InitStruct.UART_Mode.UARTMode_Tx = ENABLE;UART_InitStruct.UART_Mode.UARTMode_Rx = ENABLE;UART_InitStruct.UART_Int.UARTInt_Tx = DISABLE;UART_InitStruct.UART_Int.UARTInt_Rx = ENABLE;   //开启接收中断UART_InitStruct.UART_Ovr.UARTOvr_Tx = DISABLE;UART_InitStruct.UART_Ovr.UARTOvr_Rx = DISABLE;UART_InitStruct.UART_Hstm = DISABLE;UART_InitStruct.UART_BaudRate = BaudRate;//Baud RateUART_Init(UART0, &UART_InitStruct);//Enable UART0 interrupt handlerInitTypeDef_NVIC.NVIC_IRQChannel = UART0_IRQn;InitTypeDef_NVIC.NVIC_IRQChannelPreemptionPriority = 1;InitTypeDef_NVIC.NVIC_IRQChannelSubPriority = 1;InitTypeDef_NVIC.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&InitTypeDef_NVIC);
}void UART0_Handler(void)
{char rx = 0;if(UART_GetRxIRQStatus(UART0) == SET){rx = UART_ReceiveChar(UART0);buf[buf_idx] = rx;buf_idx++;cnt_idle = 0;}UART_ClearRxIRQ(UART0);
}

定义3个用户命令和对应执行的函数,并通过REGISTER_CMD宏完成命令注册。

void led_on(void)
{gpio_write(0xaaaa);
}void led_off(void)
{gpio_write(0);
}void get_sysclk(void)
{printf("SystemCoreClock = %d\r\n", SystemCoreClock);printf("APB1 CLK = %d\r\n", PCLK1);printf("APB2 CLK = %d\r\n", PCLK2);printf("AHB CLK  = %d\r\n", HCLK);
}REGISTER_CMD(led_on, led_on);
REGISTER_CMD(led_off, led_off);
REGISTER_CMD(get_sysclk, get_sysclk);

主函数中当收到串口命令时进行解析,并执行对应的函数:

int main(void)
{cmd_init();delay_init();uart0_init(115200); //enable rx interruptprintf("SystemCoreClock = %d\r\n", SystemCoreClock);printf("APB1 CLK = %d\r\n", PCLK1);printf("APB2 CLK = %d\r\n", PCLK2);printf("AHB CLK  = %d\r\n", HCLK);printf("Hello GW1NSR-4C SoC(ARM Cortex-M3)\r\n");printf("UART0 cmd-parser Example\r\n");while(1){//长时间没有接收到串口数据if(buf_idx != 0)cnt_idle++;else cnt_idle = 0;if(cnt_idle > 5000)   //明显感觉=500000{cmd_parsing((char *)buf);//命令解析并执行printf("cmd: %s\r\n", buf);cnt_idle = 0;buf_idx = 0;memset(buf, 0, sizeof(buf)/sizeof(buf[0]));}}
}

实际测试

编译,下载,运行。发送对应的串口命令,可以看到执行了对应的功能。

cmd-parse命令解析器优化

为了满足部分带返回值的函数支持,我们对源代码进行一点改动,注册的回调函数改为int类型返回值:

//typedef void (*cmd_handler)(void);
typedef int (*cmd_handler)(void);//void cmd_parsing(char *str)
int cmd_parsing(char *str)
{cmd_t *index;unsigned int hash = _cmd_hash(str);for (index = _cmd_begin; index < _cmd_end; index = _get_next_cmd(index)) {if (hash == index->hash) {if (_cmd_match(str, index->cmd) == 0) {
//                index->handler();return index->handler();break;}}}
}

同样,对用户函数也进行修改:

#include "main.h"uint8_t rx = 0;
uint8_t buf[256];
uint16_t buf_idx = 0;
uint32_t cnt_idle = 0;
uint8_t flag = 0;
int ret = 0;int led_on(void)
{gpio_write(0xaaaa);return 0;
}int led_off(void)
{gpio_write(0);return 1;
}int get_sysclk(void)
{printf("SystemCoreClock = %d\r\n", SystemCoreClock);printf("APB1 CLK = %d\r\n", PCLK1);printf("APB2 CLK = %d\r\n", PCLK2);printf("AHB CLK  = %d\r\n", HCLK);return -1;
}REGISTER_CMD(led_on, led_on);
REGISTER_CMD(led_off, led_off);
REGISTER_CMD(get_sysclk, get_sysclk);int main(void)
{cmd_init();delay_init();uart0_init(115200); //enable rx interruptprintf("SystemCoreClock = %d\r\n", SystemCoreClock);printf("APB1 CLK = %d\r\n", PCLK1);printf("APB2 CLK = %d\r\n", PCLK2);printf("AHB CLK  = %d\r\n", HCLK);printf("Hello GW1NSR-4C SoC(ARM Cortex-M3)\r\n");printf("UART0 RX Interrupt Example\r\n");while(1){//长时间没有接收到串口数据if(buf_idx != 0)cnt_idle++;else cnt_idle = 0;if(cnt_idle > 5000)   //明显感觉=500000{ret = cmd_parsing((char *)buf);//命令解析并执行printf("cmd: %s, ret = %d\r\n", buf, ret);cnt_idle = 0;buf_idx = 0;memset(buf, 0, sizeof(buf)/sizeof(buf[0]));}}
}

测试结果:


本文是高云FPGA系列教程的第9篇文章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/83699.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GLTF编辑器如何快速重置模型原点

1、什么是模型原点&#xff1f; 模型原点是三维建模中的概念&#xff0c;它是指在一个虚拟三维空间中确定的参考点。模型原点通常位于模型的几何中心或基本组件的中心位置。如图所示&#xff1a; 可以看到模型的原点在模型的几何中心 2、模型原点的作用 知道了什么是模型原点&…

ubuntu18.04安装python3.10.13

下载python包: https://www.python.org/downloads/安装关联软件包: apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev执行sudo ./configure --enable-optimizations 此命令是为了在编译 Python 时启用性…

洛谷100题DAY6

26.P1628 合并序列 法一&#xff1a; #include<bits/stdc.h> using namespace std; const int N 1e5 10; int n, cnt; string c, s[N], a[N]; int main() {cin >> n;for(int i 1; i < n; i ){cin >> s[i];}cin >> c;int len c.size();for(int…

PHP初中高级1000道面试题大全(持续更新中50/1000)

目录 1、echo(),print(),print_r(),var_dump()的区别? 2、表单中 get与post提交方法的区别? 3、session与cookie的区别? 4、请说明 PHP 中传值与传引用的区别。什么时候传值什么时候传引用&#xff1f; 5、请解释PHP中的PDO是什么&#xff1f; 6、请解释PHP中的抽象类和…

可转债实战与案例分析——成功的和失败的可转债投资案例、教训与经验分享

实战与案例分析——投资案例研究 股票量化程序化自动交易接口 一、成功的可转债投资案例 成功的可转债投资案例提供了有价值的经验教训&#xff0c;以下是一个典型的成功案例&#xff1a; 案例&#xff1a;投资者B的成功可转债投资 投资者B是一位懂得风险管理的投资者&#…

idea如何关闭项目文件显示的浏览器图标

这里写自定义目录标题 1.idea经常项目文件右上角弹出图标2.setting中Tools 取消勾选浏览器 1.idea经常项目文件右上角弹出图标 2.setting中Tools 取消勾选浏览器

【postgresql 基础入门】表的操作,表结构查看、修改字段类型、增加删除字段、重命名表,对表的操作总是比别人棋高一着

表的操作 ​专栏内容&#xff1a; postgresql内核源码分析手写数据库toadb并发编程 ​开源贡献&#xff1a; toadb开源库 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子…

C语言 ,不用string.h的函数,实现A+B A-B的字符串处理功能。

请输入A串信息:abcdef 请输入B串信息:ac abcdefac B串的长度是:2 B不是A的子串&#xff0c;请重新输入B的值: ad B不是A的子串&#xff0c;请重新输入B的值: abcde A-B后的结果是:f #include <stdio.h>#define MAX 100void fun(char* a, char *b, char *c) {int ai 0;…

Zabbix

Zabbix简介 ●zabbix 是一个基于 Web 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。 ●zabbix 能监视各种网络参数&#xff0c;保证服务器系统的安全运营&#xff1b;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。 ●zabbix 由 2 部…

centost7下安装oracle11g 总结踩坑

1.参考文章 【总结】CentoS下Oracle静默安装流程_正在启动oracle universal installer..._仲冬二三的博客-CSDN博客 https://blog.csdn.net/Liqiong_0412/article/details/126153857? unset DISPLAY 可以跳过图形化检查 这边也卡了很久 [oraclewangmengyuan database]$ .…

创造您梦寐以求的家居设计——Live Home 3D Pro for Mac

您是否曾经想象过在舒适的家中展现自己独特的风格&#xff1f;现在&#xff0c;您可以通过Live Home 3D Pro for Mac来实现您的家居设计梦想&#xff01;这款强大的3D家居设计软件将带给您无限的创作可能性。 Live Home 3D Pro for Mac是一款专业级的家居设计软件&#xff0c;…

Visual Studio 更新:远程文件管理器

Visual Studio 中的远程文件管理器可以用来访问远程机器上的文件和文件夹&#xff0c;通过 Visual Studio 自带的连接管理器&#xff0c;可以实现不离开开发环境直接访问远程系统&#xff0c;这确实十分方便。 自从此功能发布以来&#xff0c;VS 开发团队努力工作&#xff0c;…

算法通关村-----数组中元素出现次数问题

数组中出现次数超过一半的数字 问题描述 数组中有一个数字出现的次数超过数组长度的一半&#xff0c;请找出这个数字。你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。详见剑指offer39 问题分析 最直接的方式就是使用hashMap,遍历给定数组&#xff0c…

基于STC15单片机电子时钟液晶1602串口显示-proteus仿真-源程序

一、系统方案 1、本设计采用STC15单片机作为主控器。 2、液晶1602显示电子时钟。 3、串口显示电子时钟。 4、按键控制开启暂停清零。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 uint count0; uint8 strPhoto[8]; uint wendu0;P3M0 0x…

如何选择适合爬虫的动态住宅套餐

在当今互联网时代&#xff0c;爬虫已经成为了一项非常重要的技术。爬虫技术可以帮助企业和个人获取大量的数据&#xff0c;从而进行数据分析和决策。但是&#xff0c;要想让爬虫技术发挥最大的作用&#xff0c;就需要选择一款动态住宅套餐。那么&#xff0c;在选择动态住宅套餐…

1.3python基础语法——PyCharm

1&#xff09;PyCharm的作用 python的集成开发环境&#xff0c;功能如下&#xff1a; Project管理 智能提示 语法高亮 代码跳转 调试代码 解释代码(解释器) 框架和库 2&#xff09;下载与安装 下载地址&#xff1a;http://www.jetbrains.com/pycharm/download/#sectionwind…

进阶指针(一)

✨博客主页&#xff1a;小钱编程成长记 &#x1f388;博客专栏&#xff1a;进阶C语言 进阶指针&#xff08;一&#xff09; 0.回顾初阶指针1.字符指针1.1 相关面试题 2.数组指针3.指针数组3.1 数组指针的定义3.2 &数组名VS数组名3.3 数组指针的使用 4.数组传参和指针传参4.…

Linux中配置sudo用户访问权限

一、如何在 Linux 中配置 sudo 的访问权限 1.1、添加一个Linux普通用户有 sudo 权限 [root@localhost ~]# useradd test // 创建一个普通用户为:test [root@localhost ~]# [root@localhost ~]# passwd test // 设置用户test密码为:test Changing password for user te…

C# Onnx Yolov8 Cls 分类

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System…

Jenkins学习笔记1

CI 服务器&#xff1a; 认识Jenkins&#xff1a; Jenkins是一个可扩展的持续集成&#xff08;CI&#xff09;引擎&#xff0c;是一个开源项目&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使得软件持续集成变成可能。Jenkins非常易于安装和配置&#xff0c;简单易…