自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 内存 管理

分块式内存管理由内存池和内存管理表两部分组成。内存管理表的项值,该项值为0的时候表示对应的内存块没被占用。非0表示该项对应的内存块已经被占用,包括本项对应的内存块在内,总共分配了n个内存块给外部的某个指针。(内存分配方向是从顶到底的分配方向,从最末端开始找空内存。指软件运行时对MCU内存资源的分配和使用的技术。要实现两个函数malloc(内存申请函数)、free(内存释放函数)需要读取所有文件名到内存,方法是定义一个数组才存储所有文件名。(1)内存管理初始化;(2)获取内存使用率;2、内存管理是什么?

2025-01-21 21:23:49 209

原创 流缓冲区和消息缓冲区

消息缓冲区是基于流缓冲区实现的,写入者向消息缓冲区写入10个字节的消息,读取者也必须以10字节的消息读出;为解除读取者的阻塞状态,流缓冲区内的数据所达到的字节数。返回值:StreamBufferHandle_t类型的对象,创建的流缓冲区的对象指针;使用流缓冲区在进程间传输数据时,使用的是复制数据的方式。2、写入数据流(写入数据使用的是数据复制的方式)pvTxData:需要写入数据的缓冲区指针;返回值:实际写入流缓冲区的数据字节数;返回值:实际读取流缓冲区的数据字节数;从流缓冲区读取一定长度的字节数据流。

2024-12-03 17:24:34 454

原创 FreeRTOS任务通知

(3)#define taskNOTIFICATION_RECEIVED ((uint8_t)2) /*任务在等待接收,调用了发送任务通知函数,等待接收方接收*/(2)#define taskWAITING_NOTIFICATION ((uint8_t)1) /*任务在等待通知,调用了接受任务通知函数,等待发送方发送*/(1)#define taskNOT_WAITING_NOTIFICATION ((uint8_t)0)/*任务为等待通知,任务通知默认的初始化状态*/

2024-11-22 16:42:31 388

原创 事件标志组

一个事件组包含一个EventBites_t数据类型的变量,实际上是一个16位或32位(默认)无符号数据类型。高八位用来存储事件标志位的控制信息,低24位用作存储事件标志。1、动态分配内存方式创建事件组xEventGroupCreate();2、清除事件标志位xEventGroupClearBits();4、等待事件标志位xEventGroupWaitBits();事件标志位:用一个位来表示,事件是否发生;1、每个位表示一个事件(高8位不算);事件标志组:一组时间标志位的集合;编写代码创建事件组。

2024-11-17 20:55:56 173

原创 freertos信号量

另外创建两个任务,一个任务用来释放信号量,另一个任务用来获取信号量生成文件。信号量(Semaphore)和互斥量(mutex)都可应用于进程间通信,都是基于队列的基本数据结构。:当一个互斥信号量正在被一个低优先级任务持有时,如果此时有一个高优先级任务尝试获取这个互斥信号量,那么这个高优先级的任务会被阻塞。获取二值信号量,任务二里,只要信号量一被释放,就能获取到,阻塞时间设置为最大;信号量就相当于这个队列的空位,当计数值大于0,说明有空位,就有信号量资源;释放二值信号量,在任务一里,按键按下释放信号量;

2024-11-14 21:34:33 1113

原创 进程间通信与消息队列

向队列后端写入数据(FIFO模式)的函数是xQueueSendToBack(xQueue写入队列句柄,pvItemToQueue要写入的数据,xTicksToWait阻塞等待时间);当任务向一个队列发送消息时,可以指定一个阻塞时间(等待时间),此时该任务处于阻塞状态。当队列有空闲空间时,多任务先进入的(优先级相同,优先级不相同的时候高优先级先进入)就绪态。队列中的每个数据叫做“队列项目”,队列能存储队列项目的最大数量称为队列的长度。在创建队列时,就要指定队列长度和队列项目的大小(跟数组差不多)。

2024-11-11 20:17:10 541

原创 freertos与中断

另一个称为“中断级”,即后缀带“FromISR”的函数或带后缀“FROM_ISR”的宏函数,也称为中断安全API函数(可以在可屏蔽中断的ISR可以调用)。PendSV中断的抢占优先级为15,(优先级最低)。中断分为两组,优先级0~4的中断不受FreeRTOS的管理,称为FreeRTOS不可屏蔽中断,优先级5~15的中断是FreeRTOS可屏蔽中断。在使用这些代码段时,不能调用触发任务调度的函数,或申请信号量等进行进程间同步的函数,不然会失去定义中断屏蔽代码段或临界代码段的意义。2.1中断屏蔽和临界代码段。

2024-11-09 14:38:47 550 2

原创 Freertos任务管理

然后就在freertos里进行设置,接口选择CMSIS_V2,config\include parameters都是默认设置,在Task and Queues里添加两个任务,任务1使用动态分配内存方式,优先级为osPriorityNormal,任务2使用静态分配内存方式,优先级为osPriorityBelowNormal。不主动进行上下文切换,也不使用时间片,而是当运行状态的任务进入阻塞状态时,或运行状态的任务调用函数taskYIELD()(函数功能,主动进行一次上下文切换)时,才会进行一次上下文切换。

2024-11-05 21:40:34 912

原创 ADC数模转换

函数hHAL_ADC_Start()用于以软件方式启动ADC常规通道的转换,软件启动转换后,需要调用HAL_ADC_PollForConversion()查询转换是否完成,转换完成后可用函数HAL_ADC_GetValue()读出常规转换结果寄存器里的32位数据。转换完成后会触发中断,在中断服务函数中,可以用HAL_ADC_GetValue()读取数据。在多重模式下,有一个专门的32位数据寄存器ADC_CDR,,双重模式下,高16位存储ADC2的转换结果,低16位存储ADC1的转换结果。

2024-10-20 19:52:48 486

原创 RTOS 入门

的责任就是决定在 某一时刻 CPU 究竟要运行哪一个任务,任务调度器使得 CPU 在各个任务之间来回切换并处理 任务,由于切换处理任务的速度非常快,因此就给人造成了一种同一时刻有多个任务同时运行 的错觉。生成工程后,进入freertos.c文件后,找到void StartDefaultTask(void *argument)这个函数,大概在114行左右,就在这个函数里写点灯的代码。要注意的是,在固件包和版本哪里,不要选择最新的版本,不然生成之后会报错,找不到CMSIS头文件。GPIO可以自己设置。

2024-10-13 15:39:10 678

原创 浅学DMA

(2)DMA流,进行DMA数据传输的链路。一个DMA控制器有8个DMA流,每个DMA流有独立的4级32位FIFO缓冲区。UART使用DMA方式传输数据时,UART的全局中断要打开,但是UART的接收完成和发送完成中断事件源可以关闭。初始化要设置:DMA流和通道、传输方向、工作模式(循环或正常)、源和目标数据宽度、DMA流优先级别等参数;当UART以DMA方式发送或接收数据时,DMA流的传输完成事件中断的回调函数就是UART的回调函数;(2)循环模式,接收满一个缓冲区的数据后,产生DMA传输完成事件中断。

2024-10-12 11:49:53 522

原创 直流电机编码器测速

总的来说编码器测数,就是先用一个定时器生成PWM波,然后另一个定时器用来计数,捕获A、B相的脉冲。知道脉冲以后,再使用一个定时器来计算当前电机的速度,编码器的计数就相当于电机的位移,定时的时间就是时间,速度就等于位移除以时间。下面是我打算做平衡小车的引脚配置,跟上面文章里的不一样。放这方便我后面写闭环。STM32TB6612电机接口OLED蓝牙模块MPU6050PB12AIN1PB13AIN2PA8PA15BIN1PA12BIN2PA11AO1M+AO2M-

2024-09-28 14:22:44 1734

原创 UART通信

补充:单工、半双工和全双工通信定义:单工是指在通信过程的任意时刻,信息只能由一方A传到另一方B的单向传输;半双工是指在任意时刻,信息既可由A传到B,又能由B传A,但只能由一个方向上的传输存在,称为半双工传输。全双工指在任意时刻,信息既可由A传到B,又能由B传A的双向传输。

2024-09-22 18:24:12 1578

原创 RTC实时时钟

入侵检测(tamper detection)有两个输入信号源,RTC_TAMP1和RTC_TAMP2.当检测到入侵事件发生时,MCU会复位20个备份寄存器的内容,MCU会产生中断事件信号,还会记录时间戳数据。Wake up clock周期唤醒的时钟源为1hz,wake up counter唤醒计数器的重载值,为0一秒唤醒一次中断,为1每两秒发生一次唤醒中断。RTC初始化函数总是设置RTC的日期和时间,增加初始化代码,让RTC的初始日期和时间由备份寄存器的内容决定。RTC有两个闹钟,即闹钟A和闹钟B。

2024-09-21 18:47:49 2064 1

原创 IIC和MPU6050

开漏输出:只有接地的mos管工作,下面的漏极相当于什么都没接,属于开路状态,就叫开漏。mos管导通输出低电平,断开相当于输出浮空/高阻态状态,就要连接一个上拉电阻,拉高电平。接受一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),释放SCL。推挽输出:MOS 管输出高低电平时电流的动作,推就是 连接电源的mos管导通,向外推出电流,挽就是下面接地的mos管导通,将外接的电流挽回来。发送应答:主机在接受完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答。

2024-09-16 21:33:21 967

原创 STM32定时器(基础、通用定时器)

打开输入PWM的中断。寄存器CCR1里的值 是PWM波的周期,寄存器CCR2里的值表示的是PWM的脉宽。(2)计数寄存器(TIMx_CNT):计数器使用CK_CNT进行计数,当计数器的值等于自动冲在寄存器的值时产生计数溢出(counter overflow),同时产生更新事件(UEV)或DMA请求。/************************************PWM 输出******************************************************/

2024-09-14 15:23:36 907

原创 STM32中断和外部中断

(4)(针对F4)外部中断的抢占优先级不能为0,因为在写外部中断的回调函数要调用HAL_Delay(),但是HAL_Delay()会用到systick定时器中断(该中断抢占优先级为0)。(3)HAL_GPIO_EXIT_IRQHandler(GPIO_PIN_1)//外部中断ISR中调用的通用处理函数。在中断操作的相关函数中,都用IRQn_Type枚举类型类型的中断号表示中断,在中断名称后面加了“_IRQn”1、如果两个中断的抢占优先级和次优先级都一样,那个中断先发生,就执行那个中断的ISR;

2024-09-09 21:07:33 535

空空如也

空空如也

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

TA关注的人

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