- 博客(78)
- 收藏
- 关注
原创 CMSIS V2 线程标志(信号)API
用法说明:这个函数用于设置指定线程的标志位。你可以为线程分配不同的标志来控制线程的执行,或者用于线程间的通信和同步。线程1通过osThreadFlagsSet设置标志0x01,然后使用osThreadFlagsClear清除标志。线程间同步:一个线程可以设置标志,而另一个线程可以等待这些标志,直到它们被设置。可以设置为多个标志位,多个标志位可以通过按位或(|)组合。flags:要设置的标志位,多个标志位可以通过“按位或(|)”组合。flags:要清除的标志位,多个标志位可以通过“按位或(|)”组合。
2025-11-30 01:12:46
791
原创 CMSIS-RTOS 任务通知
要等待的信号,可以是一个或多个信号位的组合。/*************************** 信号管理函数 ********************************/信号在任务之间传递时以位掩码的形式存在,每个信号对应一个位,多个信号可以通过按位“或”操作组合在一起。: 要发送的信号,信号是一个 32 位的位掩码,每一位代表一个信号。用于在任务中等待一个或多个信号的到来。* @param signals 等待直到所有指定的信号标志被设置,或者为 0 时表示等待任何一个信号标志。
2025-11-30 01:08:55
660
原创 STM32 FreeRTOS 创建任务(STM32CubeMX / IDE CMSIS-RTOS V2)
19:18:17.391]收←◆myTestTask0_Func running...[19:18:18.385]收←◆myTestTask1_Func running...[19:18:20.375]收←◆myTestTask1_Func running...:选择使用动态内存分配的还是静态内存的方式创建线程。:当使用静态内存创建线程,创建的线程控制块变量名。设置一样会出现调度问题,优先级不要设置一样。设置一样会出现调度问题,优先级不要设置一样。:当使用静态内存创建线程,使用的栈地址名。
2025-11-19 21:18:13
1295
原创 STM32 FreeRTOS 创建任务(STM32CubeMX / IDE CMSIS-RTOS)
用于设置线程名。:用于设置线程优先级。:用于设置线程栈大小(堆栈使用溢出会卡死)。:用于设置线程函数名。:代码的生成方式选项,可选择以 形式生成。:线程函数参数:选择使用动态内存分配的还是静态内存的方式创建线程。:当使用静态内存创建线程,使用的栈地址名。:当使用静态内存创建线程,创建的线程控制块变量名。生成代码后的位置:1、在中声明了任务控制块(TCB)指针变量:来源:实际就是指针2、在中声明了任务的执行函数:这里函数没有参数值,因为设置的:线程函数参数为NULL。
2025-11-09 20:33:14
1214
原创 CMSIS-RTOS 和 RTX 区别
特性CMSIS-RTOSRTX定位标准化接口,允许多个RTOS实现CMSIS-RTOS的实现,专为Keil MDK优化实现不提供RTOS实现,只定义API提供具体的RTOS实现,基于CMSIS-RTOS标准工具链支持可与多种工具链配合使用,如IAR、GCC等主要与Keil MDK工具链集成调试和集成调试和集成依赖于所选RTOS实现提供与Keil调试工具的深度集成,易于调试和分析适用范围更通用,适用于不同RTOS和不同开发环境主要针对Keil环境,适合需要高集成度的应用。
2025-11-02 19:27:23
731
原创 uCOS、FreeRTOS、RTThread、RTX等RTOS的对比、特点
FreeRTOS是专为小型嵌入式系统设计的可扩展的实时内核。亮点包括:微小的封装形式。免费的RTOS调度程序免费嵌入式软件源代码。免版税。抢占式,协作式和混合配置选项,可选时间分片。SafeRTOS衍生产品对代码完整性提供了高度的信心。包括一个为低功耗应用设计的tickless模式。可以使用动态或静态分配的RAM来创建RTOS对象(任务,队列,信号量,软件定时器,互斥体和事件组)。官方支持>30个嵌入式系统架构(以ARM7和ARM Cortex-M3为一体架构)。
2025-11-02 19:25:17
1085
原创 判断函数是否在中断中运行
在 FreeRTOS 中,操作系统使用中断嵌套来实现任务调度。当发生中断时,FreeRTOS 通过禁用中断来保护临界区。因此,你可以使用这些函数来判断当前是否处于中断上下文中。portENTER_CRITICAL() 和 portEXIT_CRITICAL() 是 FreeRTOS 提供的保护临界区的宏,它们会禁用/恢复中断。如果当前正在执行中断,调用这些函数时会影响中断优先级。你可以通过检查这些宏是否影响当前上下文来推测当前代码是否在中断中执行。
2025-11-02 19:22:03
875
原创 STM32CubeIDE IAP Bootloder
新程序的复位中断向量起始地址为 0X08000004+N+M),跳转至新写入 程序的复位向量表,取出新程序的复位中断向量的地址,并跳转执行新程序的复位中断服务程 序,随后跳转至新程序的 main 函数,如图标号②和③所示,同样 main 函数为一个死循环,并 且注意到此时 STM32F4 的 FLASH,在不同位置上,共有两个中断向量表。在 main 函数执行过程中,如果 CPU 得到一个中断请求,PC 指针仍强制跳转到地址 0X08000004 中断向量表处,而不是新程序的中断向量表,如图标号④所示;
2025-11-02 19:17:31
981
原创 ISP软件烧录 与下载问题
(科普一下:被设置为读保护的芯片去除读保护时会将片内所有Flash擦除(0xFF),这也就是FLYMCU串口下载程序时的第一步擦除芯片的方法,先将Flash设为读保护,再解除读保护。先前使用的是FLYMCU的串口下载,可能是因为下载过程中出现BUG从而导致被读保护,但是这种被读保护不是那种名正言顺设置的,所以可能就造成了这种flash读取保护等级紊乱的BUG,而且解保护无法正确进行,所以先进行读保护的设置,再按照正规解读保护的方法进行解读保护,这也是区别于网上常见错误的地方。mcuisp的新版本。
2025-11-02 19:06:22
807
原创 STM32判断软件、硬件启动(看门狗复位启动与上电启动)
那么 RCC 时钟控制和状态寄存器(RCC_CSR)的地址就是0x40023800+0x74。//bit5: 发生来自 VDD 域的独立看门狗复位时,由硬件置 1。//bit0: RMVF:清除复位标志 1:清零复位标志。//bit2: 来自 NRST 引脚的复位时,由硬件置 1。//bit3: POR/PDR 复位时,由硬件置 1。//bit6: 发生窗口看门狗复位时,由硬件置 1。//bit7: 发生低功耗管理复位时,由硬件置 1。//bit4: 软件复位时,由硬件置 1。
2025-11-02 19:02:04
431
原创 STM32实现软件复位
该函数操作的是BASEPRI寄存器,在更精巧的设计中,需要对中断掩蔽进行更细腻的控制——只掩蔽优先级低于某一阈值的中断——它们的优先级在数字上大于等于某个数。往BASEPRI中写0,BASEPRI将停止掩蔽任何中断。该函数操作FAULTMASK寄存器,它把当前优先级改为‐1。注意的是, FAULTMASK会在异常退出时自动清零。PRIMASK 用于除能在 NMI 和硬 fault 之外的所有异常,它有效地把当前优先级改为 0 (可编程优先级中的最高优先级)。第三种方法:操作BASEPRI寄存器。
2025-11-02 18:57:57
353
原创 #define LWIP_DNS 1的问题
函数在api.h中声明,在api_lib.c中实现,注意看宏定义有没有正确识别,有没有被宏定义忽略掉。注释掉下面这些,再取消注释,IDE就能正常识别。可见是IDE本身的问题(BUG),使用时就这样试试。mqttclient.h能识别正确。
2025-11-02 18:55:44
330
原创 STM32 MQTT与百度IoT Core交互
搭建好本地MQTT服务器进行连接测试:ping broker.emqx.io 获取IP地址写入net.c中。需要注意的是测试情况百度MQTT版本5.0是连接不上的,消息质量2也是无法发送和接收的。这里自己也要接收到一次,是应为订阅的主题与发送的主题是一个,这里可以修改。实际使用的时候需要把deviceName换成我们的建立的设备名称。特别注意的是这里的消息质量得在2以下,不然订阅和发送都会失败。这样就是实现不重复接收的交互。修改发送与接收不是一个主题。与百度IoT Core交互。
2025-11-01 22:48:43
939
原创 MQTT连接到百度天工物接入
MQTT连接到百度天工物接入MQTT的服务质量提供3个等级:QoS0:最多发送一次消息,在消息发送出去后,接收者不会发送回应,发送者也不会重发消息,消息可能送达一次也可能根本没送达, 这个服务质量常用在不重要的消息传递中,因为即使消息丢了也没有太大关系。QoS1:最少发送一次消息(消息最少需要送达一次,也有可送达多次),QoS1的PUBLISH报文的可变报头中包含一个报文标识符, 需要PUBACK报文确认。即需要接收者返回PUBACK应答报文。
2025-10-28 19:50:46
1056
原创 Window搭建本地MQTT服务器(MQTTX、MQTT.fx工具交互)
在这里我就不介绍MQTT协议了,网上有很多MQTT协议的介绍,下面有一个。
2025-10-28 19:44:44
1263
原创 HTTP服务器 HelloWord网页与网页控制MCU
浏览器是通过“GET”命令来获取开发板上的数据(资源),同样的,浏览器也可以通过“POST”命令来设置开发板上的资源,当然,我们在服务器端(开发板)需要对“POST”命令产生应答并且处理才可以,因此我们需要对服务器进行改写,而且将开发板上LED等的状态实时显示在网页上。浏览器访问我们的服务器,其实是通过“GET”操作命令获取我们开发板的资源,那么我们在接收到这个命令后,返回我们的资源数据给浏览器,而浏览器显示是通过HTML代码来标记这些资源的,那么我们在开发板中就需要定义好相关的HTML数据,此外,
2025-10-28 19:35:37
640
原创 STM32 HTTP 详解与使用
HTTP 协议是 Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维 网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传输协议,它是基于 TCP/IP 协议通信的,因此它也是基于<客户端-服务器>模型运作的,是一个应用层协议, 可以用它来传输服务器的各种资源,如文本、图片、音频等。HTTP 协议的特点:1. 简单。
2025-10-28 19:28:52
1346
原创 ETH接口+LwIP协议栈使用(DHCP)
LwIP 是 Light Weight Internet Protocol 的缩写,是由瑞士计算机科学院 Adam Dunkels等开发的适用于嵌入式领域的开源轻量级 TCP/IP 协议栈。它可以移植到含有操作系统的平台中,也可以在无操作系统的平台下运行。由于它开源、占用的 RAM 和 ROM 比较少、支持较为完整的 TCP/IP 协议、且十分便于裁剪、调试,被广泛应用在中低端的 32 位控制器平台。针对 LwIP 应用开发了测试平台,其中有一个是在 STM32F4x7 系列控制器运行的。
2025-10-27 00:11:55
1063
原创 网络字节序与地址转换指南(ntohs / ntohl / htons / htonl / inet_ntoa / inet_aton / inet_pton /
在 C/C++ 写网络程序时,常会遇到**网络字节顺序(NBO)与主机字节顺序(HBO)**的问题。为保证不同体系结构之间的兼容性,常用到以下 4 个转换函数:之所以需要这些函数,是因为计算机数据存在不同的字节序:NBO 与 HBO。
2025-10-27 00:04:25
1037
原创 STM32CubeIDE LWIP/UDP、TCP (client、server)静态IP方式实现
LwIP全名:Light weight IP,意思是轻量化的TCP/IP协议。LwIP的设计初衷是:用少量的资源消耗实现一个较为完整的TCP/IP协议栈,其中“完整”主要指的是TCP协议的完整性,实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。此外LwIP既可以移植到操作系统上运行,也可以在无操作系统的情况下独立运行。LwIP具有主要特性:支持ARP协议(以太网地址解析协议)。支持ICMP协议(控制报文协议),用于网络的调试与维护。
2025-10-26 23:27:15
1512
1
原创 STM32F7 LWIP ping不通以及丢包问题
后来在写代码过程中遇见在某些函数中写入if语句就会出现这个问题,以及写while语句等我只好一个个试,非常痛苦,我想到肯定是没有使用CPU Cache的问题,我搜索相关参考配置,有一篇F7的却发现我使用的型号并未有实例当中的提供的配置,尝试了各种各种配置CPU Cache也不行,对手册改了地址,对着官方例程在CubeIDE里面配置也不行。我也怀疑过是不是我硬件走线的问题导致,我测量了CLK的波形也正常,改低100M为10M也不行,就应该不是走线原因了。这段代码,就OK了,问题解决就几个字。
2025-10-26 22:30:58
942
原创 STM32CubeIDE 独立看门狗 (IWDG)
独立看门狗 (IWDG) 由其专用低速时钟 (LSI) 驱动,因此即便在主时钟发生故障时仍然保持。窗口看门狗 (WWDG) 时钟由 APB1 时钟经预分频后提供,通过可配置的时间窗。● 当递减计数器值达到 0x000 时产生复位(如果看门狗已激活)当前设置32分频则IWDG频率:32K/32=1K=1000Hz。● 时钟由独立 RC 振荡器提供(可在待机和停止模式下运行)看门狗时间=单次计数时长*递减计数值。单次计数时长:1000ms/1000=1ms。口来检测应用程序非正常的过迟或过早的操作。
2025-10-26 22:25:58
398
原创 STM32CubeIDE CAN配置
使能后,CAN会在适当的时候自动恢复。Silent Loopback Mode(静默回环模式):该模式下,CAN控制器既不发送CAN消息,也不接收CAN消息,用于测试CAN控制器和CAN总线的硬件连接。第四个,Tx邮箱,可填 (uint32_t*)CAN_TX_MAILBOX0 ,CAN_TX_MAILBOX1 , CAN_TX_MAILBOX3。Loopback Mode(回环模式):该模式下,发送的CAN消息会直接返回到接收缓冲区,用于测试CAN控制器和CAN总线的基本功能。不使能,则只发送一次。
2025-10-26 22:24:11
1055
原创 STM32 USB 虚拟串口
在 USB 设备中,如果是高速设备,则会在 D+上接 一个 1.5K 的电阻到 VCC,而如果是低速设备,则会在 D-上接一个 1.5K 的电阻到 VCC。在 USB 主机上,D-和 D+都是接了 15K 的电阻到地的,所以在没 有设备接入的时候,D+、D-均是低电平。传输速率在25Mbps-400 Mbps (最大480 Mbps)的High-speed接口(简称HS)传输速率在500Kbps-10Mbps(最大12Mbps)的Full-speed接口(简称FS):自定义人机界面设备类(HID)
2025-10-26 21:48:23
1122
原创 STM32硬件SPI
SPI总线是一种4线总线:(1)主设备数据输入,从设备数据输出;(2)主设备数据输出,从设备数据输入;(3)时钟信号,由主设备产生;(4)从设备使能信号,由主设备控制。SPI以主从方式工作,通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是MISO(主设备数据输入)、MOSI(主设备数据输出)、SCLK(时钟)、CS(片选)。
2025-10-26 21:48:05
375
原创 STM32 DAC
DAC 模块是 12 位电压输出数模转换器。DAC 可以按 8 位或 12 位模式进行配置,并且可与 DMA 控制器配合使用。在 12 位模式下,数据可以采用左对齐或右对齐。DAC 有两个输出通 道,每个通道各有一个转换器。在 DAC 双通道模式下,每个通道可以单独进行转换;当两 个通道组合在一起同步执行更新操作时,也可以同时进行转换。可通过一个输入参考电压引 脚 VREF+(与 ADC 共享)来提高精度。
2025-10-26 21:47:43
1136
原创 STM32 ADC软件轮询、ADC_DMA
默认Data Alignment为右对其,即采集的12bit数据放在16bit地位,高位4bit为0。EOC(转换结束)标志,这里用不上随便选择,里面单个转换结束和全部转换结束再置位EOC的选项。选择转换的第一个数据,以及通道,转换周期。中断会使用的我们选择软件转换不使用中断。第二个参数是存储采集回来的ADC值的地址。连续转换模式不使能就是单次转换模式。第三个参数是一次ADC采集的值的个数。表示转换完成标志位,转换数据可用。就是判断转换完成标志位是否设置。的顺序,反过来会出问题。第一个参数是ADC句柄。
2025-10-26 21:47:12
484
原创 ENABLE_FPU启用问题
可能会出现:编译失败。错误是与 STM32 或 ARM 处理器的浮点单元(FPU)相关的问题,特别是在启用 FPU(Floating Point Unit)时,使用了不支持的 FPU 指令。具体的错误消息指向了 vstmdbeq 和 vldmiaeq 这些指令,它们是针对浮点寄存器的存取指令(vstmd 和 vldmi)问题。
2025-10-26 21:46:29
853
原创 STM32 FPU (Float Point Unit)浮点运算单元
STM32F4 属于 Cortex M4F 架构,带有 32 位单精度硬件 FPU,支持浮点指令集,相对于 Cortex M0 和 Cortex M3 等,高出数十倍甚至上百倍的运算性能。这里我们就是要设置 CP11 和 CP10 这 4 个位,复位后,这 4 个位的值都为 0,此时禁止访 问协处理器(禁止了硬件 FPU),我们将这 4 个位都设置为 1,即可完全访问协处理器(开启 硬件 FPU),此时便可以使用 STM32F4 内置的硬件 FPU 了。,提供更小的代码尺寸,适合资源受限的嵌入式项目。
2025-10-26 21:46:03
1030
原创 STM32CubeIDE基本定时器
预装载寄存器的内容既可以直接传送到影子寄存器,也可以在每次发生更新事 件 UEV 时传送到影子寄存器,这取决于 TIMx_CR1 寄存器中的自动重载预装载使能位 (ARPE)。预分频器寄存器(TIMx_PSC)可以通过软件在定时器运行过程中修改它的数值,修改好后的新的预分频数值不会立马生效,而是在下一个更新事件时起作用。计数器由预分频器输出 CK_CNT 提供时钟,仅当 TIMx_CR1 寄存器中的计数器启动位 (CEN) 置 1 时,才会启动计数器。计数器 的时钟可通过预分频器进行分频。
2025-10-23 19:17:58
935
原创 STM32CubeIDE EXTI 外部中断
每根输入线都可单独进行配置,以选择类型(中断或事件)和相应的触发事件(上升沿触发、下降沿触发或边沿触发)。GPIO 的管教 GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G,H,I)分别对应中断线 0~15。勾选EXTI使用的两个中断,并分配优先级。● EXTI 线 20 连接到 USB OTG HS(在 FS 中配置)唤醒事件。● EXTI 线 18 连接到 USB OTG FS 唤醒事件。● EXTI 线 19 连接到以太网唤醒事件。● EXTI 线 22 连接到 RTC 唤醒事件。
2025-10-23 19:12:01
538
原创 STM32 GPIO位操作
每一个位出现1都会映射到ODR端口输出寄存器上,而出现0则无影响。示例:逐个拉高GPIO_PIN_0~GPIO_PIN_15然后逐个拉低GPIO_PIN_0~GPIO_PIN_15。以及之类操作引脚的函数本质:stm32f1xx_hal_gpio.c。库中对于引脚的定义:stm32f1xx_hal_gpio.h。复位同理操作的是BSRR寄存器的BR0~15位。操作:BS0=1 再操作:BS1=1 即。与操作:BS0=1 BS1=1 同时,即。在执行时间上不一样,结果是等价的。其他的位操作同理应用。
2025-10-23 19:08:31
285
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅