从零玩转CanMV-K230(4)-小核Linux驱动开发参考
前言
K230 芯片是一款基于 RISC-V 架构的端侧 AIoT 芯片,包含两个核心:
CPU 1: RISC-V 处理器,1.6GHz,32KB I-cache, 32KB D-cache, 256KB L2 Cache,128bit RVV 1.0扩展
CPU 0: RISC-V 处理器,0.8GHz,32KB I-cache, 32KB D-cache, 128KB L2 Cache

K230 SDK 提供了不同版本,包含了基于Linux&RT-smart 双核异构系统及RT-smart单系统开发需要用到的源代码,工具链和其他相关资源。
为了更加全面掌握嵌入式和AI的知识,我们选择Linux&RT-smart SDK,本系列教程先介绍简要基于C的相关开发,之后介绍使用MicroPython的开放方法,建议以MicroPython开发为主,快速验证算法和方案,后续对性能有要求时候转化成c;

双系统SDK内存可以配置,在k230_sdk下运行make menuconfig->Memory configuration可以配置各个区域使用的内存空间,也可以直接编译configs/k230_canmv_defconfig修改,各区域说明如下
CONFIG_MEM_TOTAL_SIZE="0x20000000" #内存总体容量 不支持配置
CONFIG_MEM_PARAM_BASE="0x00000000" #参数分区起始地址 不支持配置
CONFIG_MEM_PARAM_SIZE="0x00100000" #参数分区大小 不支持配置
CONFIG_MEM_IPCM_BASE="0x00100000" #核间通讯起始地址 不支持配置
CONFIG_MEM_IPCM_SIZE="0x00100000" #核间通讯共享内存大小 不支持配置
CONFIG_MEM_RTT_SYS_BASE="0x00200000" #大核RTT起始地址 支持配置
CONFIG_MEM_RTT_SYS_SIZE="0x07E00000" #大核RTT使用的地址范围 支持配置
CONFIG_MEM_AI_MODEL_BASE="0x1FC00000" #AI模型加载起始地址 支持配置
CONFIG_MEM_AI_MODEL_SIZE="0x00400000" #AI模型加载地址区域 支持配置
CONFIG_MEM_LINUX_SYS_BASE="0x08000000" #小核linux起始地址 支持配置
CONFIG_MEM_LINUX_SYS_SIZE="0x08000000" #小核linux地址区域 支持配置
CONFIG_MEM_MMZ_BASE="0x10000000" #mmz共享内存其实地址 支持配置
CONFIG_MEM_MMZ_SIZE="0x0FC00000" #mmz 共享内存区域 支持配置
CONFIG_MEM_BOUNDARY_RESERVED_SIZE="0x00001000" #隔离区 不支持配置
大家也可以根据实际需要从官网或者自己编译相应的SDK

下面对于各种驱动的介绍大家也可以参与K210系列教程的内容(https://blog.csdn.net/bin_zhang1/article/details/135519402?fromshare=blogdetail&sharetype=blogdetail&sharerId=135519402&sharerefer=PC&sharesource=bin_zhang1&sharefrom=from_link)
为了方便大家查找相关资料这里提供原理图连接
CanMV-K230 V1.1 开发板位号图文件连接

一、UART
UART概述:通用异步收发器,该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用来与PC进行通信,包括与监控调试器和其它器件,如EEPROM通信。
K230共有5路uart,且uart模块支持红外模式,支持RS485模式,支持DMA,部分端口支持流控,数据位支持5/6/7/8比特,停止位1/2比特,波特率可以支持到1.5MHz。
termios API举例:
int tcgetattr(int fd,struct termios *termios_p);
int tcsetattr(int fd,int potional_actions,struct termios *termios_p);
int tcsendbreak(int fd,int duration);
int tcdrain(int fd);
int tcflush(int fd, int queue_selector);
int tcflow(int fd, int action);
void cfmakeraw(struct termios *termios_p);
speed_t cfgetispeed(const struct termios *termios_p);
speed_t cfgetospeed(const struct termios *termios_p);
int cfsetispeed(struct termios *termios_p, speed_t speed);
int cfsetospeed(struct termios *termios_p, speed_t speed);
int cfsetspeed(struct termios *termios_p, speed_t speed);
二、I2C
I2C:由Philips公司(2006年迁移到NXP)在1980年代初开发的一种简单、双线双向的同步串行总线,它利用一根时钟线和一根数据线在连接总线的两个器件之间进行信息的传递,为设备之间数据交换提供了一种简单高效的方法。每个连接到总线上的器件都有唯一的地址,任何器件既可以作为主机也可以作为从机,但同一时刻只允许有一个主机。
K230共有5路i2c,i2c模块支持主模式,支持DMA,支持7/10比特寻址,支持中断,i2c模块传输速率支持100k/400k/1M/3.4M.
三、GPIO
GPIO:(general porpose intput output)通用输入输出端口的简称。可以通过软件控制其输出和输入,通俗来说就是常用引脚,可以控制引脚的高低电平,对其进行读取或者写入。
k230共有2路gpio,每路gpio包含32个gpio端口,共64个gpio端口,每个gpio端口均支持输入输出功能,支持上升沿中断,下降沿中断,高低电平中断,和双边沿中断。k230的每个gpio端口的中断相互独立互不影响。
方法1:
echo N > /sys/class/gpio/export //将编号为 N 的gpio端口导出到sysfsecho in > /sys/class/gpio/gpioN/direction //将该gpio端口设置成输入模式cat /sys/class/gpio/gpioN/value //读取该gpio端口电平状态echo out > /sys/class/gpio/gpioN/direction //将该gpio端口设置成输出模式echo 1 > /sys/class/gpio/gpioN/value //将该端口输出高电平,注意active_low极性echo 0 > /sys/class/gpio/gpioN/value //将该端口输出低电平,注意active_low极性设置中断属性:
echo rising > /sys/class/gpio/gpioN/edge 上升沿中断,中断只能在direction为in时才可以设置echo falling > /sys/class/gpio/gpioN/edge 下降沿中断echo both > /sys/class/gpio/gpioN/edge 双边沿中断
方法2:
设置好中断模式后通过poll函数监听中断:struct pollfd fds[1];
fd = open("/sys/class/gpio/gpioN/value", O_RDONLY)fds[0].fd = gpio_fd;
fds[0].events = POLLPRI;while(1)
{poll(fds, 1, -1);if (fds[0].revents & POLLPRI){/* 接收中断 */}
}
ioctl操作gpio
用户程序直接操作 /dev/gpiochipN:
struct gpiohandle_request req;
struct gpiohandle_data data;
struct gpioevent_request event_req;
struct gpioevent_data event_data;
struct pollfd poll_fd;
fd = open("/dev/gpiochipN", O_RDONLY);.....req.lineoffsets[0] = 0;
req.flags = GPIOHANDLE_REQUEST_OUTPUT;
req.lines = 1;event_req.lineoffset = 0;
event_req.handleflags = GPIOHANDLE_REQUEST_INPUT;
event_req.eventflags = GPIOEVENT_REQUEST_RISING_EDGE;ioctl(fd, GPIO_GET_LINEHANDLE_IOCTL, &req);
ioctl(fd, GPIO_GET_LINEEVENT_IOCTL, &event_req);close(fd);poll_fd.fd = event_req.fd;
poll_fd.events = POLLIN;while(1)
{data.values[0] = !data.values[0];.....ioctl(req.fd, GPIOHANDLE_SET_LINE_VALUES_IOCTL, &data);.....ret = poll(&poll_fd, 1, 3000);if(ret == 0)....else {read(event_req.fd, &event_data, sizeof(event_data));}
}close(req.fd);
四、Hard-lock
嘉楠自研模块,用于同核不通进程间或异核之间对共享资源的互斥而实现的硬件互斥锁,可用于对共享资源的互斥使用。
k230有128个硬件互斥锁,其作用类似Linux的自旋锁,可以用于对同一资源的互斥。
五、ADC
ADC 即模拟数字转换器(Analog-to-digital converter),是指将连续变化的模拟信号转换为离散的数字信号的器件。真实世界的模拟信号,例如温度、压力、声音或者图像等,需要转换成更容易储存、处理和发射的数字形式。模数转换器可以实现这个功能,在各种不同的产品中都可以找到它的身影。
K230集成一路ADC转换器,共6各通道,分辨率12bit,最高每秒1M次的单通道连续模数转换。
六、WDT
WDT 是watchdog的简称,本质上是一个定时器,软件程序需要每隔一段时间喂一次狗,如果WDT超时则可以产生一个中断信号或复位信号到CPU,由此通过软硬件结合的方式防止程序运行异常而不复位。
wdt,watchdog模块,k230有两路wdt,大小核分别使用一路,wdt支持中断和复位两种模式,默认使用复位模式,即当wdt的超时时间溢出时,直接使soc复位
七、OTP
OTP 主要用于存储安全敏感的机密信息。OTP 集成在安全模块 PUF 中,为整个 SoC 提供安全存储功能,保护根密钥和启动代码等关键数据不被攻击者破坏。大核侧 OTP 驱动主要提供读、写两种功能,可读写区域768bytes 空间。如果产品量产需要用到OTP的读写保护功能等等,请联系我们,我们会提供相关的接口驱动程序。
OTP 集成在安全模块 PUF 中,为整个 SoC 提供安全存储功能,保护根密钥和启动代码等关键数据不被攻击者破坏。小核侧 OTP 驱动主要提供读功能,可读写区域空间为768bytes。Linux 侧 OTP 驱动挂载在 nvmem 框架上,具体的框架结构如下图所示:

八、TS
K230 TS(Temperature Sensor),自研温度传感器,采用 TSMC 12nm 工艺。TS 的应用场景是降频。大核侧 TS 驱动主要提供读功能,在读 TS 之前,首先需要配置 TS 寄存器使能信号、输出模式,然后才能读出芯片的结温。另外,TS 寄存器每 2.6s 读取一次芯片结温。
大核侧 TS 驱动主要提供读功能,在读 TS 之前,首先需要配置 TS 寄存器使能信号、输出模式,然后才能读出芯片的结温。另外,TS 寄存器每 2.6s 读取一次芯片结温。Rt-smart 侧 TS 驱动的结构如下图所示:

九、PWM
PWM是一种对模拟信号电平进行数字编码的方法,通过不同频率的脉冲使用方波的占空比用来对一个具体模拟信号的电平进行编码,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替所需要波形的设备。
K230集成了2路PWM,每一路有3各通道,即通道 0~2 属于PWM0,通道 3~5 属于PWM1(软件上表现为通道 0~5 ),每一路都可输出独立波形。
十、RTC
实时时钟可以提供精确的实时时间,它可以用于产生年、月、日、时、分、秒、星期等信息。
十一、RTCTIMER(HWTIMER)
通过内部计数器模块对内外部脉冲信号进行计数,可以工作在定时器模式和计数器模式。
总结
基于C的开发现在嘉楠提供的API尚不完善,建议以MicroPython开发为主,快速验证算法和方案,后续对性能有要求时候转化成c;
相关文章:
从零玩转CanMV-K230(4)-小核Linux驱动开发参考
前言 K230 芯片是一款基于 RISC-V 架构的端侧 AIoT 芯片,包含两个核心: CPU 1: RISC-V 处理器,1.6GHz,32KB I-cache, 32KB D-cache, 256KB L2 Cache,128bit RVV 1.0扩展 CPU 0: RISC-V 处理器,0.8GHz&am…...
上汽大通汽车CAN数据解析开发服务及技术商用领域详细解析
上汽大通G90是一款集豪华、科技与舒适于一身的中大型MPV,号称“国产埃尔法”。在国内市场,作为“卷王”的G90主要面向中大型MPV市场,满足家庭出行、商务接待和客运租赁等多元化场景需求,在国内市场上取得了不错的销售成绩。在海外…...
基于SCUI的后台管理系统
一、SCUI Admin 官方地址:https://python-abc.xyz/scui-doc/ 高性能中后台前端解决方案,基于 Vue3、elementPlus 持续性的提供独家组件和丰富的业务模板帮助你快速搭建企业级中后台前端任务。 预览地址:https://python-abc.xyz/scui-doc/de…...
使用频谱分析仪:RBW,Res BW,分辨率带宽;Sweep,扫描;noise floor,底噪,如何降低底噪?
RBW与Sweep的定义及其特性阐述: Res BW,即Resolution Bandwidth(分辨率带宽),是衡量仪器分辨信号细节能力的重要参数。当RBW的数值越小,意味着像素点的尺寸更为精细,从而能够观察到更为细微的信…...
项目管理工具Maven(一)
Maven的概念 什么是Maven 翻译为“专家”,“内行”Maven是跨平台的项目管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。什么是理想的项目构建? 高度自动化,跨平台,可重用的组件,标准…...
阿里云ESC服务器一次性全部迁移到另一个ESC
摘要: 在云计算时代,服务器迁移是企业优化资源配置、提升业务灵活性的常见需求。本文将详细介绍如何将阿里云ECS(Elastic Compute Service)服务器一次性迁移到另一个ECS实例。整个迁移过程分为四个关键步骤: 创建自定义…...
搭建分布式Kafka集群
title: 搭建分布式Kafka集群 date: 2024-12-1 14:00:00 categories: - 服务器 tags: - Kafka - 大数据搭建分布式Kafka集群 在主节点上安装Kafka; Kafka使用Zookeeper服务器来存储元数据信息 本次实验环境:Centos 7-2009、Hadoop-3.1.4、JDK 8、Zookeep…...
【后端面试总结】深入解析进程和线程的区别
在操作系统和并发编程中,进程和线程是两个核心概念。它们各自承担着不同的职责,并在多任务处理中发挥着关键作用。本文将从定义、特性、应用场景以及优缺点等多个方面对进程和线程进行详细对比,帮助读者深入理解它们之间的区别。 一、进程和…...
java版电子招投标采购|投标|评标|竞标|邀标|评审招投标系统源码
招投标管理系统是一款适用于招标代理、政府采购、企业采购和工程交易等领域的企业级应用平台。该平台以项目为主线,从项目立项到项目归档,实现了全流程的高效沟通和协作。通过该平台,用户可以实时共享项目数据信息,实现规范化管理…...
SSM 赋能 Vue 助力:新锐台球厅管理系统的设计与实现的辉煌之路
2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常适…...
C++ 并发专题 - C++线程同步的几种方法
一:概述 线程同步是多线程编程中的一个重要概念,它用于控制多个线程之间对共享资源的访问,避免竞态条件(race condition)和数据不一致的问题。线程同步确保在多线程环境中,多个线程访问共享数据时能够按照某…...
使用Python脚本进行编写批量根据源IP进行查询的语句用于态势感知攻击行为的搜索
使用Python脚本进行编写批量根据源IP进行查询的语句 以下根据ip-list集里面的IP地址(可以自行扩充),然后采用srcaddress "{ip}" or 的形式进行打印并存储在路径为:桌面的IOC结果.txt --------------------------代码如…...
Python中的zip/unzip:像拉拉链一样组合数据的艺术
今天让我们一起探讨Python中一个优雅而强大的内置功能: zip 和 unzip 。听名字就知道,它就像我们衣服上的拉链一样,能把两边的数据完美地咬合在一起。 从一个有趣的例子开始 想象你正在开发一个班级管理系统。每个学生都有名字、成绩和评语…...
数电课设·简易数字钟(Quartus Ⅱ)
忽如一夜春风来,千树万树梨花开 —— 《白雪歌诵武判官归京》 岑参 【唐】 目录 简易数字钟 要点剖析: 逐步分析: 端口说明: 代码展示: 分部解释: 代码编译结果: 提醒 : …...
大模型中RAG模型的检索过程是如何实现的?(附最佳实践资料)
RAG模型的检索过程主要涉及以下几个步骤: 向量化(Embedding):首先,需要将外部知识库中的文档转换为计算机能够理解的向量形式。这一步骤通常使用预训练的嵌入模型(如BERT、GPT等)将文本转换为高…...
python:用 sklearn.metrics 评价 K-Means 聚类模型
sklearn 的 metrics 模块提供的聚类模型评价指标如下: ARI 评价法(兰德系数): adjusted_rand_score AMI 评价法(相互信息): adjusted_mutual_info_score V-measure 评分 : completeness_score FMI 评价法 : fowlkes_m…...
Spring依赖注入不同类型的数据
目录 前言 回顾 注入集合 List与set集合 Map集合 前言 前面学习依赖注入时注入的都是对象,这里记录注入的值为集合的情况 回顾 在注入的时候,如果要注入的属性的值为字符串或基本数据类型,用value即可;如果要注入一个对象的…...
Linux大杂烩!!!
Linux 命令大全 https://www.runoob.com/linux/linux-command-manual.html Linux下打印ASCII字符 ASCII码对照表及转换器 [rootuntifa_80 ~]# printf "\x30\n" 0 [rootuntifa_80 ~]# echo -e "\u0030" 0tar、gzip 打包解压命令 参考文章:ta…...
12.19问答解析
概述 某中小型企业有四个部门,分别是市场部、行政部、研发部和工程部,请合理规划IP地址和VLAN,实现企业内部能够互联互通,同时要求市场部、行政部和工程部能够访问外网环境(要求使用OSPF协议),研发部不能访问外网环境…...
C语言——实现杨氏矩阵
什么是杨氏矩阵? 概念: 有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的 eg: 1 2 3 4 5 6 7 8 9 题目: 请编写程序在这样的矩阵中查找某个数字是否存在。 要求:时间复…...
告别插件切换!一款满足你所有挖洞需求的浏览器插件助力高效挖洞
0x01 工具介绍 由于目前网上流通的插件功能都各有千秋,每个插件都有他自己的亮点,每次使用都得按场景去选择插件,为了能够有一款属于自己的完美插件,不用来回倒腾切换,由此GodEyes 诞生了。 它是一款可以帮助安全研究…...
C语言开发者视角:Kandinsky-5.0-I2V-Lite-5s高性能推理引擎调用
C语言开发者视角:Kandinsky-5.0-I2V-Lite-5s高性能推理引擎调用 1. 引言:当静态告警遇上动态生成 想象一下这样的场景:工业监控系统捕捉到设备异常,触发静态告警图片。传统方案中,这张图片需要人工介入分析ÿ…...
华三中小型企业二层组网配置案例一(单ISP+单链路)
1. 组网拓扑某企业内部共划分 4 个业务部门,为实现部门间网络隔离与安全访问控制,分别规划独立网段:192.168.10.0/24、192.168.20.0/24、192.168.30.0/24、192.168.40.0/24。核心交换机作为三层网关,配置各网段 VLANIF 接口地址&a…...
AI结对编程:与快马AI对话式迭代,智能优化你的系统ER图设计
AI结对编程:与快马AI对话式迭代,智能优化你的系统ER图设计 最近在做一个员工管理系统的数据库设计,发现ER图设计是个需要反复推敲的过程。传统方式下,每次修改都要手动调整图形,效率很低。直到尝试了InsCode(快马)平台…...
新手如何借助快马平台AI生成代码,轻松入门蓝桥杯经典题型
作为一个刚接触编程的新手,参加蓝桥杯这样的比赛可能会觉得无从下手。特别是看到题目要求实现算法时,往往不知道如何把问题拆解成代码。最近我发现用InsCode(快马)平台可以很好地解决这个问题,它能根据题目描述直接生成可运行的代码ÿ…...
突破平台限制:WorkshopDL重构Steam创意工坊资源获取体验
突破平台限制:WorkshopDL重构Steam创意工坊资源获取体验 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL WorkshopDL作为一款仅10MB大小的开源工具,通过智…...
8种Prompt优化技巧:解决大模型输出不稳定痛点
8种Prompt优化技巧:解决大模型输出不稳定痛点 在大模型应用落地过程中,开发者常遇到输出结果不可控的问题:同样的需求多次调用返回内容差异巨大、回答偏离核心要求、格式混乱无法直接解析,这些问题严重影响业务流程的稳定性和用户…...
Linux 中的硬链接和软连接是什么,二者有什么区别?
在 Linux 文件系统中,**硬链接(Hard Link)和软链接(Soft Link,又称符号链接 Symbolic Link)**是两种不同的文件引用方式。它们都允许用户通过不同的路径访问同一个文件内容,但它们的实现机制、限…...
Word文档自动更新日期技巧
设置Word文档自动显示当天日期打开Word文档后,可以通过插入日期字段实现每次打开时自动更新为当天日期。方法1:使用日期字段在Word文档中定位光标到需要显示日期的位置。点击菜单栏"插入"→"文本"→"日期和时间"。在弹出的…...
从HuggingFace下载到本地部署:手把手教你定制自己的BertTokenizer工作流
从HuggingFace下载到本地部署:手把手教你定制自己的BertTokenizer工作流 在自然语言处理项目中,一个高效且灵活的分词器往往是整个流程的基石。BertTokenizer作为HuggingFace生态中的核心组件,其预训练版本能够处理绝大多数英文和中文文本处理…...
