1084504793

  • 2025-01-23
  • 发表了主题帖: 《汽车电子硬件设计》绪论

            非常荣幸地获得《汽车电子硬件设计》一书的阅读测评。该书主要讲述的是有关汽车电子在设计上应该如何考虑在提高电子化和智能化的条件下不失其安全性和可靠性。该书前部分主要围绕汽车电子行业发展历程、应用环境、基础知识和可靠性预测及分析进行讲述;后部分则从低压电源设计、输出输出电路、驱动和控制电路、制图设计方式为主题进行讲述,在讲述知识的同时也通过实例和解决方案带入我们犹如亲身设计汽车电子电路一样进行分享。         本书的特点是由浅入深,知识与案例相结合,图表辅助相描述和佐证。非常适合对汽车电子爱好者的阅读和学习。我们也知道近几年我国汽车行业弯道超车,在电动汽车领域发展到现如今在各国遥遥领的地位,最有力的证据是从2009年起中国汽车产销量一直稳居全球第一。这也使得现在家家户户都可以买一辆电动汽车,马路上也是出现大量的汽车停在马路边,大量的充电桩如雨后春笋般出现在马路旁。我们也经常看见有很多的汽车在充电或在马路上行驶时出现自燃问题。我是一名电子爱好者,目前虽然没有汽车,但是对汽车内部的构造也是非常感兴趣的。以前认为电动汽车无非是汽车和电动自行车结合的产物,把以前的油车的发动机改成电机,油箱改成蓄电池。但是看到电动汽车自燃的新闻时,对受害者感到痛心。也非常疑惑为何以前的电动自行车很少有自燃的新闻,但是为何电动汽车就有那么多呢?也是感觉到目前电动自行车也是经常有自燃的新闻,这些新闻也是同电动汽车的出现的逐渐变多。我现在也清晰的记得中学老师说的那句知其然更要知其所以然。意思是知道他是这样的,更要知道它为何这样。所以想借此书找到答案。目前我也没有通读全书,只是在开始阅读时确定自己的阅读目标。而我阅读的目标主要是希望解决以下几点的疑问 电动汽车的架构是什么,里面又是有什么电路 电动汽车的控制单元又是如何控制的,各个模块与控制器的通信方式是不是常听的CAN通信 电动汽车对电池的控制又是如何进行的,有什么手段去防止电池自燃       我也不知道这本书能否解决我的疑问,但是不可否认的是通过阅读这本书会让我对电动汽车的内部结构有一个更加深入的理解。也许可能会在以后购车的时候用上吧。现在也是临近过年,而过年在家也是可以借此书去打发冬季的寒意。过年回家也是回到一个,没有暖气的北方村庄。往年也是躲在被窝里看书或玩手机。也希望广大的坛友可以在过年的时候拿起自己身边的书或开发板读起来或玩起来,将自己阅读的感悟或完开发板的乐趣分享给大家,和大家一起过个愉快的蛇年。    

  • 2025-01-22
  • 回复了主题帖: 祝福2025!回帖即有奖!选取最有心的送5块国产开发板!

    2024年不仅测评了国外的芯片也测评了国内的芯片,发现国内外芯片的差距越来越近了。现在国内芯片依然保持着资料丰富、示例丰富且逻辑清晰和供应周期短等的优点占据一席之地。2025年到了,希望国产芯片能够继续再接再厉, 做出领先世界同等系列的芯片。

  • 回复了主题帖: 【颁奖】 【回顾2024,展望2025】新年抢楼活动来啦!

    个人收件信息已确认

  • 2025-01-21
  • 回复了主题帖: 【新年花灯秀】STM32F401RCT6 花样点灯

    建议那几个字用LED灯显示,这样就更酷了。

  • 回复了主题帖: 【回家】你们抢到从老家回打工所在地的票了吗?

    候补上了,可能因为以往坐这趟车的人比较多,所以多开了四趟车。不过候补的是晚上11点半的车,又得靠充电宝了。

  • 2025-01-20
  • 回复了主题帖: 【回顾2024,展望2025】新年抢楼活动来啦!

    立一个新年Flag,代码无bug

  • 回复了主题帖: 【入围名单】《汽车电子硬件设计》

    已确认信息无误,能按时完成任务。

  • 2025-01-14
  • 加入了学习《新唐 8051单片机教程》,观看 新唐ML51(001).开发环境和资料介绍

  • 回复了主题帖: 新年新挑战,任务打卡赢好礼!

    本帖最后由 1084504793 于 2025-1-16 11:47 编辑 1、   2、   3、    4、  5、  

  • 加入了学习《基于树莓派5的工业智能网关视频》,观看 得捷2024大赛基于树莓派5的智能工业网关视频

  • 加入了学习《【2024 DigiKey创意大赛】+智慧焊接工作台》,观看 智慧焊接工作台

  • 2025-01-13
  • 回复了主题帖: 大规模语言模型从理论到实践目录和个人总体观后感

    是不是因为大规模语言模型的代码不是开源的

  • 回复了主题帖: 拆解一个13年前的JBL苹果专用音响

    放在现在JBL的音响也是价格比较高的,但是效果是真的好。之前用的笔记本都是带JBL的音响。JBL的市场排名也是非常高的。

  • 2025-01-10
  • 回复了主题帖: 【回顾2024,展望2025】新年抢楼活动来啦!

    (1)遇到的问题:在参与Fellowme第三期时搭建环境一直出现编译失败问题,提示缺少一个插件,然后想着安装这个插件。发现WIN10家庭版不能安装,需要专业版。但是在其他电脑上是可以安装的。后来把e2studio卸了重装,但是安装位置和之前的不一样。安装好后就不需要安装插件就可以用了。 (2)实现了完成Followme第三期的任务,大多数的任务也都是从新建工程开始完成的、 (3)最想关注的技术是TouchGFX和人工智能 (4)最想要的有Followme可以举办RK3588板卡的活动 (5)新年flag:学会FreeRTOS、STM32CubemaxIDE软件的使用、Linux等。

  • 2024-12-29
  • 发表了主题帖: 《大规模语言模型:从理论到实践》第三章大预言模型预训练数据

            本周分享的是第三章大预言模型预训练数据,本章介绍的是常见的大语言模型预训练数据的来源、处理方法、预训练数据对大预言模型影响的分析及开源数据集等。 数据来源         文中指出OpenAI在训练GPT-3时所使用的数据集有CommonCrawl、WebText2、Books1、Books2和英文的Wikipedia等。这些数据集都是英文的,不过也从CommonCrawl加入了非英文的数据集进行训练。CommonCrawl的原始数据有45TB,比我的硬盘大了不知好几倍,如果是人去一个个的读的话,一辈子也看不完吧。经过模型的过滤将45TB的数据压缩成570GB,还是电脑的运行速度快。模型将这些数据源大体上分为通用数据和专业数据。         通用数据:包括网页、图书、新闻、对话文本等。特点是:规模大、多样性和易获取等。支持大语言建模和泛化能力。         专业数据:包括多语言数据、科学文本数据、代码及领域特有资料等。可以提升模型的任务解决能力。         典型的大语言模型所使用数据类型的分布情况          从图中不难看出各个模型所使用的数据来源分布差异还是很大的。          通用数据的常用数据源如下           专业数据的种类及包含内容或数据来源   数据处理         数据处理的流程主要有质量过滤、冗余去除、隐私消除和词元切分。     质量过滤        质量过滤是从收集到的数据中删除低质量数据,也是大语言模型训练中的重要步骤。过滤方法主要有基于分类器的方法和基于启发式的方法。           基于分类器的方法的目标是训练文本质量判断模型,利用该模型识别并过滤低质量数据。         基于启发式的方法的规则有语言过滤、指标过滤、统计特征过滤和关键词过滤。              语言过滤:如果一个大语言模型仅关注一种或者几种语言,则可以大幅过滤数据中其他语言的文本。              指标过滤:利用评测指标也可以过滤低质量文本。例如,可以使用语言模型对给定文本的困惑度(Perplexity)进行计算,利用该值可以过滤非自然的句子。              统计特征过滤:针对文本内容可以计算包括标点符号分布、符号字比(Symbol-to-Word Ratio)、句子长度在内的统计特征,利用这些特征过滤低质量数据。               关键词过滤:根据特定的关键词集,可以识别并删除文本中的噪声或无用元素。例如,HTML标签、超链接及冒犯性词语等。   冗余去除         模型数据库中的重复数据会降低大语言模型的多样性,可能导致训练过程不稳定,从而影响模型性能。冗余去除就是去除掉数据中重复的内容。其中文本冗余发现(也称为文本重复检测)是基础任务之一。其目标是发现不同粒度上的文本重复,包括句子、段落、文档等不同级别。   隐私消除         由于绝大多数预训练数据来源于互联网,因此不可避免地会包含涉及敏感或个人信息的用户生成内容,这可能会增加隐私泄露的风险。删除隐私数据最直接的方法是采用基于规则的算法,BigScience ROOTS Corpus在构建过程中就采用了基于命名实体识别的方法。   词元切分         传统的自然语言处理常常是以单词为基本单元,处理前会用这些单词制作一个词表。但是总会有不在词表中的单词。将这些单词用未登录词(Out-of-Vocabulary,OOV)进行表示。基于固定词表的词表示模型对词表大小的选择比较敏感。当词表过小时,未登录词的比例较高,影响模型性能;当词表大小过大时,大量低频词出现在词表中,这些词的词向量很难得到充分学习。理想模式下,词表示模型应能覆盖绝大部分的输入词,并避免词表过大所造成的数据稀疏问题。单词是由词根、词缀等构成,也为了充分学习这些构词模式,提出了子词词元化。如reborn的子词有re和born。         词元分析是将原始文本分割成词元序列的过程。词元切分也是数据预处理中至关重要的一步。         字节对编码(BPE)是一种常见的字词词元算法。该算法采用的词表包含最常见的单词及高频出现的子词。主要包括两部分,一是词元词表的确定;二是全词切分为词元及词元合并为全词的方法。 数据影响分析   数据模型         模型参数量与训练数据量的对比         模型训练达到计算最优的条件是模型大小和训练词元数量应该等比例缩放。   数据质量        数据质量通常被认为是影响大预言模型训练效果的关键因素之一。语言模型在经过清洗的高质量数据上训练数据可以得到更好的性能。   数据多样性  开源数据集        以下是部分开源数据集及部分数据集组成结构  

  • 2024-12-28
  • 回复了主题帖: hi,小伙伴们!这里有棵测评许愿树

    正点原子的Linux或FPGA开发板

  • 2024-12-20
  • 发表了主题帖: 《大规模语言模型:从理论到实践》第一章和第二章认识大规模语言模型

           随着ChatGPT在2022年11月的发布,AI这个词不再是只能从科幻电影才能看到的技术。现在的AI不仅是只能按照固定的格式回答我们的问题,也可以通过一些文字创造出图片或视频等。也有越来越多的厂商将AI嵌入到大多数人离不开的手机当中,使更多的人感受到AI这种高科技给人们的生活带来巨大的便利性和科学性等。作为一名科技爱好者,在感受到AI带来的种种震撼的同时,也非常想认识一下AI是如何工作的?有幸通过阅读共享计划获得《大规模语言模型:从理论到实践》这一本书,使我认识到AI内部是如何运作的,也把我从这本书获得到的知识通过论坛帖子分享给大家。        第一章讲解了大语言模型的概念、发展历程和构建流程。首先是科学性的介绍了大语言模型的概念,即大语言模型是一种由包含数百亿个及以上参数的深度神经网络构建的语言模型,通常使用自监督学习方法通过大量无标注文本进行训练。从这一点认识到我们所使用的AI是由常见的编程语言通过数百亿个参数的深度神经网络语言模型实现的。我们之所以能够流畅的使用也是因为模型在超级电脑上进行大量的训练。参数的多少和训练的文本数量是大语言模型划分的标准。从2019年到2023年五月,大语言模型也是分成三个阶段:基础模型阶段、能力探索阶段和突破发展阶段。          大语言模型随着历史的发展和越来越多模型的开源化,越来越多的公司从事大语言模型的开发,模型种类也是百花齐放。我们所使用的AI也将越来越准确和丰富。大语言模型的构建流程也是逐渐趋于成熟化和标准化。目前大语言模型的构建流程主要有四个阶段,即预训练、有监督微调、奖励建模和强化学习。          在第一章对大语言模型有了基本的概念后,就是进入到了第二章。第二章主要是讲解大语言模型的一些结构。有Transformer结构、LLaMA结构等。这些结构还能再继续细分。如Transformer结构有嵌入表示层、注意力层、前馈层等。Transformer结构的各层之间的关系          嵌入表示层是将每个单词转换为其相对应的向量表示。参考代码为 class PositionalEncoder(nn.Module) def __int__(self, d_model, max_seq_len = 80): super().__int__() self.d_model = d_model #根据pos和i创建一个常量PE矩阵 pe = torch.zeros(max_seq_len, d_model) for pos in range(max_seq_len): for i in range(0, d_model, 2): pe[pos, i] = math.sin(pos / (10000 ** (i/d_model))) pe[pos, i + 1] = math.cos(pos / (10000 ** (i/d_model))) pe = pe.unsqueeze(0) self.register_buffer('pe', pe) def forward(self, x) #使得单词嵌入表示相对大一些 x = x * math.sqrt(self.d_model) #增加位置常量到单词嵌入表中 seq_len = x.size(1) x = x + Variable(self.pe[:,:seq_len], requirzes_grad=Flase).cuda() return x        注意力层的自注意力(Self-Attention)操作是基于Transformer 的机器翻译模型的基本操作,在源语言的编码和目标语言的生成中频繁地被使用以建模源语言、目标语言任意两个单词之间的依赖关系。          全书的章节安排如下           帖子的所有内容摘抄于《大规模语言模型:从理论到实践》一书中,所用的图片来源于书中提供的配套PPT课件获取方式,链接为46705课件.rar_免费高速下载|百度网盘-分享无限制。  

  • 2024-12-19
  • 回复了主题帖: EEWorld邀你来拆解(18期):揭秘随身WiFi、宝马原装索尼打印模块..

    申请拆解随身WiFi 申请理由:电子产品爱好者,也是多年使用随身WiFi的用户 拆解分析:产品外观,接口分布,电池大小,天线分布,芯片分布,散热效果,上网速率等

  • 2024-12-15
  • 回复了主题帖: 【Follow me第二季第3期】作品提交

    Jacktang 发表于 2024-12-15 09:57 两个定时器实现的,不方便画如流程图的原因是 目前没想到如何画才能表达清楚

  • 2024-12-14
  • 发表了主题帖: 【Follow me第二季第3期】作品提交

    本帖最后由 1084504793 于 2025-1-8 08:22 编辑        首先非常感谢电子工程世界论坛和得捷举办的Follow me活动,感谢第二季第三期任务讲解的老师。通过一个月的学习让我学到很多有关瑞萨芯片开发的相关知识。 入门任务   环境搭建        万事开头难,单片机的开发第一步就是搭建开发环境。瑞萨的开发软件是e2Studio,离线安装包有多重下载方式,GitHub的下载链接为:Release v5.5.0 · renesas/fsp · GitHub。当然官网也有下载链接,在此不再贴上去了。软件版本有很多,建议下载5.5最新版本,我也是用这个版本完成任务的。打开GitHub的下载链接点击如下图的红框就可以进行下载        下载好的安装包安装方式也是比较简单的,点击后就可平常的安装方式一样。以下是安装过程,画红框是需要自己勾选的,其他的就按照默认选择就可以。         瑞萨也推出支持MDK和IAR的工程创建软件,可以下载如下图的方框安装使用,使用方式和e2Studio的方式差不多,只是在新建工程时需要选择MDK或IAR做编译软件,MDK也需要进行一些配置,配置方式可以在网上查找。本次使用的板卡是EK-RA6M5,板上带有JLink仿真器,所以e2Studio软件完全够用。     下载调试示例程序         安装好后需要在开始菜单中找到e2Studio的快捷链接,我是找到后拖到桌面,这样方便后续的使用。也可以在安装软件的文件夹中找到,如果没有自定义安装路径的话会安装在C盘的Renesas文件夹下。         瑞萨针对官方多个开发板都提供了丰富的例程,例程的链接是GitHub - renesas/ra-fsp-examples: Example projects for Renesas RA MCU family。可以通过下载压缩包方式下载,也可以直接下载下来。打开安装好的e2Studio软件后导入工程的方法有两种。一种是点击左上角的文件-->从文件系统中打开项目;另外一种是点击项目资源管理器的导入或者点击左上角的文件-->导入,选择常规下的来自文件夹或归档的文件项目。如下图       然后选择导入工程的文件夹路径,建议是e2studio文件夹下的路径,因为创建工程的一些配置文件是放在e2studio文件夹下的,如果选择其他的文件夹路径会出现软件识别多个配置文件,不过也没有影响。本次以_quickstart文件夹下的例程为例。        文件导入后可能是因为版本的问题,直接编译会出现错误,解决方法是打开configuration.xml文件,虽然会有一些警告,但是直接点击确定就可以,然后编译就会没有问题。对其他的例程也是适用的,只不过有些例程还是编译会有问题,这一点就没有办法了。编译的方式是可以点击下图的编译按钮         编译过程和结果会在下方的控制台中显示,编译成功会显示如下内容        接下来是下载程序到板卡上,需要一根microUSB线,需要插入一端只有一个microUSB接口上。然后通过软件下载程序,方式如下图        下载后会提示是否切换仿真界面,如果选择切换会进入仿真界面;选择否还是会在工程文件界面。切换这两个界面的方式如下图        红框是工程文件界面,右侧是仿真界面。程序下载成功后需要点击运行才会运行程序或者USB拔掉重新接上也可以启动程序(该方式适合不用仿真或用J-Link RTT Viewer软件通信用)。启动和仿真按钮如下图所示        本例程的程序下载成功后可以将microUSB线接入J11(USB Full Speed)丝印的接口上。然后可以用串口软件或e2studio的串口插件进行交互,这里我选择串口软件进行交互,波特率是115200,8Bit数据位,1个停止位,无奇偶校验进行连接。连接后出现如下界面        然后可以输入4进行Flash读写测试,测试结果如下   新建工程        在开始Blink和按键任务前,其实刚才介绍的示例程序就可以实现,但是为了更清楚的了解程序是如何实现的,所以从空的工程一步一步进行配置和编写程序实现任务要求的效果。新建工程的方法是点击左上角的文件-->新建-->瑞萨C/C++项目-->Renesas RA。如下图        然后可以双击Renesas RA C/C++ Project,如下图        接下来是命名工程名和选择工程文件保存路径,可以用默认的文件夹路径,也可以取消勾选使用缺省值前的√自定义保存工程文件路径。设置好后点击下一步进入设备型号配置,可以只需修改Device选项即可。在Device选项框的后面点三个点图标找到EK-RA6M5的选项便可。如下图        然后就是多次点击下一步,其中有选择是否添加操作系统的选项。这里没有用到,所以可以多次点击下一步。最后是选择是否创建基础工程还是空的。我这里选择的是空的工程来进行任务效果的实现。   Blink和按键     原理图         Blink和按键的实现需要先看一下原理图,知道LED灯控制引脚和按键引脚接到那个I/O口上。原理图可以在瑞萨官网下载。按键和LED灯控制引脚对应的原理图如下     流程图        因为Blink的实现主要是靠两个定时器实现的,不方便画如流程图中,所以只画了按键处理的流程图       配置        在创建工程是e2studio已经将对应的I/O口进行配置了,所以不需要配置对应引脚。     应用程序代码编写        首先是添加控制LED灯闪烁频率和亮灭程度的两个定时器,创建方法是打开configuration.xml文件,在stacks中点击New stack,在Timers先后创建两个Timer General PWM(r_gpt),如下图        然后分别点击对应的Timer Stack后点击下方的属性,按照如下图的修改进行修改        然后按快捷键Ctrl+S保存修改的配置,点击右上角的Generate Project Content生成对应的程序到工程文件中。        之后是应用程序的编写,首先是创建控制LED灯亮灭的.h文件,这里定义成bsp_led.h,主要是对三个LED灯的亮灭控制,打开后可以发现都是宏定义。宏定义BLUE、GREEN和RED是三个LED灯对应的控制引脚端口号;TURN_GREEN_ON、TURN_GREEN_OFF和TURN_GREEN_TOGGLE分别是控制绿灯亮、灭和状态翻转的。       接下来是新建自己编写的.c和.h文件,可以在src文件夹中直接创建.c和.h文件。软件会自动识别并放入到工程当中一并进行编译。src文件夹一般是用户程序文件夹,hal_entry.c文件也在该文件夹下。        按键对应的文件有bsp_key.c和.h文件。其中.h文件宏定义KEY2_SW1_PIN和KEY1_SW2_PIN是对应两个按键引脚的端口号;KEY_ON和KEY_OFF分别表示按键按下和没有按下。.c文件定义按键扫描函数,入口参数是两个按键的宏定义KEY2_SW1_PIN和KEY1_SW2_PIN,返回的是按键是否被按下(KEY_ON和KEY_OFF)。        两个定时器的回调函数定义在gpt_blinker.c和.h文件中,函数led_duty_frequency_update和led_duty_cycle_update分别是更新控制LED闪烁频率和亮灭程度的定时器设置值;gpt_blinker_Init是两个定时器的初始化;gpt_blinker_callback和gpt_green_callback分别是两个定时器的回调函数。        hal_entry.c是用户函数的入口函数定义的.c文件。和其他的厂家不一样的就是用户函数的入口不是main而是hal_entry。在hal_entry函数中自己编写的函数如下。 gpt_blinker_Init(); while (1) { /* Enable access to the PFS registers. If using r_ioport module then register protection is automatically * handled. This code uses BSP IO functions to show how it is used. */ if( Key_Scan(KEY1_SW2_PIN) == KEY_ON ) { g_board_status.led_intensity = (uint16_t) ((g_board_status.led_intensity + 1) % BLINK_INTENSITY_SUM); key_press_down_flag = 1; } if( Key_Scan(KEY2_SW1_PIN) == KEY_ON ) { g_board_status.led_frequency = (uint16_t)((g_board_status.led_frequency + 1) % BLINK_FREQ_SUM); key_press_down_flag = 1; } if (key_press_down_flag) { key_press_down_flag = 0; led_duty_frequency_update(); led_duty_cycle_update(); } }        首先是初始化两个定时器,然后是不断判断两个按键是否被按下。如果被按下就分别控制闪烁频率和亮度的定时器设置值,最后是根据按键被按下标志key_press_down_flag是否被置1来更新两个定时器的设置值。         两个按键分别修改的是g_board_status.led_intensity和g_board_status.led_frequency的值,这两个变量是取值于gpt_blinker.c文件中的g_pwm_dcs和g_pwm_rates数组的值。如果想修改闪烁频率和亮度的可选项,则可以在gpt_blinker.h文件中进行定义,并修改宏定义BLINK_INTENSITY_SUM和BLINK_FREQ_SUM的值就可以在两个数组中进行添加。     验证        编译和下载成功后的效果如下 [localvideo]9871776905e6c5731e1880063b7449cf[/localvideo]     对应程序源码 基础任务   quad-spi flash和octo-spi flash配置及读写速度测试     原理图          SPI和OSPIFlash对应的原理图如下所示     流程图        测试QSPI和OSPIFlash读写速度的方法是用定时器计算Flash读写一定数据量的时间,对应的简易流程图如下       配置         在新建工程中打开Stacks,按照如下顺序创建stack和属性配置,以及时钟的配置。首先是取消引脚的复用,如下图所示         配置好后依然是按Ctrl+S进行保存并点击Generate Project Content。     应用程序代码编写        这里参考ospi的例程,用J-Link RTT Viewer进行交互,所以可以把ospi例程下的SEGGER_RTT文件夹和common_utils.h。ospi_commands.c和.h文件、ospi_ep.c和.h文件、ospi_test.c和.h文件和qspi_test.c和.h文件是从_quickstart例程中复制下来并做了适当的修改的。        在hal_entry函数中编写如下代码 /* TODO: add your own code here */ fsp_err_t fsp_err; uint32_t ospi_read_result = 0; uint32_t ospi_write_result = 0; uint32_t qspi_read_result = 0; uint32_t qspi_write_result = 0; timer_info_t timer_info; uint32_t block_size_actual = 0; APP_PRINT("\r\nenter the text block size specifying a 2K boundary (eg 24):"); while (1) { block_size_actual = process_input_data(); if ((block_size_actual >= 2) && (block_size_actual <= 64)) { APP_PRINT("%d\r\n",block_size_actual); fsp_err = R_GPT_Open(g_memory_performance.p_ctrl, g_memory_performance.p_cfg); uint32_t ospi_performance_write_result = 0; uint32_t ospi_performance_read_result = 0; uint32_t timer_frequency; R_GPT_InfoGet(g_memory_performance.p_ctrl, &timer_info); timer_frequency = timer_info.clock_frequency; ospi_performance_test (block_size_actual, &ospi_performance_write_result, &ospi_performance_read_result); /* Multiply uSec calcs by 100, to avoid losses due to small results in integer maths * * Scaled to fit within uint32_t */ ospi_write_result = ((100000000 / timer_frequency) * ospi_performance_write_result) / 100; qspi_write_result = ((100000000 / timer_frequency) * qspi_write_test(block_size_actual)) / 100; APP_PRINT("Writing to flash completed\r\n"); APP_PRINT("Reading the text block from external Quad-SPI and Octo-SPI flash memories...\r\n"); ospi_read_result = ((100000000 / timer_frequency) * ospi_performance_read_result) / 100; qspi_read_result = ((100000000 / timer_frequency) * qspi_read_test(block_size_actual)) / 100; APP_PRINT("Reading from flash completed\r\n"); R_GPT_Close(g_memory_performance.p_ctrl); /* Handle error */ if (FSP_SUCCESS != fsp_err) { /* Fatal error */ APP_PRINT("ospi qspi read test failed\r\n"); } APP_PRINT("block_size_actual Value is:%d",block_size_actual); APP_PRINT("\r\n-------------------------------------------------"); APP_PRINT("\r\nOperation/Flash Quad-SPI Octa-SPI"); APP_PRINT("\r\n-------------------------------------------------"); APP_PRINT("\r\nWrite %6ld %6ld", qspi_write_result , ospi_write_result); APP_PRINT("\r\nRead %6ld %6ld", qspi_read_result , ospi_read_result); APP_PRINT("\r\n-------------------------------------------------"); APP_PRINT("\r\nNote: Times are in microseconds"); } else { APP_PRINT("\r\nInvalid size, nenter the text block size specifying a 2K boundary (eg 24):"); } }        逻辑和例程中的一样,只是用J-Link RTT打印输出信息和获取测试需要的数据。     验证        烧写到板卡后可以用J-Link RTT Viewer软件进行测试,目前输入两位数测试数据时需要通过复制才可以,输入一个数值后就会立马进行测试,这也是第一次使用J-Link RTT Viewer软件造成的。测试完成后可以继续输入数值进行测试。     对应程序源码   DAC配置生成波形及性能测试     配置        在新建工程的基础上进行如下图的配置     应用程序代码编写        在hal_entry函数编写如下代码 fsp_err_t err = FSP_SUCCESS; /* Open the DAC channel */ err = R_DAC_Open (&g_dac_ctrl, &g_dac_cfg); double w = 0,dac_value = 0; /* handle error */ if (FSP_SUCCESS != err) { /* DAC module open failed */ while(1) { } } while (1) { w += (PI / 30); if (w >= (2 * PI)) { w = 0; } dac_value = (sin(w) + 1) / 2 * 4095; R_DAC_Write(&g_dac_ctrl, (uint16_t)dac_value); R_DAC_Start(&g_dac_ctrl); R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MILLISECONDS); }        代码也是参考直播时记录的代码。     验证        对应输出的引脚是P014,所以用示波器查看输出波形如下 对应程序源码 进阶任务   示例程序中新增命令打印信息     添加步骤       在s_menu_items数组中添加如下内容 {"followme" , Followme_display_menu},        最终的数组定义如下 /* Table of menu functions */ static st_menu_fn_tbl_t s_menu_items[] = { {"followme" , Followme_display_menu}, {"Kit Information" , kis_display_menu}, {"Web Server" , eth_emb_display_menu}, {"Network Name Lookup" , eth_www_display_menu}, {"Quad-SPI and Octo-SPI Speed Comparison" , ext_display_menu}, {"Cryptography and USB High speed (MSC)" , enc_display_menu}, {"Next Steps", ns_display_menu }, {"", NULL } };        在menu_kis.c文件中添加如下函数的定义 /********************************************************************************************************************** * Function Name: Followme_display_menu * Description : . * Return Value : *********************************************************************************************************************/ test_fn Followme_display_menu(void) { int8_t c = -1; //uint32_t value = 0; sprintf (s_print_buffer, "%s%s", gp_clear_screen, gp_cursor_home); /* ignoring -Wpointer-sign is OK when treating signed char_t array as as unsigned */ print_to_console((void*)s_print_buffer); print_to_console((uint8_t *)"Please enter a number(0~9):"); /* provide small delay so board_status should be up to date */ vTaskDelay (s_ticks_to_wait); //xEventGroupSetBits (g_update_console_event, STATUS_DISPLAY_MENU_KIS); while (CONNECTION_ABORT_CRTL != c) { c = input_from_console (); if ((MENU_EXIT_CRTL == c) || (CONNECTION_ABORT_CRTL == c)) { break; } else { sprintf (s_print_buffer, "%s%s", gp_clear_screen, gp_cursor_home); /* ignoring -Wpointer-sign is OK when treating signed char_t array as as unsigned */ print_to_console((void*)s_print_buffer); sprintf (s_print_buffer, "You entered:%d", c - '0'); print_to_console((void*)s_print_buffer); print_to_console((uint8_t *)"\r\n\r\n> Press space bar to return to MENU Or Continue entering numbers\r\n"); } } //xEventGroupClearBits (g_update_console_event, STATUS_DISPLAY_MENU_KIS); return (0); } /********************************************************************************************************************** End of function Followme_display_menu *********************************************************************************************************************/         在menu_kis.h文件中添加如下函数的声明 extern test_fn Followme_display_menu(void);     验证        实现的效果是用串口软件打开后,先输入1进入自己编写的程序中,然后通过数值键输入任意的数字,输入后就立马打印输入的数值。目前没有做到输入更多的字符进行打印。效果如下图 对应程序源码 扩展任务   设计一个类似信号发生器功能的例程。可在示例程序上修改。通过命令或按键,设置DAC输出波形,可通过flash存储历史波形等信息   配置        配置和基础任务的配置一样,只不过基础任务是分成两个任务,需要合成一个作为扩展任务的使用,在此省略配置过程。 流程图       实现扩展任务的方式比较简单,首先是上电检查Flash中的数据是否是有效的,如果有效就按读取的值进行输出,否则可以按默认值或不输出。当有按键或串口有输入时就做对应的修改。流程图如下       应用程序代码编写         首先是用了基础任务的src文件夹下的程序。也添加了按键的.c和.h文件(和入门任务的程序一样)。hal_entry函数写的自定义函数如下 fsp_err_t err = FSP_SUCCESS; double w = 0,dac_value = 0; double freq = 10; uint8_t dac_freq = 10; /* Open the DAC channel */ err = R_DAC_Open (&g_dac_ctrl, &g_dac_cfg); if (FSP_SUCCESS != err) { /* DAC module open failed */ APP_PRINT("DAC open falied\r\n"); R_DAC_Close(&g_dac_ctrl); } getDACsetferq(flash_value); if (flash_value[0] != 0) { freq = flash_value[0]; } APP_PRINT("read DAC value is:%d\r\n",dac_freq); /* handle error */ while (1) { //qspi_DAC_input_value = process_input_data(); if( Key_Scan(KEY1_SW2_PIN) == KEY_ON ) { dac_freq += 10; freq = dac_freq; flash_value[0] = freq; saveDACfreq(flash_value); APP_PRINT("read DAC value is:%d\r\n",dac_freq); } if( Key_Scan(KEY2_SW1_PIN) == KEY_ON ) { dac_freq -= 10; if (dac_freq <= 0) { dac_freq = 10; } flash_value[0] = freq; saveDACfreq(flash_value); APP_PRINT("read DAC value is:%d\r\n",dac_freq); } w += (PI / freq); if (w >= (2 * PI)) { w = 0; } dac_value = (sin(w) + 1) / 2 * 4095; R_DAC_Write(&g_dac_ctrl, (uint16_t)dac_value); R_DAC_Start(&g_dac_ctrl); R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MICROSECONDS); }     验证        实现的效果是一个按键按下会增加正玄波的频率;另一个按键被按下会减少频率值,且最小值为10。效果如下图     对应程序源码 全部任务演示视频 [localvideo]93b2d3a09e3284362330d90e95042aeb[/localvideo]  

最近访客

< 1/2 >

统计信息

已有36人来访过

  • 芯积分:141
  • 好友:--
  • 主题:7
  • 回复:18

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言