纯人工翻译中文版本,STM32CubeMX用户手册中文版,STM32CubeMX用户手册中文版UM1718-翻译版.菜鸟到高手,显得有些霸气哈,不过的确如此,官方带给我们一个比较实用的stm32的工具。
这个工具就是STM32CubeMX,昨天玩freeRTOS的时候就提到过。
说到freeRTOS,这里就多说两句。
全局变量,在任务间相互访问的时候也是需要临界保护的,不然可能会出现奇怪的问题。
不过我们可以关掉时间片调度,任务间可以访问全局变量而不用加保护(不等于菜鸟可以随意代码)。
关闭了时间片调度,只有发生vTaskDelay的时候才会上下文切换。
只要代码合理访问全局变量可以不加保护的。
因此代码也不是可以任意书写的,关于freeRTOS的问题,多看看源码,一切都会有答案。
源码较少,这里就不过多介绍。
关闭时间片不是网上说的configUSE_TIME_SLICING这个宏定义,老鸟发现这个宏压根没用哈,嘿嘿。
阅读源码可以找到相关宏配置。
不过不建议关闭,时间片调度也可以让一个任务在执行一定时间后切换到其他就绪任务去执行。
如果有freeRTOS相关问题,可以留言给我。
废话说多了点哈,继续我们的STM32CubeMX。
下面我们来讲讲这个工具的作用,讲完后,可以自己下载一个试试,挺简单不多介绍。
到官网下载STM32CubeMX,并安装。
1:芯片选型打开STM32CubeMX,我们点击newproject,我们就可以进行芯片选型,如果你下载了打开了这个工具,是不是很惊讶,stm32的所有产品型号都在里面,而且左下提供了资源勾选,比如你要以太网支持,勾选以太网选项,所有的支持以太网的stm32芯片才会被显示,旁边还有个max的栏目指示了芯片最多支持该功能的个数。
空白的一般默认只有一个。
下图是我勾选以太网的截图。
上图不仅提供了芯片,还提供了价格,是否在售,封装,存储,频率等一些列信息。
除了cpu资源可以选型外,上面还提供了脚多少,存储大小等非常灵活的选型方式。
我们选择其中一个的单片机后。
右上部分给我们提供了完美的支持。
第一个选项提供了改cpu的特性,我们可以大概的了解选中的cpu资源。
第二个选项提供该cpu框图,截图图片太大,这里就不截图了。
第三个选项提供了cpu文档,这个文档非常多也非常全面,基本不用在网上东找西找了,主要给硬件工程师用。
第四个选项提供了cpu的相关设计资源,软件编程文档,给软件工程师用,非常全面,包括网上很少用到的文档资料,比如系统移植相关的底层资料(堆栈,指令,汇编)。
第五个选项提供了芯片购买途径,这个每个人自己选择吧。
第六个选项开始工程,芯片选好了,就可以开始工程。
2:设定芯片。
芯片选好后,可以开始设定芯片。
这就是软件工程师的好帮手呀。
比如我要以太网功能,勾选上以太网即可,他就会自动分配出芯片对应的以太网接口。
如下图:上面我选了标准的MII接口。
很多人可能就不理解,你勾了个以太网,咋报错了。
老鸟告诉你为啥变红了,stm32有个复杂的功能就是io口复用,勾选mii后分配的io口和spi2以及iis口重合了,所以这个工具非常智能的提示了出来,非常神奇吧。
告诉你他们不能使用了。
还有些变黄了,说明他们可以选择性使用,真是太方便了,省去了查资料慢慢找io的痛苦。
比如我们还要给它个外部时钟。
我们勾选时钟即可,响应的时钟脚就会分配出来。
如果要将某个脚设置成输入输出那就更简单了,鼠标点选对应的io口选择对应功能即可,比如我单击PA6,它的所有功能可以轻松选择:软件使用比较简单,不过多解释,一看就明白,设置完芯片功能后,我们就设定系统各项功能时钟。
选择时钟设置页面(clockconfiguration)时钟轻松设定,如下图,简单明了,不过多解释了:时钟配置完成后,可以切换到configuration选项对功能进一步设定,里面参数都是常用的功能,设置较为简单。
就不多举例了,比如网络功能里面设置mac地址等。
3:生产初始化代码经过上面的图形化设定,我们可以直接生产初始化代码。
省去我们查阅资料慢慢配置的的环节,时间更多的利用在应用层设计。
点击project下面的生成代码选项。
输入工程名(根据你项目需要起名),这里我就随便输入一个名字。
设定好相关参数。
点击ok即可。
顺便说下,这个工具是配带教程的,我这里只是告诉大家有这样个工具可以加速开发,具体设置参考官方教程。
生成后打开文件夹内容如下:上图的inc和src文件夹里面是生成的主要代码,其他几个文件夹里面的东西,大家可以根据自己需要选择。
src文件夹文件如下:打开熟悉的ma
2023/8/19 21:31:32 11.41MB stm32 仿真
1
新版本修正了上一版本的某些bug,减少了全局变量的使用,并增加对变量引用的判断,以在格式化公式组时确定变量的引用情况,确定是否释放公式组中的变量,对内存中公式删除时不会再产生野指针本组建主要用于在程序中解析预先编写的类C脚本,并依据脚本执行,可通过调用外部指针函数读入输入变量执行计算,最终得出计算结果写入输出变量中;
用户可通过读取输出变量获取最终的结果。
脚本中可调用函数,函数分为系统函数和自定义函数两种;
系统函数可直接调用;
自定义函数需在脚本中自行定义
2023/8/19 7:12:55 20KB 执行 脚本解析
1
使用OpenGL读取3DS文件的示例代码。
演示说明了3DS文件的结构、三维控件中视线、旋转设置,以及简单的动画。
重要说明如下------------------全局变量-------------g_Load3ds 读入数据的类g_3DModel 数据本身g_RotationSpeed 旋转速度---------------------函数---------------【WinMain】 入口函数。
调用Init初始化OpenGL 调用MainLoop显示【Init】 初始化OpenGL,读取数据 调用InitialOpenGL初始化 调用CLoad3DS的Import3DS函数,从文件中读取g_3DModel 调用CreateTexture,装入纹理【MainLoop】 循环调用RenderScence渲染场景,直到窗口关闭时退出 删除场景中对象 效用DeInit恢复初始化之前的状态【RenderScence】 渲染 gluLookAt,选择视角 glRotatef,旋转---------------------------------------根目录下FACE.3DS为三维数据,FACE.BMP为其所指的贴图数据。
如果想读取其他文件,在代码中替换#defineFILE_NAME"face.3ds"为其他3DS格式文件名即可。
如果读取结果是黑屏,往往是视角和视场设置错误,可以查看三维数据的位置,更改gluLookAt和gluPerspective。
2023/8/16 15:31:48 4.04MB OpenGL 3DS 三维
1
模块思想程序框架高质量代码。
界面与后台程序分离分层。
采用模块化思想封装装各个模块,除配置外只使用了个全局变量。
含有gps,语音模块v4l2视频模块定时器线程
2023/8/14 11:44:10 58KB gps v4l2 高质量 video
1
编写此软件概要设计说明书是为了使开发方可以了解到此系统基于需求规格说明书内的顶层及各层数据流图产生的功能结构图,了解系统内数据变换的过程及数据的流向,以及本系统的数据设计:数据库中E-R图设计和表结构设计以及全局变量的设计。
2023/6/29 10:23:54 1.05MB 概要设计
1
五子棋游戏是一个深受人们喜爱的游戏,通常是人机对弈,本程序设计为人与人对弈,一方执黑棋,一方执白棋,轮流走棋,每方都试图在游戏结束前让自己的棋子五子相连。
按键盘上的方向键可以移动光标,回车键可以摆放棋子。
这个程序是对编程基本功的一个训练,将分支、循环、数组、函数综合应用,而不仅限于编制独立的小程序,通过游戏过程增加编程的兴趣,提高编程水平。
编制该程序我对以下的知识点进行的巩固和掌握:1.数组元素为结构体的数组应用。
2.全局变量应用。
3.按键的处理。
4.数组元素对应关系。
5.图形方式等等。
虽然该程序是一个普通而又简单的程序,但是对于语言初级阶段的我来说,是一个很好的锻炼甚至可以说是一个很好的提高。
1
1.static有甚么用途?(请起码阐发两种)1)在函数体,一个被申明为动态的变量在这一函数被挪用进程中抛却其值巩固。
2)在模块内(但在函数体外),一个被申明为动态的变量能够被模块内所用函数晤面,但不能被模块外另外函数晤面。
它是一个当地的全局变量。
3)在模块内,一个被申明为动态的函数只可被这一模块内的另外函数挪用。
那便是,这个函数被限度在申明它的模块的当地规模内使用2.援用与指针有甚么差距?1)援用必需被初始化,指针不用。
2)援用初始化之后不能被窜改,指针能够窜改所指的货物。
3)不存在指向空值的援用,然则存在指向空值的指针。
3.描摹实时体系的底子特色在特定功夫内实现特定的责任,实时性与牢靠性。
4.全局变量以及部份变量在内存中能否有差距?假如有,是甚么差距?全局变量贮存在动态数据库,部份变量在堆栈。
5.甚么是失调二叉树?左右子树都是失调二叉树且左右子树的深度差值的相对于值不大于1。
6.堆栈溢出普通是由甚么原因导致的?不付与垃圾资源。
7.甚么函数不能申明为虚函数?constructor函数不能申明为虚函数。
8.冒泡排序算法的功夫繁杂度是甚么?功夫繁杂度是O(n^2)。
9.写出floatx与“零值”比力的if语句。
if(x>0.000001&&x<-0.000001)10.Internet付与哪类收集协议?该协议的首要条理结构?Tcp/Ip协议首要条理结构为:使用层/传输层/收集层/数据链路层/物理层。
11.Internet物理地址以及IP地址转换付与甚么协议?ARP(AddressResolutionProtocol)(地址剖析協議)12.IP地址的编码分为哪俩部份?IP地址由两部份组成,收集号以及主机号。
不外是要以及“子网掩码”按位与上之后才气分辨哪些是收集位哪些是主机位。
13.用户输入M,N值,从1至N末了秩序轮回数数,每一数到M输入该数值,直至部份输入。
写出C法度圭表标准。
轮回链表,用取余操作做14.不能做switch()的参数尺度是:switch的参数不能为实型。
1.写出分辨ABCD四个表白式的能否准确,若准确,写出经由表白式中a的值(3分)inta=4;(A)a+=(a++);(B)a+=(++a);(C)(a++)+=a;(D)(++a)+=(a++);a=?答:C差迟,左侧不是一个实用变量,不能赋值,可改为(++a)+=a;改后谜底按次为9,10,10,112.某32位体系下,C++法度圭表标准,请盘算sizeof的值(5分).charstr[]=“http://www.ibegroup.com/”char*p=str;intn=10;请盘算sizeof(str)=?(1)sizeof(p)=?(2)sizeof(n)=?(3)voidFoo(charstr[100]){请盘算sizeof(str)=?(4)}void*p=malloc(100);请盘算sizeof(p)=?(5)答:(1)17(2)4(3)4(4)4(5)43.回答上面的下场.(4分)(1).头文件中的ifndef/define/endif干甚么用?预处置答:提防头文件被重复援用(2).#include以及#include“filename.h”有甚么差距?答:前者用来搜罗开拓情景提供的库头文件,后者用来搜罗自己编写的头文件。
(3).在C++法度圭表标准中挪用被C编译器编译后的函数,为甚么要加extern“C”申明?答:函数以及变量被C++编译后在标志库中的名字与C语言的不合,被extern"C"润色的变量以及函数是依据C语言方式编译以及毗邻的。
由于编译后的名字不合,C++法度圭表标准不能直接挪用C函数。
C++提供了一个C毗邻交流指定标志extern“C”来处置这个下场。
(4).switch()中不应承的数据尺度是?答:实型4.回答上面的下场(6分)(1).VoidGetMemory(char**p,intnum){*p=(char*)malloc(num);}voidTest(void){char*str=NULL;GetMemory(&str,100);strcpy(str,"he
1
这篇文章将详细介绍EPIC组件的安装,EPIC编辑环境,调试运行环境,着重介绍如何使用EPIC来快速、简便、准确地调试Perl语言程序,包括对于Perl程序的单步执行,断点用法,局部、全局变量实时监控,子函数执行监控,错误以及警告信息实时显示等等内容。
利用EPIC强大编辑以及调试功能,可以将Perl语言适合花短时间完成程序的特点发挥地淋漓尽致,为tester的自动化测试脚本提供愈加人性化的设计、调试环境。
2023/3/12 21:12:11 398KB perl Eclipse
1
C语言编写的1024点的FFT,以前做国赛的时候本人写的,分享出来大家一起用吧,里面写了基本的用法,有编程基础的人很快就看懂了,使用查表法做的,内存占用也做了极大优化,目前在STM32上,72M的计算速度为200-300ms,因为用的是1024点全局变量,所以在计算的时候会用到8*1024B=8.192k的内存,建议单片机RAM至少在10k以上,以免导致程序无法运行,因为点数比较大,内存占用较多,所以建议选用STM32这种运行速度较快的单片机
2023/2/18 17:47:57 7KB FFT 1024
1
首先要理解基本的原理,2台电脑间实现TCP通讯,首先要建立起连接,在这里要提到服务器端与客户端,两个的区别通俗讲就是主动与被动的关系,两个人对话,肯定是先有人先发起会话,要不然谁都不讲,谈什么话题,呵呵!一样,TCPIP下建立连接首先要有一个服务器,它是被动的,它只能等待别人跟它建立连接,自己不会去主动连接,那客户端如何去连接它呢,这里提到2个东西,IP地址和端口号,通俗来讲就是你去拜访某人,知道了他的地址是一号大街2号楼,这个是IP地址,那么1号楼这么多门牌号怎么区分,嗯!门牌号就是端口(这里提到一点,我们访问网页的时候也是IP地址和端口号,IE默认的端口号是80),一个服务器可以接受多个客户端的连接,但是一个客户端只能连接一台服务器,在连接后,服务器自动划分内存区域以分配各个客户端的通讯,那么,那么多的客户端服务器如何区分,你可能会说,根据IP么,不是很完整,很简单的例子,你一台计算机开3个QQ,服务器怎么区分?所以准确的说是IP和端口号,但是客户端的端口号不是由你自己定的,是由计算机自动分配的,要不然就出现端口冲突了,说的这么多,看下面的这张图就简单明了了。
在上面这张图中,你可以理解为程序A和程序B是2个SOCKET程序,服务器端程序A设置端口为81,已接遭到3个客户端的连接,计算机C开了2个程序,分别连接到E和D,而他的端口是计算机自动分配的,连接到E的端口为789,连接到D的为790。
了解了TCPIP通讯的基本结构后,接下来讲解建立的流程,首先声明一下我用的开发环境是VisualStudio2008版的,语言C#,组件System.Net.Sockets,流程的建立包括服务器端的建立和客户端的建立,如图所示:二、实现:1.客户端:第一步,要创建一个客户端对象TcpClient(命名空间在System.Net.Sockets),接着,调用对象下的方法BeginConnect进行尝试连接,入口参数有4个,address(目标IP地址),port(目标端口号),requestCallback(连接成功后的返调函数),state(传递参数,是一个对象,随便什么都行,我建议是将TcpClient自己传递过去),调用完毕这个函数,系统将进行尝试连接服务器。
第二步,在第一步讲过一个入口参数requestCallback(连接成功后的返调函数),比如我们定义一个函数voidConnected(IAsyncResultresult),在连接服务器成功后,系统会调用此函数,在函数里,我们要获取到系统分配的数据流传输对象(NetworkStream),这个对象是用来处理客户端与服务器端数据传输的,此对象由TcpClient获得,在第一步讲过入口参数state,如果我们传递了TcpClient进去,那么,在函数里我们可以根据入口参数state获得,将其进行强制转换TcpClienttcpclt=(TcpClient)result.AsyncState,接着获取数据流传输对象NetworkStreamns=tcpclt.GetStream(),此对象我建议弄成全局变量,以便于其他函数调用,接着我们将挂起数据接收等待,调用ns下的方法BeginRead,入口参数有5个,buff(数据缓冲),offset(缓冲起始序号),size(缓冲长度),callback(接收到数据后的返调函数),state(传递参数,一样,随便什么都可以,建议将buff传递过去),调用完毕函数后,就可以进行数据接收等待了,在这里因为已经创建了NetworkStream对象,所以也可以进行向服务器发送数据的操作了,调用ns下的方法Write就可以向服务器发送数据了,入口参数3个,buff(数据缓冲),offset(缓冲起始序号),size(缓冲长度)。
第三步,在第二步讲过调用了BeginRead函数时的一个入口参数callback(接收到数据后的返调函数),比如我们定义了一个函数voidDataRec(IAsyncResultresult),在服务器向客户端发送数据后,系统会调用此函数,在函数里我们要获得数据流(byte数组),在上一步讲解BeginRead函数的时候还有一个入口参数state,如果我们传递了buff进去,那么,在这里我们要强制转换成byte[]类型byte[]data=(byte[])result.AsyncState,转换完毕后,我们还要获取缓冲区的大小intlength=ns.EndRead(result),ns为上一步创建的NetworkStream全局对象,接着我们就可以对数据进行处理了,如果获取的length为0表示客户端已经断开连接。
具体实现代码,在这里我建立了一个名称为Test的类:2.服务
2023/2/17 5:19:13 297KB TCP/IP C++ 协议
1
共 61 条记录 首页 上一页 下一页 尾页
在日常工作中,钉钉打卡成了我生活中不可或缺的一部分。然而,有时候这个看似简单的任务却给我带来了不少烦恼。 每天早晚,我总是得牢记打开钉钉应用,点击"工作台",再找到"考勤打卡"进行签到。有时候因为工作忙碌,会忘记打卡,导致考勤异常,影响当月的工作评价。而且,由于我使用的是苹果手机,有时候系统更新后,钉钉的某些功能会出现异常,使得打卡变得更加麻烦。 另外,我的家人使用的是安卓手机,他们也经常抱怨钉钉打卡的繁琐。尤其是对于那些不太熟悉手机操作的长辈来说,每次打卡都是一次挑战。他们总是担心自己会操作失误,导致打卡失败。 为了解决这些烦恼,我开始思考是否可以通过编写一个全自动化脚本来实现钉钉打卡。经过一段时间的摸索和学习,我终于成功编写出了一个适用于苹果和安卓系统的钉钉打卡脚本。
2024-04-09 15:03 15KB 钉钉 钉钉打卡