嵌入式
文章平均质量分 76
a_happy_ant
这个作者很懒,什么都没留下…
展开
-
QSPI DSPI SPI超级详细的讲解,友好的讲解。
外扩的flash接口一般都是SPI(与片上flash不一样,片上flash理解为在已经集成在芯片内部了,集成在芯片内部的flash就一般不存在SPI接口说法了,都是通过总线进行数据的交换。而外扩的flash是理解为硬盘就可以了)。因此外扩的flash一般也说是spi-flash。SPI是什么?网上说SPI DSPI QSPI有几根数据线什么,对新手来说谁特么听的懂啊。直接不多说,上图讲解:GD25Q16BS为一款FLASH,这个不重要,重要的是接口的8根线。下面逐一讲解:CS:片选信号,这个不用原创 2021-12-10 10:46:55 · 13797 阅读 · 3 评论 -
Linux 线程,创建,分离,回收详解
并行和并发的区别并发(concurrency):在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。其中两种并发关系分别是同步和互斥。(并发是指同一时刻只能有一条指令执行,但多个进程指令被快速轮换执行,使得在宏观上有多个进程被同时执行的效果–宏观上并行,针对单核处理器)互斥:进程间相互排斥的使用临界资源的现象,就叫互斥。同步(synchronous):进程之间的关系不是相互排斥临界资源的关系,而是相互依赖的关系。进一步的说明:就是前一个进程原创 2021-11-16 11:00:07 · 364 阅读 · 0 评论 -
堆栈地址的生长方向,以及一些思考
如何判断栈的增长方向?对于一个用惯了i386系列机器的人来说,这似乎是一个无聊的问题,因为栈就是从高地址向低地址增长。不过,显然这不是这个问题的目的,既然把这个问题拿出来,问的就不只是i386系列的机器,跨硬件平台是这个问题的首先要考虑到的因素。在一个物质极大丰富的年代,除非无路可退,否则我们坚决不会使用汇编去解决问题,而对于这种有系统编程味道的问题,C是一个不错的选择。那接下来的问题就是如何用C去解决这个问题。C在哪里会用到栈呢?稍微了解一点C的人都会立刻给出答案,没错,函数。我们知道,局部变量都存原创 2021-11-01 15:59:56 · 2936 阅读 · 0 评论 -
STM32 FDCAN通信,发射部分详解。
前言在CAN专属的消息RAM中,存在32个TX缓冲区,32个TX事件FIFO。每个里面都存在1个元素,一共有64个元素,对应64个报文。TX缓冲区每一个TX缓冲区可以配置一个ID,即对应一个报文。缓冲区内不仅仅只有报文的内容,还有报文的类型、ID等相关信息,官方定义这样一个整体叫element,叫元素。下面是每个元素都有什么内容。(1) 位 ESI:当检测到错误时是否将发送错误标志。(2) 位 XTD:决定接受 ID 的位数是 11 位还是 29 位。1 表示 29 位扩展格式的 ID,0 表原创 2021-10-29 14:06:22 · 4009 阅读 · 0 评论 -
STM32 ADC的连续,扫描模式的含义
ADC单通道:要求进行一次ADC转换:配置为单次模式使能,扫描模式失能。这样ADC的这个通道,转换一次后,就停止转换。要求进行连续ADC转换:配置为连续模式使能,扫描模式失能。这样ADC的这个通道,转换一次后,接着进行下一次转换,不断连续。ADC多通道:必须是扫描模式要求进行一次ADC转换:配置为单次模式使能,扫描模式使能。这样ADC的多个通道,按照配置的顺序依次转换一次后,就停止转换。要求进行连续ADC转换:配置为连续模式使能,扫描模式使能。这样ADC的多个通道,按照配置的顺序依次转换一次后,接原创 2021-10-18 16:46:02 · 1558 阅读 · 0 评论 -
C语言typedef函数指针用法
1.简单的函数指针的应用形式1:返回类型(*函数名)(参数表)char (*pFun)(int);char glFun(int a){ return;}void main(){pFun = glFun;(*pFun)(2);} 第一行定义了一个指针变量pFun。首先我们根据前面提到的“形式1”认识到它是一个指向某种函数的指针,这种函数参数是一个int型,返回值是char类型。只有第一句我们还无法使用这个指针,因为我们还未对它进行赋值。 第二行定义了一个函数glFun()。原创 2021-10-13 09:54:45 · 2142 阅读 · 0 评论 -
基于STM32的freertos实时系统,双线程参考实例
上回说到我的任务1不见了,只有任务2,这次要找它出来!上篇链接:https://blog.csdn.net/a_happy_ant/article/details/120719576?spm=1001.2014.3001.5501找出来的方式有很多种,先说说抢占式调度(CubeMx默认设置是这个)一、抢占式调度还是先来看看osThreadDef的定义:上一章我们大概清楚了第一个参数 name 的作用,os_thread_def_##name 是声明了一个变量,#name是把这么宏参数变为字符串,原创 2021-10-12 11:17:25 · 1107 阅读 · 1 评论 -
STM32CubeMx移植freertos系统,简单的双线程工作
对于初学者,只需要知其然就可以,不需要深究底层逻辑。等用熟了,有些概念了,再来深究会好很多。使用CubeMx 移植FreeRTOS,比较简单。一、新建工程只需要把这里勾上就OK了,其它都是常规配置,记得把时钟配置上,我这里添加了一个串口,用于测试演示,LED都懒得配置了。(不同版本的cubemx界面可能有些不同,这里不一一展示,直接添加freertos,软件版本选择cmsis v1即可)直接点击生成,发现有警告:是说FreeRTOS和HAL库的时钟源由冲突,然后强烈建议我们把时钟源改为其它的,既原创 2021-10-12 11:12:41 · 1401 阅读 · 0 评论 -
C语言 指针函数与函数指针详解
前言函数指针和指针函数,先来看看两者的定义以及说明。指针函数定义指针函数,简单的来说,就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。声明格式为:*类型标识符 函数名(参数表)看看下面这个函数声明:int fun(int x,int y);这种函数应该都很熟悉,其实就是一个函数,然后返回值是一个 int 类型,是一个数值。接着看下面这个函数声明:int fun(int x,int y);这和上面那个函数唯一的区别就是在函数名前面多了一个号,而这个函数就是一个指针函原创 2021-09-18 11:55:32 · 578 阅读 · 0 评论 -
C语言strlen与sizeof的区别详解
strlen 是一个函数,它用来计算指定字符串 str 的长度,但不包括结束字符(即 null 字符)。其原型如下面的代码所示:size_t strlen(char const* str);也正因为 strlen 是一个函数,所以需要进行一次函数调用,调用示例如下面的代码所示:char sArr[] = “ILOVEC”;/用strlen()求长度/printf(“sArr的长度=%d\n”, strlen(sArr));很显然,上面示例代码的运行结果为 6(因为不包括结束字符 null)。这里需原创 2021-09-17 16:46:58 · 200 阅读 · 0 评论 -
I2C时序
I2C时序理解欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdo原创 2021-09-10 10:48:21 · 6553 阅读 · 0 评论