![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
stm32
文章平均质量分 65
老子姓李!
单片机开发、嵌入式开发、MATLAB、Linux、电子设计等,忙于学习,感谢关注。私信评论看到了就必回。
展开
-
【 STM32 HAL 详解】CubeIDE实现串口接收不定长数据DMA+串口重定向
基于STM32G0,使用DMA方式,实现串口接收不定长的数据原创 2023-04-03 23:29:07 · 3887 阅读 · 7 评论 -
【详解~按键状态机~功能Plus】2.实现单击、双击、长按的功能(基于STM32)
按键状态机讲解见:【详解~按键状态机】1.实现短按长按的功能本文长按短按的基础上,增加了双击功能。文章目录1.问题描述2.单击、双击、长按的定义3.代码变更讲解3.1 宏定义3.2 结构体、枚举型3.3 按键全局变量3.4 函数定义关键函数3.5 定时器中断及main函数定时器函数main函数4.实验验证5.总结1.问题描述使用一个按键,实现长按、单击、双击操作。运用状态机思想,提高效率。外设:io口、定时器2.单击、双击、长按的定义 事.原创 2022-03-26 16:37:57 · 9343 阅读 · 6 评论 -
【源码详解~按键状态机~简洁易懂】1.单个按键实现短按长按的功能(基于STM32)
0.引言在日常生活中,有不少按键长按、短按的应用实例。比如:一个台灯,短按切换亮度,长按关机。问题来了,单片机是如何区分按键的短按和长按的呢?原创 2022-03-26 15:23:15 · 8236 阅读 · 15 评论 -
【STM8】串口通信实现(LED的亮灭控制)
情景说明:找到一块STM8开发板,打算拿着做点小东西玩一下。实现LED亮灭控制1.开发平台及环境芯片型号:STM8S03F开发板图片:开发环境:使用IAR软件。环境搭建,请自行百度。2.波特率配置公式:其中:f为时钟源频率主时钟经过CLK_CKD IVR分频得来。我这里使用HSI内部时钟16M,CLK_CKD IVR=00不分频,即f=16M。UATRT_DVI 串口分频。也就是我们要计算的数值以9600举例:UATRT_DVI = 16m/115200 = 138.原创 2022-03-23 17:50:47 · 1937 阅读 · 1 评论 -
【FreeRTOS】13.STM32移植-互斥信号量
互斥信号量实质是一个拥有优先级继承的二值信号量,当互斥信号量在被一个低优先级的任务使用,高优先级的任务尝试获取这个互斥信号量而被阻塞。由于继承特性,此时低优先级的任务会被提升到与高优先级任务相同的优先级。互斥信号量将“优先级翻转”的影响降到最低,但是并不能完全消除。所以,硬实时应用应该在设计时,尽量避免优先级翻转。此外,互斥信号量不能用于中断。原因有两点:1.优先级继承机制只适用于任务,并不能用于中断服务函数。2.中断讲究快进快出,不能因为阻塞时间进入阻塞状态。API函数函数描述原创 2021-08-24 13:45:51 · 222 阅读 · 0 评论 -
【FreeRTOS】14.STM32移植-软件定时器
软件定时器硬件定时器功能强大,遗憾数量较少。故可以使用软件定时器来拓展,软件定时器允许设置一段时间,当设置的时间达到后就执行指定的功能函数,模拟实现定时器中断的功能。回调函数被定时器调用的函数叫定时器回调函数,回调函数执行的间隔叫定时器周期。软件定时器的回调函数在定时器服务任务中执行的,一定不用在回调函数中调用任何会阻塞的任务API函数,如vTaskDelay、vTaskDelayUnti、阻塞信号量等。定时器服务任务与队列定时器是可选的、不属于FreeRTOS内核的功能,由定时器服务任务提供。原创 2021-08-24 13:45:13 · 291 阅读 · 1 评论 -
【FreeRTOS】9.STM32移植-队列
定义:队列是任务与任务、中断与任务直接通信二准备的。队列用于消息传递,又叫做消息队列。需要交流的数据保存在队列中,叫做队列项目。队列所能保存的队列项数量叫队列长度。typedef struct QueueDefinition{ int8_t *pcHead; //头 int8_t *pcTail; //尾 int8_t *pcWriteTo; //下一个空闲区域 union //联合体 { int8_t *pcReadFrom; //当用作队列指向原创 2021-08-23 11:35:23 · 296 阅读 · 0 评论 -
【FreeRTOS】4.STM32移植-列表和列表项
为什么学列表和列表项?列表和列表项是一种数据结构,作为FreeRTOS的一个基石,源码中使用了大量的列表和列表项。列表:typedef struct xLIST{ listFIRST_LIST_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ configLIST_VOLATILE UBaseType_t uxNumbe原创 2021-08-23 11:27:11 · 135 阅读 · 0 评论 -
【FreeRTOS】12.STM32移植-优先级翻转
优先级翻转高优先级的任务由于等待信号量而被挂起,导致不需要信号量的低优先级任务先运行。实验目的在使用二值信号量的时候会存在优先级翻转的问题,本实验通过模拟的方式实现优先级翻转,观察优先级翻转对抢占式内核的影响。实验设计设置了四个任务。start_task:创建3个任务high_task:高优先级任务,获取二值信号量触发middle_task:中优先级任务,简单引用任务low_task:低优先级任务,和高优先级任务一样需获取同一个二值信号量才能触发,占用信号量的时间比较长实验代码:#in原创 2021-08-24 13:44:27 · 184 阅读 · 0 评论 -
【FreeRTOS】11.STM32移植-计数型信号量
计数型信号量又叫数值信号量。用户只需要关心信号量存了多少数据量。应用:事件计数每次事件发生的时候,在事件处理函数中释放信号量,信号量计数值加一。其他任务获取信号量处理事件,信号量计数减一。信号量的值就是队列结构体成员uxMessgesWaiting。初始值需赋值为0资源管理信号量的初始值为资源数量,获取成功后减1,释放加1。相关API函数函数描述xSemaphoreCreateCounting()动态方法创建计数型信号量xSemaphoreCreate原创 2021-08-23 11:37:20 · 142 阅读 · 0 评论 -
【FreeRTOS】10.STM32移植-二值信号量
信号量类似于标记位, 可以用来控制同时访问特定资源的线程数量,通过协调各个线程,以保证合理的使用资源。信号量主要目的有两个:共享资源访问、任务同步。信号量分类:1.二值信号量2.技术型信号量3.互斥信号量4.递归互斥信号量二值信号量创建函数描述vSemaphoreCreateBinary()动态创建二值信号量,老版本(默认调用Give)xSemaphoreCreateBinary()动态创建二值信号量,新版(默认无效,需要用户Give,返回值为创建成功句柄)原创 2021-08-23 11:36:29 · 219 阅读 · 0 评论 -
【FreeRTOS】 8.STM32移植-延时函数
FreeRTOS 延时函数vTaskDelay()函数 vTaskDelay()是相对模式(相对延时函数),函数 vTaskDelayUntil()是绝对模式(绝对延时函数,,while循环的时间是绝对的)。要使用的话宏 INCLUDE_vTaskDelay 必须为 1。绝对延时保证周期性。绝对延时使用方法:TickType_t PreviousWakwTime;// 延时50ms,但是vTaskDelayUntil的参数为需要设置的节拍数,不能直接设置延时时间,使用pdMS_TO_TICKS(原创 2021-08-23 11:33:46 · 780 阅读 · 0 评论 -
【FreeRTOS】7.STM32移植-内核控制函数与临界区
内核控制函数函数 taskYIELD()此函数用于进行任务切换, 此函数本质上是一个宏。临界区代码保护,在临界区的任务拒绝任务调度的打断。如读取IIC数据,不能被打断,需进入临界区。函数描述taskYIELD()任务切换。taskENTER_CRITICAL()进入临界区,用于任务中。taskEXIT_CRITICAL()退出临界区,用于任务中。taskENTER_CRITICAL_FROM_ISR()进入临界区,用于中断服务函数中。taskEX原创 2021-08-23 11:31:39 · 172 阅读 · 0 评论 -
【FreeRTOS】6.STM32移植-系统运行时间统计
vTaskGetRunTimeStats()FreeRTOS 可以通过相关的配置来统计任务的运行时间信息, 任务的运行时间信息提供了每个任务获取到 CPU 使用权总的时间。函数 vTaskGetRunTimeStats()会将统计到的信息填充到一个表里面,表里面提供了每个任务的运行时间和其所占总时间的百分比 。函 数 vTaskGetRunTimeStats() 是 一 个 很 实 用 的 函 数 , 要 使 用 此 函 数 的 话 宏configGENERATE_RUN_TIME_STATS 和 co原创 2021-08-23 11:29:56 · 965 阅读 · 0 评论 -
【FreeRTOS】5.STM32移植-任务信息查询和信息统计
API函数:UBaseType_t uxTaskPriorityGet(TaskHandle xTask)查询任务优先级uxTaskPrioritySet(TaskHandle xTask)设置任务优先级。供系统内核使用,用户避免通过此函数修改优先级。uxGetNumberOfTask()获取任务个数。uxTaskGetSystemState()获取系统中所有函数的任务状态,每个任务的状态信息保存在TaskState_t 类型的结构体里面。此结构体包含了任务句柄、任务名字、堆栈、优先级等信息原创 2021-08-23 11:28:42 · 306 阅读 · 0 评论 -
【FreeRTOS】3.STM32移植-中断管理理论
STM32提供了中断管理的嵌套向量中断控制器(NVIC)Cotex-M3和M4最多支持240+的IRQ,一个不可屏蔽中断(NMI),一个滴答定时器中断和多个系统异常。CM3中,数字越小,优先级越高。三个系统的中断为负数,优先级最高。 支持3个固定的高优先级和多达256级的可编程优先级,支持128抢占。绝大多数芯片会精简设计,裁掉低端的有效位。如果使用三位表达优先级,低的5位会被裁掉,读值都是0.7到3,对应0到4。STM32只用了高四位表示优先级。裸机实现一般用的事组2优先级,即7,6表示抢占优原创 2021-08-11 09:09:34 · 260 阅读 · 0 评论 -
【FreeRTOS】2.STM32移植-任务挂起和恢复
u :代表unsigned。s :代表short。c :char。所以类似uc,us类的变量就是unsigned char,unsigned short,分别对应uint8_t,uint16_t。x :为用户自定义的数据类型,比如结构体,队列等。常看到ux开头的函数,就是unsigned且用户自定义的类型。需要注意的是size_t变量前缀也是ux。e :枚举变量p :指针变量类似(uint16_t *)变量前缀为pus。prv :static函数v: void函数挂起:原创 2021-08-11 09:02:43 · 132 阅读 · 0 评论 -
【FreeRTOS】1.STM32移植-跑马灯程序
stm32移植FreeRTOS后的跑马灯程序vTaskStartScheduler(); //开启任务调度xTaskCreate 创建任务任务函数格式: void vTaskCode( void * pvParameters ) { // The parameter value is expected to be 1 as 1 is passed in the // pvParamete原创 2021-08-11 08:58:50 · 357 阅读 · 0 评论 -
【STM32移植机智云】超详细教程#2ESP8266移植机智云教程‘代码移植’
准备材料1.ESP8266模块外观:引脚图:2.单片机及杜邦线等本文以STM32f013c8t6开发平台为例。开始移植详细步骤ESP8266烧录机智云固件教程参见:烧录机智云固件详细教程登录机智云,在开发者中心新建项目。新建数据点如想控制LED亮灭。4.下载移植代码包。复制秘钥,因为下载需要填写。如下图生成代码包。下载代码包:下载后解压,将下图俩个复制到自己的工程。5.导入代码包到STM32工程。记得包含头文件位置。注意:路径地址因人而.原创 2021-05-11 17:54:44 · 11571 阅读 · 77 评论 -
【完美解决】ds1302外置时钟模块重复初始化时间问题(单片机掉电,模块电池供电)
芯片介绍:DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。模块实物图:淘宝购买的模块,物美价廉。一、问题描述DS1302时钟模块,通过单片机设置好时间后,由纽扣电池供电应当一直正常工作。但是单片机掉电再重新上电后,会导致模块重复初始化,使时间回到起点,与实际需求不符。单片机单纯上电直接初始化时间,有些不妥。二、解决方法方案一:1.先烧录正常初始化时间的代码。2.注释初始化时间的代码再原创 2021-02-02 13:42:43 · 10934 阅读 · 19 评论 -
MDK--KEIL超级实用插件安装,墙裂推荐
KEIL5安装实用插件,实现格式化代码、文件注释、函数注释等功能资料包下载配置完成使用效果插件包下载:资料包下载链接:或者私聊我2. 配置操作复制插件“tools”到自己的keil安装目录。打开keil5,如图添加插件,选择对应路径文件,输入对应Arguments。步骤图:配置截图:Arguments:"$E*.c" "$E*.h"Arguments:!EArguments:!E ~EArguments:!E ~E ^EArguments:!E ~E ^E原创 2020-10-29 01:32:00 · 11121 阅读 · 30 评论