- 博客(32)
- 收藏
- 关注
原创 STM32复位立即进入定时器中断解决办法
发现问题: 使用定时器中断,一复位就进入中断。原因分析:1、怎么识别到产生了定时器中断? 中断标志位,当标志位置1时就会产生中断。2、什么时候中断标志位置1? 以向上计数为例:当计数值计到重装载值再回到0时,此时中断标志位置1。3、复位进入中断? 当复位后重新开始定时器初始化,从0开始计数,当计数值为0时就已经将标志位置1,产生了一个中断。解决方法: 在初始化定时器后将标志位清零即可。...
2021-09-29 21:53:03
1396
1
原创 通过时序图编程操作DHT11读取温湿度
目录一、DHT11模块二、时序图分析总的时序:开始信号与响应信号:读取数据:停止信号:三、程序部分一、DHT11模块Dht11温湿度检测模块,模块引出引脚有VCC、GND和DATA,只有一根DATA线用于传输数据。数据格式内容手册中有介绍:二、时序图分析总的时序:总的流程:主机发送开始信号->主机读取响应信号->开始接收数据->主机发送停止信号。空闲状态为高电平。开始信号与响应信号:...
2021-09-27 13:40:18
9325
1
原创 ESP-01S+AT指令基于MQTT协议连接阿里云步骤
前提是已经在阿里云创建好项目产品,完成添加设备及相关设置。一、报文制作报文组成:固定报文+可变报文+负载报文。固定报文:控制类型+剩余长度(所有报文都有)1、连接报文报文内容:可变报文:协议名+协议级别+连接标志+保持连接时间;负载报文:客户端ID+用户名+密码(信息前分别用两字节表示长度)。固定报文和可变报文在MQTT手册中查看,基本可以固定不变。因此重点在负载报文。在阿里云官网中有对客户端ID+用户名+密码的说明...
2021-09-11 21:45:27
8002
6
原创 【STM32】基于库函数/寄存器的简单串口通信
目录一、STM32串口二、可配置的中断三、使用的相关寄存器1、状态寄存器(USART_SR)2、数据寄存器(USART_DR)3、控制寄存器1(USART_CR1)四、相关库函数1、初始化函数2、使能函数3、发送数据函数4、接收数据函数5、使能中断函数五、程序设计一、STM32串口串口通信是一种全双工的异步串行通信方式,通常用于设备与设备、设备和电脑间的通信。由TX和RX两根线传输数据:TX:发送数据RX:接收数据两...
2021-09-02 22:06:28
3901
1
原创 【STM32/FreeRTOS】精准延时的实现
目录前言SysTick定时器寄存器裸机编程下实现FreeRTOS中实现前言 在使用通讯协议来驱动外设的时候需要遵循严格的时序逻辑,往往用到微秒(us)级别的延时,在裸机编程中可以使用SysTick定时器来实现;在FreeRTOS中,SysTick定时器则是用来作为FreeRTOS系统时钟的,但也可以用来做延时使用,只是与裸机编程下方式不同。SysTick定时器寄存器 要使用SysTick定时器,首先要了解一下其相关寄存器。裸机编程下...
2021-08-25 19:23:10
11321
7
原创 【FreeRTOS】任务调度与任务切换
目录一、任务调度二、任务切换三、关于PendSV一、任务调度 在创建好任务函数后,需要调用函数vTaskStartScheduler()开启任务调度器,创建的任务在调度器的调度下执行。 开启任务调度器函数为:vTaskStartScheduler(); //开启任务调度该任务会创建一个函数名为prvIdleTask()的空闲任务,以及完成相关硬件初始化,如SysTick定时器、FPU(浮点运算)单...
2021-08-21 19:07:24
1124
原创 【FreeRTOS】中断与临界段
目录一、Cortex-M中断1、中断简介2、中断优先级3、中断屏蔽寄存器(1)PRIMASK和FAULTMASK寄存器(2)BASEPRI寄存器(重点)二、FreeRTOS的中断1、相关宏配置2、FreeRTOS开关中断三、临界段代码1、进入临界段函数2、退出临界段3、用法一、Cortex-M中断1、中断简介Cortex-M内核MCU提供了一个用于中断管理的嵌套向量中断控制器(NVIC),M3、M4的NVIC最多支持240个中断...
2021-08-20 20:25:18
1242
原创 【FreeRTOS】软件定时器
目录一、软件定时器简介二、单次定时器与周期定时器三、定时器相关的宏设置四、常用API函数1、创建定时器(1)动态方法(1)静态方法2、开启定时器(1)任务级(2)中断级3、复位定时器(1)任务级(2)中断级4、停止定时器(1)任务级(2)中断级五、定时器使用案例一、软件定时器简介定时器是MCU的外设,硬件定时器不仅仅能用来定时,还能用作PWM输出、输入捕获等功能,其功能强大。但是硬件定时器是有限个数的,不同型...
2021-08-19 22:36:27
670
1
原创 【FreeRTOS】事件标志与任务通知
目录一、事件标志组1、创建事件标志组(1)动态方法(2)静态方法2、设置标志位(1)清零操作(2)置位操作3、获取事件标志组值(1)任务级(2)中断级4、等待指定的事件位二、任务通知1、发送通知函数(1)函数xTaskNotify()(2)函数xTaskNotifyFromISR()(3)函数xTaskNotifyGive()(4)函数vTaskNotifyGiveFromISR()(5)函数xTaskNotify...
2021-08-15 23:28:05
1108
1
原创 【FreeRTOS】信号量
目录一、信号量二、二值信号量1、创建二值信号量(1)动态创建(2)静态创建2、释放信号量(1)任务级(2)中断级2、获取信号量(1)任务级(2)中断级三、计数型信号量1、创建计数型信号量(1)动态方法(2)静态方法2、释放和获取计数信号量四、互斥信号量1、创建互斥信号量(1)动态方法(2)静态方法2、释放和获取互斥信号量五、递归互斥信号量1、创建递归互斥信号量(1)动态方法(2)静态方法2、释放递归互
2021-08-14 23:10:35
1128
原创 【FreeRTOS】消息队列及相关API函数
目录一、消息队列简介消息队列的运作过程:二、消息队列常用相关函数1、队列创建(1)动态创建xQueueCreate()(2)静态创建xQueueCreateStatic()(3)函数xQueueGenericCreate()2、队列删除函数3、入队函数(1)任务级入队函数(2)中断级入队函数4、出队函数(1)任务级(2)中断级一、消息队列简介消息队列是FreeRTOS中一种常用于任务间通信的数据结构,可以在任务与任务间、中断...
2021-08-13 15:35:34
858
原创 【STM32/FreeRTOS】SysTick定时器及FreeRTOS系统节拍
目录一、SysTick定时器1、SysTick寄存器介绍(1)控制及状态寄存器(2)重装载数值寄存器(3)当前数值寄存器2、SysTick寄存器配置函数二、FreeRTOS中的SysTick定时器1、SysTick配置函数及分析2、SysTick中断函数一、SysTick定时器SysTick系统定时器是属于内核中的一个外设,内嵌在NVIC中。该定时器是一个24位的向下递减的计数器。在裸机编程中常用做延时函数,而在FreeRTOS中则用来给系统提...
2021-08-10 21:21:29
8217
2
原创 【FreeRTOS】任务及相关常用API函数
一、任务状态在FreeRTOS系统中,每个任务都在多种任务状态中来回切换。1、就绪态处于就绪态的任务以及具备执行条件,等待任务调度器调度即可执行。新创建的任务会初始化为就绪态。2、运行态任务正在运行,正在运行的任务永远是所有就绪态任务中优先级最高的。同一时刻只有一个任务处于运行态。3、阻塞态如果一个任务正在等待某个信号或外部事件那就说它处于阻塞态,阻塞态任务不在就绪列表中。例如调用了延迟函数vTaskDela...
2021-08-08 21:10:45
844
原创 【FreeRTOS】多任务系统基础知识及特点
目录单片机各编程系统特点1、裸机系统(1)轮询系统(2)前后台系统2、多任务系统单片机各编程系统特点单片机编程中有裸机系统与多任务系统。裸机系统又分为轮询系统和前后台系统,FreeRTOS就是一种多任务系统(RTOS为实时操作系统,Free就是免费的)。1、裸机系统(1)轮询系统轮询系统就是依次顺序执行任务程序,将任务程序放在一个大循环里面无限循环。任务没有优先级,需执行的程序不能快速响应,没有实时性。(2)前后台系...
2021-08-08 13:53:48
957
原创 【STM32】引脚配置—F1与F4系列
一、stm32的GPIO模式简介Stm32的GPIO引脚共有输入、输出和复用三种模式,每种模式又有多种使用形式:1、输入模式a.输入上拉b.输入下拉c.输入浮空d.模拟输入2、输出模式a.开漏输出b.推挽输出3、复用模式a.推挽式复用b.开漏式复用各形式说明:上拉:GPIO通过上拉电阻接到VCC,即高电平;下拉:GPI...
2021-08-06 20:16:05
7945
原创 【C语言】单链表的顺序插入及节点删除
一、顺序插入1、步骤:(1)比较大小找到插入的位置;(2)将插入点上一节点的指针指向新节点;(3)将新节点的指针指向插入点的后一节点。2、图示:new为新节点地址;last为上一节点地址;temp为后一节点地址;3、具体实现指针temp依次指向链表中的每个节点,并将节点的值与输入的值比较,如果不满足,temp则指向下一个。last保存上一次temp的值(即上一节点地址)。如图,当temp指向4这个节点时满足,则新节点位置为last和tem...
2021-08-05 15:58:07
2467
原创 【C语言】单链表及插入(头插法、尾插法)
一、什么是单链表链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 单链表是链表的一种,每个节点只有一个指针指向下一个节点,最后的节点的指针指向空(NULL)。从头指针开始通过指针依次链接形成单链表。(头指针没有数据域)二、单链表的插入每个节点都...
2021-07-30 19:37:15
14962
1
原创 【C语言】typedef的使用
一、什么是typedeftypedef是在C和C++编程语言中的一个关键字。作用是为现有的数据类型(int、float、char……)创建一个新的名字,目的是为了使代码方便阅读和理解。二、typedef用法1、对于数据类型使用例如:typedef int NEW_INT;以上就是给int起了一个新的名字NEW_INT,注意要加分号。当要定义int类型数据时就可以:NEW_INT num;此时NEW_INT num 等同于 int num。2、对于该数据类...
2021-07-22 16:46:02
50089
11
原创 【C语言】联合与枚举
一、联合1、联合的定义与声明联合也是一种新的数据类型,是一种特殊形式的变量。联合体也称共用体,其关键字为union。声明与定义与结构相似,如:Union 联合名{ 数据类型 成员名; 数据类型 成员名; ……}联合变量名;例如:union a_bc{ int I; char mm;};union a_bc num;其中联合名可以省略。例如:union{ ...
2021-07-20 15:00:20
244
原创 【C语言】结构体
一、结构体声明及定义结构是由基本数据类型构成的、并用一个标识符来命名的各种变量的组合。在数组中只能存放同一类型的数据,而在结构中可以存放不同类型的数据。结构声明需要用到关键字struct。1、结构体声明格式:struct 结构体名称{结构体成员1;结构体成员2; ……};形如:struct Num{ int a; char str[10]; float b;};2、结构体变...
2021-07-19 21:20:55
571
原创 【C语言】宏定义
一、宏定义宏定义通俗就是一种替换操作,以#define在文件开头定义;如:#define NUM 1234#define STR “abcd”通过此定义后,在本文件中NUM会替换掉1234;STR替换掉字符串abcd;注意宏定义后不加分号。宏定义允许嵌套,一个宏定义里可以有其他宏定义,如:#define NUM_N NUM+1234其中NUM为上文定义的NUM。二、宏定义作用域宏定义的作用域从 #define 定义处开始到 #undef 处结束;如:...
2021-07-19 15:41:23
10082
原创 【C语言】内存布局与管理
一、变量在内存中布局规律二、内存布局根据内存地址从低到高分别为:# 代码段# 数据段# BSS段# 堆# 栈1、代码段通常指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。2、数据段数据段通常用来存放已经初始化的全局变量和局部静态变量。3、BSS段BSS段通常是指用来存放程序中未初始化的全局变量的一块存储区域。这.
2021-07-18 18:39:21
280
原创 【C语言】变量及其相关知识
局部变量与全局变量局部变量在函数内定义的变量就是局部变量,局部变量只能由该函数进行访问和修改,其他函数不能对其进行访问及修改。全局变量在函数外定义的变量叫外部变量,也叫全局变量,全局变量可以被本程序中所有函数所共同使用。定义全局变量如果不对其初始化则会自动初始化为0。当定义的全局变量与局部变量重名时,在函数内会屏蔽全局变量,只使用局部变量。大量使用全局变量会是程序占用过多内存,全局变量从被定义开始直到程序退出才被释放。还会降低程序的可读性。作用域当变量被定义在程序
2021-07-18 10:57:45
847
原创 【C语言】指针(三) — 指针函数与函数指针
指针函数指针函数顾名思义是一个函数,函数返回值是一个指针或地址。声明格式:类型说明符 *函数名(参数)例如:int*pa(int,int);例1:定义一个指针函数用于返回一个字符串,字符串就是指向字符的指针。主函数中调用该函数获取指针然后打印其内容:结果正常打印输出。注意不要返回局部变量的指针:例2:将指针函数修改一下,其他不变。编译时出现警告:函数返回的地址是局部变量。运行时也没有输出。这是因为局部变量只在...
2021-07-17 17:14:17
375
原创 【C语言】指针(二) — 指针与数组
指针与数组定义一个指针p指向数组a;如下:int a[5];int *p;p=a;这是我们将指针指向数组的步骤,这里不需要&取地址是因为在C语言中,数组名就是数组的第0号元素的地址,我们不妨验证一下:分别打印数组a、a[0] 和p的地址:运行后看到数组a、a[0] 和p的地址是一样的。所以p=a和p=a[0]是等价的。根据地址运算规则,a+1为a[1]的地址,a+i就为a[i]的地址。以下为用指针给出数组元素的地址和内容的几种表示形式:(1)p+i
2021-07-16 19:10:25
2425
原创 【C语言】指针(一) — 指针的定义
什么是指针以我的理解,指针就是存储地址的变量。在C语言中,对于变量的访问形式之一就是先求出变量的地址,然后再通过地址对它进行访问,这就是指针及指针变量。指针变量的定义定义例如:int *p1;char *p2;以上就是定义的p1和p2指针。指针变量定义时前面要加 *,定义指针时的int和char数据类型是指该指针指向的地址所存放数据的数据类型。指针变量的赋值指针变量保存的是一个地址,因此赋给指针变量的也应该是一个地址值。例如:p1 = &a;以
2021-07-15 20:28:54
8186
原创 vim基本指令(二)
motion——表示操作范围的指令 该指令配合其他操作指令即可完成对特定范围文本的相应操作。(因为用到所以放在这里)按键 说明 0 将光标定位到行首的位置 ^ 同上 $ 将光标定位到行尾的位置 b 将光标定位到光标所在单词的起始处 e 将光标定位到光标所在单词的结尾处 w 将光标定位到下一个单词的起始处 gg 将光标定位到文件开头 G 将光标定位到文件末尾 粘贴命令在vim下使用删除命令...
2021-07-14 15:21:01
382
原创 vim基本指令(一)
Vi与vimVi是linux系统下自带的文本编辑器,vim则是vi的升级版本,代码补完、编译及错误跳转等方便编程的功能特别丰富。Vim的安装在终端中输入 sudo apt-get install vim ,输入密码即可安装。因为我之前安装过,所以显示的不一样。Vim的使用进入与退出vim:进入:vi 文件名 (若该文件未被创建则自动创建);退出:在普通模式下输入“ : ”然后输入保存退出或退出指令; w:保存; ...
2021-07-13 20:05:19
9607
原创 【C语言】常见字符串处理函数
C语言编程中常用到字符串处理函数1、Strlen :获取字符串长度函数 【用法】strlen(str)【说明】返回str的长度,不包括结束符'\0'。 与sizeof区别:Strlen不包含结束符’\0’; sizeof包含。2、strcpy与strncpy 拷贝字符串函数strcpy 函数用于拷贝字符串,包含最后的结束符 '\0'。【用法】strcpy(str1,str2);【说明】将str2拷贝到str1;...
2021-07-05 21:45:17
649
原创 C语言的应用之单片机学习
通过学习了C语言之后,有了一定的基础。这时我们就可以用C语言来玩点好玩的东西了,前面说过C语言是与硬件打交道的语言。因此我们将c语言用到硬件上面,这种硬件可以是单片机。所谓单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。单片...
2021-06-26 20:32:20
316
原创 【C语言】数据表现形式及基本数据类型
数据的表现形式常量:在程序运行中值不变的量;整型常量:如100,0,-123等都是整型常量; 实型常量:①十进制小数形式,由数字和小数点组成。如123.456。②指数形式,如12.34e3(代表12.34×103),e或E代表以10为底的指数。字符常量①普通字符:用单撇号括起来的一个字符,如:’a’, ’Z’, ’3’, ’?’, ’#’。②转义字符:以字符“\”开头的字符序列。转义字符及其作用对应表格: 转义字符 字符值 输出
2021-06-18 18:09:37
3468
原创 编写第一个C程序Hello World!
C程序的执行想要编写一个C程序,先要了解程序的执行过程。对于任何C程序而言,程序都是从主函数main()开始执行的,而不论main函数在整个程序中的位置如何,main函数可以放在程序最前头,也可以放在程序最后,或在一些函数之前、另一些函数之后都没有影响,所以每个C程序都要有且只有一个main函数。编写第一个c程序绝大多数人的第一个程序都是”Hello World!”开始的,接下来在Windows下的VC++6.0创建编写第一个C程序,感受一下C语言的奥妙。创建工程点击左上角file-&g...
2021-06-18 12:39:47
654
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人