自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(60)
  • 收藏
  • 关注

原创 一些常用简写全称

API:Application Programming Interface应用程序接口。ISR :Interrupt Service Routine中断服务程序。

2023-04-29 19:21:31 35

原创 si24r1/nrf24l01

此模式下不可以通过芯片收发数据,但MCU和芯片可以通过spi协议通信,更改内部寄存器的状态(如设置 CONFIG 寄存器下的 PWR_UP 位的值为 1,芯片待时钟稳定后进入 Standby 模式)。如上方的读寄存器命令R_REGISTER ,对应的命令字为000A AAAA,其中AAAA A 是由用户更改的,必须是寄存器表中的值。发送方接收ACK,需要再配置接收地址。我们在配置为发送时,需要配置TX_ADDR,配置为接收时,配置一个通道的。TX_ADDR和接收方的接收通道地址相同RX_ADDR_P0。

2023-10-28 12:34:39 306

转载 Linux下C语言编程,include的默认路径

其中,前面的字符串(如sys,net)表示标准路径下的文件夹名,后面的字符串(如io.h,ethernet.h),表示在linux标准路径下的各文件夹下的头文件名,如sys文件夹下的io.h文件,即我们可以在/usr/include/sys目录下发现io.h文件。如我的/home/Desktop目录下有个头文件local1.h,在编译包含local1.h的test.c文件时,可用:gcctest.c -o test -I /root/Desktop。如果没有,也不会检索当前文件所在路径,并将报错。

2023-10-15 14:15:54 1098

原创 编译linux的设备树

f 的作用是使用make 命令编译由-f 指定的Makefile文件(scripts/Makefile.build)通过下面的命令包含传入的$(obj)目录下的Makefile,即arch/arm/boot/dts/Makefile。展开后-f ./scripts/Makefile.build obj:=arch/arm/boot/dts。其中 $(always)在arch/arm/boot/dts/Makefile中。在arch/arm 的目录Makefile文件中有。

2023-10-14 17:04:38 795

原创 freertos定时器任务运行流程()

/获取下一个定时的时间,即如果定时10ms,则在启动定时器的时间加上10ms,即定时时间。= pdFALSE )//如果没有定时器任务,那么进入挂起态。= pdFALSE )//判断定时器列表是不是空的。这是定时器的回调函数,pxCallbackFunction是函数指针,参数是定时器句柄。获取当前的时间,并判断定时器列表有没有交换,如果定时器计时超过一个周期就会从0开始,意味着需要交换定时器列表。定时器列表中存储创建的定时器,如果定时时间超过当前最大时间,就放入溢出列表。/这一步不知道用处是什么。

2023-10-02 09:58:24 200

原创 xPortPendSVHandler任务切换流程

{r4-r11} /* Save the remaining registers. */进入中断会自动保存部分寄存器到//PSP。在任务切换函数中,xCurrentTCB的值变成了要切换任务的TCB。ldr r2, [r3]//r2保存pxCurrentTCB的值,也是结构体topofstack的值,即栈顶的地址,因为中断的硬件保存机制,所以即使另一个任务是被中断的,也可以继续保持运行。根据找到的就绪列表中的其它任务,并将该任务的TCB赋值给pxCurrentTCB。

2023-10-01 14:04:13 211

原创 idleTASK,分析。

/这里删除的任务必须是动态分配的才会被删除。在M3编程手册中,0xe000ed04是寄存器。空闲任务仅执行一会,从这里进行任务调度。主要作用是清除已被删除的任务的申请的空间。触发PENDSV中断。

2023-09-30 15:06:46 167

原创 使用keil反汇编时的记录

IMPORT后面跟随函数名或变量名,作用相当于C中的extern关键字,指出这些全局符号是在其它源文件中定义的。跳转到系统初始化时,使用BLX ,其后只能用寄存器,注意事项见下方。,表示本程序里面用到的变量提供给其他模块调用的。

2023-09-30 10:39:01 95

原创 keil的自动补全功能

1.2、

2023-09-30 10:16:02 800

原创 使用KEIL自带的仿真器仿真遇到问题解决

修改debug选项设置为下方内容。

2023-09-29 22:31:54 277

原创 freertos中函数调用和启动第一个任务(栈相关!!!!!!)

而且,函数在调用时会保存上下文,比如这里是r4-r11,lr.(因为这里可能会用到以上寄存器)其中只有lr的值因为函数调用而发生了改变。入栈时使用的是MSP,在出栈时使用的是PSP,而且,PSP执行的地址是我们所要用的任务栈地址。前四个参数使用寄存器传参(全局变量还是用了寄存器,应该是硬件的原因),后三个是全局变量。但是,如果传入的参数是全局变量,则不需传参,因为全局变量在函数内部是可见的,可直接赋值或修改。在函数调用时,m3的处理器使用r0-r3共四个寄存器传参,其余的使用栈传参。显示程序的执行情况。

2023-09-29 17:38:17 163

原创 freertos的任务调度器的启动函数分析(根据源码使用)

* Configure SysTick to interrupt at the requested rate. *///产生指定周期的中断。//仅保留3左移8位后的位为1。通过宏pucFirstUserPriorityRegister=0xE000E400(根据宏名字,这是NVIC寄存器地址)保存第一个寄存器的值。//最后的值为7-4。/*有几个有效位,就执行几次*/. */因为用4位表示优先级,所以这里是15。

2023-09-28 20:12:00 140

原创 关于NVIC 中断控制器的中断配置。

M3处理器仅实现了每个81个中断,每个中断的优先级由高4位控制。这里的组优先级我认为是抢占式优先级。以下图片均来自NVIC控制器内容。

2023-09-28 18:00:29 125

原创 freertos动态和静态任务创建的区别

const uint32_t ulStackDepth,栈的长度(不是大小,)UBaseType_t uxPriority,任务优先级。void * const pvParameters,任务参数。xTaskCreateStatic( TaskFunction_t pxTaskCode,//函数指针。xTaskCreate( TaskFunction_t pxTaskCode,函数指针。静态创建任务时任务控制块和栈空间是提前分配好的,是静态的。由上可知,动态创建任务时任务控制块和栈空间是动态分配的,

2023-09-28 15:23:19 107

原创 关于如何通过用任务控制块中的成员变量找到任务控制块的方法(附程序)

我们通过将&( pxNewTCB->xStateListItem )加入到不同的列表中实现任务的控制,其中实现任务控制,必须要实现上述代码,通过将任务控制块的成员变量指向自身,即可通过成员变量找到任务控制块的地址。将pxNewTCB设置为从ListItem_t返回的连接,在freertos中初始化一个任务时,总会遇到。

2023-09-27 22:48:34 57

原创 linux常用命令复习

x :提取归档文件(解压缩)f:指定归档文件的名称。v:显示详细的操作信息。

2023-08-07 10:17:10 34

原创 配置NFS,遇到的问题总结(电脑连接WiFi,开发板和电脑直连)

在这里需要注意,网络掩码,一致,不一致的话,可以在Windows里试一试,千万别错了,不然会ping不通。先设置Windows的网络,再设置,虚拟机的网络,即vmnet0,保证在同一个网段里。这三个都要在同一网段里。不过掩码一定要正确,如果在uboot里设置错了是不会显示的。这一步,需要先将Ubuntu关掉,再进行设置。如果设置了不显示,需要移出网络,再次添加。我使用的正点原子的方法,仅展示遇到的问题。可以和Windows保存一致。uboot里的设置。

2023-08-03 13:51:29 146

原创 三十一章 uboot顶层Makefile详解

点原子的开发板肯定也在里面(正点原子添加的), borad 文件夹里面有个名为“freescale”的文。此文件夹为 uboot 配置文件, uboot 是可配置的,但是你要是自己从头开始一个一个项目的。board 文件夹就是和具体的板子有关的,打开此文件夹,里面全是不同的板子,毫无疑问正。文件夹,因此, NXP 官方开发板和正点原子的开发板配置文件肯定也在这个文件夹中,如图。这个做好的配置文件基础上来添加自己想要的功能,这些半导体厂商或者开发板厂商制作好的。编译后的uboot源码文件。

2023-07-31 16:29:18 98

原创 三十三章 uboot使用(universal boot loader)

操作环境变量命令 setenv(set environment修改环境变量) saveenv(保存环境变量),一般环境变量是存放在外部 flash 中的,uboot 启动的时候会将环境变量从 flash 读取到 DRAM 中。所以使用命令 setenv 修改的是 DRAM中的环境变量值,修改以后要使用 saveenv 命令将修改后的环境变量保存到 flash 中,否则的话uboot 下一次重启会继续使用以前的环境变量值。进入 uboot 的命令行模式以后输入“help”或者“?

2023-07-31 15:49:54 86

原创 linux的内嵌汇编代码

p##coproc 先将coproc的参数带入,再将p和带入后的值连接起来,如coproc为15,则最终结果为p15,且是字符串“p15”.#define __STRINGIFY(x) #x 使用#表示将参数转换为字符串表面量。如_STRINGIFY(43) 展开后为“43”“\’”表示一行未写完,启用下一行。/* C语言实现MCR指令 */

2023-07-30 16:28:57 920

原创 stm32内存杂记

AREA伪代码:表示声明一个代码或数据段,NOINIT表示数据段是未初始化的或初始化为零。其只包含零初始化的空间保留命令 SPACE 或 DCB、DCD、DCDU、DCQ、DCQU、DCW 或 DCWU。可以决定在链接时 AREA 是未初始化的还是零初始化的(请参阅RealView 编译工具 2.0 版链接程序和实用程序指南 中的链接程序 一章)。——heap_limit 表示堆的结束地址。heap_men 表示这个命令的地址,即堆的起始地址。———heap_base 表示堆的起始地址。

2023-07-30 15:23:05 148

原创 NVIC的中断挂起寄存器和EXTI的中断挂起寄存器的区别

这张图可以看到,EXTI0_IRQnD的值为6,即对应ISPR0的bit6,在设置中断挂起时,就要设置相应位。可以看到,当有中断信号来时,挂起位置一,即中断线置一,写入一才会清除,硬件可没有清除这项任务。可以看到EXTI的挂起寄存器仅对单片机的外部23根EXTI LINE有效,其中。NVIC的中断挂起表示,信号来了,要开中断了,但我先在不能处理你,你先等一下。x为(0-2),共96个bit,可以管理96个中断挂起。EXTI 的中断挂起表示有对应的中断信号来了。

2023-07-08 15:45:50 351

原创 RTC时钟stm32f407(需要在手册上找到)

首先是备份域(BKP),看手册时必须要看的(以下的上电复位均是指备份域上电复位)这里的电源电压时指V(BAT);上面三个寄存器时影子寄存器。

2023-07-08 15:24:53 188

原创 带参宏的理解

宏最好是大写字母,宏的参数可以有很多,由括号括起来逗号隔开,表达式中 的每个参数单独用括号括起。

2023-06-25 16:27:32 46

原创 共用体内存大小超过最大成员变量问题

如果是13的话,只有用char[12]可以访问这个字节,因为int和float分别是4字节和2字节对齐访问。最重要的 共用体的成员变量共享同一片空间,所以每个成员都可以访问到这个空间的所以内存。只有16这个最小公倍数(没想到会在这里用这个词)才能让每个成员都访问到正片内存块。所以,计算共用体的内存时要用最小公倍数来计算。不过在用的时候肯定是不用考虑这个问题的。

2023-06-24 19:30:20 48

原创 串口收发浮点数加示例代码(共用体)

/通过串口发送43.43,只需要放入共用体里面,然后通过发送四个char 数据,下面是模拟的,还没试过在串口上。printf("接收到的数据receive_data.num:%f\n",receive_data.num);//float占用4个字节所以给四个字符。

2023-06-24 16:53:14 409

原创 结构体大小计算

所以对于 S1 结构体大小为 2*3=6,至于为什么第二个 char,多的那个字节不丢到,就是遵循第三个原则,就是结构体大小结果要为成员中最大字节的整数倍。而对于 B,先不要管 A a,也就是先去掉 A a 成员结构体 B 算出其为 8,所以最后结果为 8+16=24;再看一个:就是当结构体成员变量是另外一个结构体时,只要把结构体中成员为另一结构体作为整体相加就行。因为 int 占 4 个,而 char 已经占了一个,不够,所以那三个只能多余占位。注意: 为什么 仅仅改变了结构体成员的顺序,结果不一样?

2023-06-24 16:33:41 80

原创 Timer 学习

上面的OCCS是代表输出通道电流过载保护机制(Output Channel Current Sense),不参与配置定时器。oc1ref仅标示了该通道的名称。外部时钟模式1来自ITR(来自其它定时器的TRGO)、TI1F_ED(来自输入捕获通道,每来一个上升沿或下降沿计数一次,需配置两者均触发在CC1P中配置)、TI1FP1(输入捕获通道)、ETRF.时钟模式有三种,还有编码器模式。内部时钟模式是默认的选择。定时器有从模式和主模式两种运行方式。外部时钟模式2来自ETR信号。通过OCM1可以配置。

2023-06-10 12:03:21 68

原创 定时器学习

当输入高电平是经过反相器接收低电平,这样如果需要上升沿触发输入捕获事件,可以配置CC1P=0;如果输入信号是高电平到低电平的跳变,也就是我们通常所说的反相信号,就需要使用CC1NP控制位来选择反相输入信号。在TIMx_CCER中配置CC1P和CC1NP,来检测反相和非反相上升沿下降沿。

2023-06-08 22:28:54 45

原创 DMA传输中的缓冲区和增量式突发传输。

DMA不论是用直接模式还是非直接模式都是相对于FIFO来说的,当有FIFO阈值时是非直接模式,当FIFO存储的数据达到阈值时就会触发DMA传输。直接模式是阈值为0,即有数据进入FIFO就会触发DMA传输。突发大小通过软件针对两个 AHB 端口独立配置,配置时使用 DMA_SxCR 寄存器中的。如果配置每次半字传输,且是4个节拍的增量突发传输,则会传输的数据量是4*2=8个字节。MBURST[1:0] 和 PBURST[1:0] 位。突发大小指示突发中的节拍数,而不是传输的字节数。

2023-06-08 22:23:36 434

原创 USART学习记录

使能USART,(TE=1),将数据写入DR,TXE清零,DR中的值传到移位寄存器,TXE由硬件置一。如果没有写入,TXE保持一,移位寄存器中的值全部传输完,TC等于一,表明没有数据需要传输。在传输时,buffersize的值递减,非循环模式时递减到0,循环模式后,减到1后再减为10.发送和接收由通用波特率发生器驱动,发送器和接收器的使能位分别置 1 时将生成相应的发。串口引脚复用配置时,下面的是对的,上面是错的因为。添加寄存器的地址,直接模式时也要配置。发送的TX接接收的RX 引脚。

2023-06-07 20:39:44 44

原创 BCD码在内存中的读取

如要在一个寄存器中写入19,就要分理十位和个位,19/10得1,再左移4位即乘以16,这样内部译码器就会认为存入了1,19%10,放入个位。但是读取到的19确实0001 1001(25),需要进行逆运算,才能得到芯片想要表达的值。在ds1302时钟芯片中,寄存器的内容是以二----十进制保存的。

2023-05-29 18:59:51 104

原创 Freertos 任务切换的理解(仅自己遇到的困难)

bx r14 /* 异常发生时,R14中保存异常返回标志,包括返回后进入线程模式还是处理器模式、使用PSP堆栈指针还是MSP堆栈指针,当调用 bx r14指令后,硬件会知道要从异常返回,然后出栈,这个时候堆栈指针PSP已经指向了新任务堆栈的正确位置,当新任务的运行地址被出栈到PC寄存器后,新的任务也会被执行。ldr r0, [r1] /* 当前激活的任务TCB第一项保存了任务堆栈的栈顶,现在栈顶值存入R0*//* 指向当前激活的任务 */

2023-05-27 20:10:07 189

原创 Freertos优先级分组和几位有效问题

7:4]来表达抢占式优先级,所以没有子优先级。这是在Freertos中官方建议的。这样只需设定一个优先级就能区分了。CM3中的优先级位段,优先级高位对齐,F103的默认值用了4个Bit,即Bit7-4,在优先级。

2023-05-25 17:53:32 52

原创 Freertos 任务调度器之设置pendsv和systick优先级为最低

监视器的地址,但是,这里用的是按字访问,所以0xe000ed20~0xe000ed23组成了一个以0xe000ed20为地址的32 寄存器。一个8位寄存器的高位对齐来设置优先级,且寄存器的高四位有效,所以要左移4位,移出无效区域,可以带入15,和4试一下。因为pendsv和systick分别在第三和第四个寄存器所以分别左移16和24位。0xe000ed20是。

2023-05-25 11:32:29 202

原创 Freertos 创建任务(动态)

Freertos 中portSTACK_GROWTH>0表明栈是向下增长的,arm就是向下增长的,所以进入。事件链表是根据优先级设置链表项的值的,优先级越高(号小的优先级高),值越大。刚创建的任务还没有放入就绪链表,Container指向就绪链表(等)将任务的状态链表插入当前链表项的后面。(就是链表的最后)。任务句柄会获得任务控制块,这样就可以通过任务句柄控制任务。给任务控制块分配空间(回传给任务句柄)。每一个链表都有链表指针,指示当前的链表想。根据传入的指针,pxList就是就绪链表。

2023-05-25 09:56:57 596

原创 学习积累2

在这个例子中,首先定义了一个大小为10的整数数组,然后使用malloc函数动态分配了10个整数的内存空间。在使用内存空间进行数据存储后,最后应该使用free函数释放这块内存空间,以达到最优的内存利用效率。其中,参数size表示要分配的内存空间大小,单位是字节。该函数返回一个指向分配内存的起始地址的指针,也称为动态分配的内存块的首地址。在C语言中,malloc()函数用于动态分配内存空间。最后使用free函数释放这块内存空间,以便避免内存泄漏。调用malloc函数并传入要分配的内存空间大小。

2023-05-19 20:28:45 26

原创 对数据缓冲区(BUFFER)的理解

对数据缓冲器的理解(BUFFER),例如stm32 串口通信中,的发送和接收缓冲器,只需将数据写入,就可以干其它的事情,仅在写入前进行判断有没有待发送的数据,这样可以减少等待时间,不用等发送完。如果写一些访问比较慢的存储器,可以写进BUFFER中,然后让AHB干其它的事情。

2023-05-19 16:34:04 574

原创 汇编理解stm32 启动文件

"Stack_Mem"表示栈空间的起始地址,即在内存中为栈分配的连续空间的起始地址。Stack_Size是栈空间的大小,它表示在内存中为栈分配的字节数。通常,栈空间的大小需要在程序编写和调试期间估计和指定,以确保栈空间足够大,不会发生栈溢出的情况。"SPACE"是汇编中的空间指令,用于在内存中为变量分配指定大小的连续字节空间。BLX:跳转到有寄存器给出的地址,并根据寄存器的LES确定处理器的状态,还要把跳转前的下一条指令地址保存到LR。BX:跳转到有寄存器/标号给出的地址,不用返回。

2023-05-11 16:06:23 513

原创 spi通信的理解(NSS,SSI,SSM位,贼恶心)

NSS是片选为,作为主机,肯定是不能被选中的,我们要去选择别人,(我认为主机和谁通信并不重要,但只能有一个,而且是由我们选择的),只要令NSS1,2,3中的一个为零就可以了(我tm以为是主机的NSS,其实是在软件模式下,我们通过IO口输出低电平片选,从机内部的NSS就会被复位,这样就被选中)SSM=1,为软件模式,内部NSS的值由SSI位确定(NSS=SSI),若选择单片机为主机,则令SSI=1。上图可以看到除NSS外全部两在一起,方便主机更改从机。

2023-05-09 17:43:06 709

实验三时钟实验.zip

实验三时钟实验.zip

2023-04-25

OLED手册下载,有部分内容已经注释了,方便观看

OLED手册下载,有部分内容已经注释了,方便观看

2023-04-02

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除