- 博客(58)
- 收藏
- 关注
原创 通过BUG(prvIdleTask、pxTasksWaitingTerminatio不断跳转问题)了解空闲函数(prvIdleTask)和TCB
在没有其他任务可运行时(没有任何其他任务处于就绪态时)保持 CPU 忙碌这是 FreeRTOS 内部函数(定义在 tasks.c 中),负责检查并清理 pxTasksWaitingTermination 列表中的已删除任务。当任务被 vTaskDelete 标记为待删除时,FreeRTOS 将其 TCB 加入该列表。prvCheckTasksWaitingTermination 会释放 TCB 和栈内存,但前提是任务列表有效且资源可用。
2025-06-05 21:46:45
902
原创 FreeRTOS中如何检查信号量上锁和解锁
通过 uxMessagesWaiting,可以准确判断 FreeRTOS 互斥量的上锁和解锁状态。初始化后 uxMessagesWaiting = 1 表示未锁,加锁后变为 0 表示被锁。调试时需注意断点位置和堆内存配置,以确保状态显示正确。
2025-06-05 11:17:44
118
原创 Keil 中因未引入源文件导致的函数调用与索引失败:从找不到定义到全局搜索无效
找到项目文件,通常是 F103_Moduel.uvproj 或 F103_Moduel.uvprojx,位于项目根目录。用文本编辑器(如 Notepad++)打开该文件。搜索 random.c(Ctrl+F 输入 random.c)。
2025-06-03 13:29:36
320
原创 HardFault_Handler调试及问题方法
如下所示我们找到SP寄存器,0x20001F40即为栈地址,栈里面的值依次为R0~R3、R12、PC(Return address)、xPSR(CPSR或SPSR)、LR。接下来在keil_MDK工程中,编译代码,并debug,之后全速运行,可以看到如下图所示程序进入HardFault异常。有两个连续08开头的,这是两个地址,第一个地址是卡住的具体位置,第二个是卡住的具体函数。),点击go to即找到出现异常的代码段附近下面要执行的程序。点击黄色,就跳到了卡住的具体位置。
2025-05-23 16:16:38
159
原创 printf调试时候正常,运行时打印不出来
问题是在添加了 printf 功能后,程序独立运行时无法正常打印输出,而调试模式下正常。这表明问题可能与 printf 的重定向实现、标准库配置、或编译器相关设置有关。原来是使用 Keil/IAR,printf可能需要启用。
2025-05-10 20:42:49
305
原创 not a genuine st device abort connection的问题
2.然后在Other里面把Enabled的钩子去掉。1.魔法棒里面电机Settings。
2025-05-10 19:48:37
251
原创 出一期Source Insigned的使用教程
比如在这里面注释掉gpio.h,ctrl+s之后,keil也会显示gpio.h,注意这个keil的文件必须是source insight使用的文件。之后会显示右边这一栏,如果没有,需要按照下图步骤进行。点add tree,递归添加,然后确定,就可以了。第一个是你要命名的名字,第二个是你想储存的路径。Ctrl+S(可以实现编辑了)选择你要解析的文件路径。
2025-05-08 21:13:39
578
原创 蓝桥杯----单片机备战笔记
bit 是 C 语言中的一种数据类型,通常由特定编译器(如 Keil C51 或 SDCC)扩展支持,用于声明一个单比特变量。sbit定义:sbit 是“special bit”的缩写,是特定编译器(如 Keil C51)提供的关键字,用于声明直接映射到硬件寄存器(如端口、控制位)的单比特变量。十三、u8 i 和 int i 在for循环中引起的区别。
2025-05-05 11:43:49
867
原创 Freertos--统计所有任务栈信息以及CPU占比和钩子函数
空闲函数(Idle Task):FreeRTOS 自动创建的一个任务,优先级最低(0),在没有其他任务可运行时执行。它的主要作用是执行空闲任务逻辑,例如进入低功耗模式或清理已删除任务的资源。钩子函数(Idle Hook Function):也叫空闲任务钩子,是用户定义的一个函数,FreeRTOS 允许你在空闲任务中调用它。钩子函数不是空闲函数本身,而是空闲任务在每次循环时可以调用的一个用户自定义函数。
2025-04-25 17:27:46
1094
原创 Freertos----中断管理
在RTOS中,需要应对各类事件。这些事件很多时候是通过硬件中断产生,怎么处理中断呢?假设当前系统正在运行Task1时,用户按下了按键,触发了按键中断。你要注意到,ISR是在内核中被调用的,ISR执行过程中,用户的任务无法执行。
2025-04-24 20:59:14
314
原创 Freerots----任务通知
我们使用队列、信号量、事件组等等方法时,并不知道对方是谁。使用任务通知时,可以明确指定:通知哪个任务。使用队列、信号量、事件组时,我们都要事先创建对应的结构体,双方通过中间的结构体通信。需要创建:(直接用任务通讯就可以,任务句柄)
2025-04-24 12:21:46
430
原创 Freertos----互斥量
优先级继承是 FreeRTOS 互斥信号量的一个关键特性,用于避免 优先级反转。优先级反转是指高优先级任务因等待低优先级任务持有的资源而被阻塞,且可能被中优先级任务抢占,导致延迟。工作机制当高优先级任务尝试获取被低优先级任务持有的互斥信号量时,FreeRTOS 临时将低优先级任务的优先级提升到高优先级任务的水平。低优先级任务以高优先级运行,尽快完成资源使用并释放信号量。释放信号量后,低优先级任务的优先级恢复。假设有三个任务:Task L(低优先级,优先级 1)使用互斥量。
2025-04-18 14:06:26
556
原创 Freertos----信号量
创建信号量SemaphoreHandle_t xSemaphoreCreateCounting(UBaseType_t uxMaxCount, UBaseType_t uxInitialCount);删除信号量void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );对于动态创建的信号量,不再需要它们时,可以删除它们以回收内存。释放信号量BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore );获
2025-04-17 18:36:34
781
原创 头文件与源文件声明类型的区别
我们知道,头文件一般都是在声明类型、变量、函数的(包括extern声明变量)。那可不可以放到源文件中声明呢?区别又是什么?可以在其他源文件中使用这个定义的类型(HexToBin) (前提:include这个头文件)只能在自己的源文件中使用定义的类型(HexToBin)。
2025-03-19 20:38:45
173
原创 平衡车电机连接与控制
PWMA和PWMB是控制速度,而M1A、M2A、M1B、M2B是控制方向。3530电机通过编码器将速度反应给主控芯片。TB6612FNG芯片连接3530电机。主控芯片连接TB6612FNG芯片。
2024-12-28 17:38:28
136
原创 STM32串口接收与发送(关于为什么接收不需要中断而发生需要以及HAL_UART_Transmit和HAL_UART_Transmit_IT的区别)
【代码】HAL_UART_Transmit和HAL_UART_Transmit_IT的区别(串口发送只能收到一个字节)
2024-12-06 00:23:21
2921
原创 关于keil项目烧录第二次就会出现no target connect的问题
两种调试接口,但某些开发板或 MCU 默认启用了 JTAG。选择 JTAG 可能会导致连接问题,特别是当目标板的调试引脚与其他外设共享时,可能导致冲突或信号不稳定。而 SWD 是更轻量的接口,通常占用的引脚更少,更适合用于大部分开发应用。STM32 系列 MCU 通常支持。
2024-12-02 15:58:01
556
原创 最新版的stm32f1xx.h文件中取消了u8, u16, u32的类型定义
使用typedef多次重新定义罢了,关于这些定义可以看下面几个文件:core_cm4.h;其实ST之所以这样多种方式表示同一个值,主要是减少代码编写工作量,同时也是为了向下兼容旧版本的程序。使用芯片stm32f103zet6和stm32l151c8t6,在移植程序时发现,编译器提示u8未定义;stm32l1xx系列,本来在旧的.h文件中对uint_8等有类型定义为u8, 但是新的.h文件中没有了。新版.h文件已经锁定,无法直接修改添加;可以自建一个头文件,重新定义包装一下。
2024-12-01 14:55:33
349
原创 GPIO的寄存器以及ODR和BSRR的区别
每个引脚的复用功能通过这两个寄存器中的相应位进行配置。低16位设置引脚为高电平(置1),高16位设置引脚为低电平(置1),此操作是原子性的,不会影响其他引脚。每两个连续的位配置一个引脚的上拉或下拉电阻,支持没有电阻、上拉电阻、下拉电阻。每两个连续的位配置一个引脚的输出速度,支持低、中、高、极高速选项。寄存器也是一个32位寄存器,用于设置和重置 GPIO 引脚的电平状态。寄存器是一个16位寄存器,用于读取或设置 GPIO 引脚的输出状态。寄存器用于读取引脚的输入状态,返回每个引脚的电平状态(高或低)。
2024-11-28 14:56:42
1598
原创 STM32的中断(什么是外部中断和其他中断以及中断号是什么)
EXTI或者其他外设发出的中断信号就是中断号,每一个中断信号都有唯一的中断号,也可以叫中断通道号。中断通道号会交给NVIC处理,我们在配置NVIC就是在配置相应中断号的优先级。配置方式如下图:这里以定时器为例,其实没什么区别。EXTI的中断方式是上升沿或下降沿和需要配置中断线,这里的中断方式是溢出中断。EXTI配置:我们要配置他的外部中断源(哪个引脚),以及触发方式,还有选择外部中断线。如上上面的那种图就是在配置EXTI9_5_IRQn中断号的优先级。注意:某个 GPIO 引脚与 EXTI 线路(如。
2024-11-21 19:09:58
1348
原创 关于中断向量表中没有EXTIx_IRQHandler的问题
在该文件中,所有的中断服务例程(ISR)都会按照特定的顺序列出,包括外部中断(EXTI)。但是在 STM32F103 中,外部中断的线路 5 到 9(包括 EXTI7)会共享一个中断向量,因此,如果你在中断向量表查找中断向量服务函数时,没有查找到EXTI7_IRQHandler等,是因为中断向量中根本就没有这个函数。(EXTI15_10_IRQHandler同理)因此,您需要使用 EXTI9_5_IRQHandler。STM32 的中断向量表通常由启动文件(如。,这是因为它们使用相同的硬件中断线路。
2024-11-21 17:39:47
381
原创 标准库 -- 为什么 EXTI中断需要使能复用时钟与为什么不需要使能?
外部中断(EXTI):由于外部中断需要从特定的 GPIO 引脚或外部信号引脚获取触发信号,因此需要配置GPIO 引脚复用,使得引脚可以连接到 EXTI 系统。其他中断(如串口、定时器等):这些中断直接由相应外设(USART、TIM 等)产生,不需要通过 GPIO 引脚,因此不需要配置复用功能,只需要启用相关外设的中断。因此,在 STM32 中,外部中断需要配置复用来链接 GPIO 引脚与 EXTI 线路,而串口和定时器中断则直接由硬件外设产生,不需要这样的配置。
2024-11-10 14:52:43
621
原创 如何实现Delay_us和Delay_ms延时(SysTick定时器)
SysTick的主要用途(计时)操作系统心跳时基:在实时操作系统(RTOS)中,SysTick通常用于产生周期性中断,作为系统节拍,触发任务切换和延时计时等功能。精确延时:在裸机开发中,SysTick可用于实现精确延时,适合对时间敏感的应用场景。通用计时器:在没有其他通用计时器的情况下,SysTick可以用作简单的通用定时器。
2024-11-09 18:20:33
1310
原创 关于stm32中IO映射的一些问题
虽然固件库已经包含了GPIO寄存器的内存映射,但位带操作提供了一种简便、直接的位操作方式,特别适合于频繁、独立的位操作需求,简化了代码,同时解决了多任务环境中的竞争问题。在STM32固件库(比如HAL或LL库)中,GPIO的寄存器映射已经定义好了,开发者可以通过标准的读写操作访问GPIO引脚的状态。接下来,我们可以直接通过带位操作来修改特定值。一、我们可以直接通过位移操作来修改特定值。二、下面我们提供另一种方法,位带操作。
2024-11-09 16:56:41
295
原创 关于STM32在代码中的而GPIO里面的寄存器(ODR等)不需要宏定义的问题
GPIOA_BASEGPIOA->BSRRBSRR寄存器的地址会是0x10(这是在硬件手册中定义的)。BSRR。
2024-11-06 17:20:34
349
原创 STM32的TIM中Prescaler和ClockDivision有什么用以及计数器溢出时间计算
我们在stm32中需要使用到时钟,在设置时容易把Prescaler和ClockDivision混淆,为什么有时候ClockDivision不需要设置呢?PrescalerPrescalerPrescalerPrescaler可以进一步降低计数频率。
2024-11-03 17:02:37
2270
1
原创 关于IIC在通讯时为什么不会改变输入输出模式
这段代码利用开漏输出特性,不需要手动切换引脚方向,**通过将 SDA 设置为高电平(浮空)**就能让引脚处于输入模式,以检测从设备是否发送了 ACK 信号。
2024-11-01 00:02:21
567
原创 GPIO -- 推挽输出与开漏输出
N-MOS管被导通,外部电流接地,电流被挽进来。此时外部电流为0。推挽输出:一、高电平大小确定:高电平只能受固定的VDD控制。二、多个设备共享:不可以几个GPIO控制一个输入。三、响应速度:推挽输出可以快速切换高低电平,适合高频应用。开漏输出:一、高电平大小不确定:可以自己决定。二、可以几个GPIO控制一个输入。三、响应速度:开漏输出响应速度受上拉电阻影响,上升时间较慢。为什么开推挽不能支持几个GPIO控制一个输入?
2024-10-31 16:47:05
763
原创 什么是高阻态?
一、什么是高阻态:在开漏(open-drain)输出配置中,如果两个 MOSFET(场效应晶体管)都处于不导通状态,相当一个大电阻,这种情况相当于将输出引脚置于高阻态。
2024-10-31 14:40:57
1853
原创 解决:Microsoft Defender SmartScreen 已阻止此不安全内容
我们在下载一些盗版软件时候,会触发了Defender SmartScreen检测,导致无法继续操作,非常苦恼,一下是解决办法:
2024-10-30 14:06:13
8871
1
原创 HAL_RCCEx_PeriphCLKConfig函数配置ADC时钟
【代码】HAL_RCCEx_PeriphCLKConfig函数配置ADC时钟。
2024-10-29 13:03:25
437
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人