STM32学习笔记
文章平均质量分 75
分享在学习stm32系列单片机时遇到的问题及解决方法
嵌入式@hxydj
这个作者很懒,什么都没留下…
展开
-
stm32单片机例程下载链接
在这篇文章中将自己上传的资源做一个下载链接的目录方便查找下载STM32单片机实现DMA+ADC+UART功能STM32F103单片机+ULN2003驱动直流电机STM32F103单片机使用TM1637芯片驱动4位数码管stm32f103c8t6+ESP8266 模块设置为Station模式向电脑发送数据stm32f103c8t6+ESP826 设置为AP模式STM32F103用串口空闲中断+DMA实现modbus通信示例STM32F103单片机用DMA+串口空闲中断接收不定.原创 2021-04-23 22:27:35 · 837 阅读 · 0 评论 -
Modbus协议学习方法
在刚开始接触modbus协议的时候,很容易被里面的各种功能码搞晕,同时在编写程序的时候也容易搞不清楚每一位数据代表的含义。如果在学习的过程中有实际的发送和接收数据的例子话,那么理解modbus协议就会更容易一些。下面我将自己借助软件学习的方法分享给大家原创 2023-06-28 18:16:14 · 1317 阅读 · 1 评论 -
如何将bootloader和APP程序一次性烧录到单片机中
首先将bootloader程序烧写到单片机中,然后通过串口将app程序写入到单片机内容,在平时学习和测试的时候这种方法没啥问题,但是如果产品需要量产,每次少些程序的时候都有通过这种方法的话,那效率就要低很多。这里添加刚才新合并的hex文件,将文件添加进来之后,在底下的信息框中就可以看到这个hex文件是由两部分构成的。这个地址分别是bootloader和app文件的地址。将bootloader的hex文件和app的hex文件合并成一个新的hex文件,接下来使用j-link的烧写软件进行烧写。原创 2023-06-11 11:05:45 · 2632 阅读 · 4 评论 -
使用Notepad++查看16进制文件遇到的大坑
按理说这个插件是直接从官方渠道安装的,没有什么问题。在调试程序的时候就发现,单片机接收到的数据和在这个notepa++里面看到的数据不一样,还以为是自己的串口受到了干扰,单片机和串口模块检查了好久都没发现啥问题,又在程序上排查了好久,还是没找到问题。最近在调试单片机的IAP升级功能,需要将bin文件直接通过串口发送给单片机然后升级程序,在调试代码的时候,为了方便观察发送的数据是否正确,就直接使用了Notaped++里面的16进制插件来查看bin文件,谁知道这个插件却给自己埋下了一个大坑。原创 2023-06-11 09:38:04 · 3323 阅读 · 7 评论 -
keil从非0x08000000地址调试STM32单片机程序方法
在使用stm32单片机的串口IAP升级功能时,需要调试bootloader程序和app程序,一般bootloader的程序都是从0x08000000地址开始运行的,使用keil软件可以直接进行仿真,但是如果调试app程序的话,由于它不是从0x08000000地址开始的,使用keil仿真的时候,仿真不了。为了可以直接使用keil仿真APP程序,在网上找了好多方法,不过好多方法都讲的比较凌乱,看起来也不方便。下面就将自己总结的2种方法分享出来。原创 2023-06-07 19:59:55 · 4143 阅读 · 8 评论 -
STM32F407单片机HAL库CAN2不能接收数据解决方法
下面就就是can的时钟,这里要注意一个就是使用can1的时候,开启can1的时钟就行,但是使用can2的时候,也必须开启can1的时钟。在can的控制器中,存储访问控制器是由can1控制的,当使用can2的时候,can2要访问存储访问控制器时,必须通过can1才能访问,所以使用can2的时候,can1为主机,can2为从机。当使用can2的时候,直接将值设置为14。的值就很关键了,这个值的含义是,从机滤波器的起始地址,那么当使用can2时,can2就是从机,那么这个值就是can2滤波器的起始地址,而上面。原创 2023-05-27 17:08:41 · 3003 阅读 · 2 评论 -
jlink-v8刷固件及解决keil报错 j-link is defective,j-link clone
今天在调试STM32F407的程序时,下载程序时突然keil识别不到jlink了,还以为是驱动的问题,重新装了好几次驱动,结果还是不行,于是就网上找各种办法,最后决定重新刷固件。网上的方法很多,好多都失败了。现在把我刷成功的过程分享给大家。原创 2023-05-26 20:59:34 · 2533 阅读 · 0 评论 -
STM32F407+LWIP+DP83848以太网驱动移植
最近有个项目上需要用到网络功能,于是开始移植网络相关代码。在移植的过程中感觉好难,网上找各种资料都没有和自己项目符合的,移植废了废了好的大劲。不过现在回头看看,其实移植很简单,主要是当时刚开始接触网络,各种新的知识和概念扑面而来,加上LWIP这个协议的相关资料,一下接触的太多,大脑已经混乱了。所以就感觉很难,当各种逻辑梳理清楚的时候,移植起来就很简单了。原创 2023-05-20 14:10:32 · 6112 阅读 · 4 评论 -
如何使用Understand软件查看STM32单片机HAL库函数调用关系
但是Understand软件在工程代码中却找不到这两个宏定义,所以就默认这两个宏定义没有定义,相关的代码就不会被编译。在使用STM32单片机的HAL库函数编程时,会发现好多中断函数里面都有各种回调函数,还有好多函数的调用深度比较深,在编写代码的时候,有时候想查看某个函数是如何被调用的,查看起来非常麻烦。通过这种手动增加宏定义的方法,就可在Understand软件中查看HAL库函数的调用关系了,通过图形化的界面帮助我们在写程序的时候更加高效。函数,而这个函数又调用了can.c文件里面的。原创 2023-05-17 21:56:58 · 1676 阅读 · 0 评论 -
stm32f407单片机上通过HAL库实现can总线数据的收发
最近在使用can总线,由于这个以前接触的比较少,所以调试代码的时候直接是下载的正点原子的例程,在这个基础上修改调试的。现在将调试中遇到的问题,总结一下,避免以后踩坑。目前写了一个查询方式的,一个中断方式的。原创 2023-05-17 20:11:23 · 3556 阅读 · 3 评论 -
TCP协议三次握手四次挥手详细分析
服务器收到客户端的SYN包之后,必须确认客户的SYN,也就是将客户端的上次发来的序号加1,上次客户端发来的序号是1213270320,加上1之后是1213270320=1,同时自己也发送一个SYN包,即SYN+ACK包,由于由于服务器是第一次给客户端发送数据,所以服务器也会随机生成一个序号6510,此时服务器进入SYN_RECV状态;客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK,第二次握手时服务器发来的序号为6510,所以本次向服务器确认时,需要将服务器的序号加1返回,也就是返回6510。原创 2023-05-10 22:38:37 · 782 阅读 · 0 评论 -
嵌入式代码查看分析利器---Understand
平时在开发嵌入式程序的时候大多数使用的都是keil软件,一般小的工程使用keil没感觉到有什么问题,但是当工程比较大的时候,比如移植了FreeRTOS系统或者LWIP网络系统时,代码全部编译一次就要花费很长世间,特别是开启了点击函数右键跳转的功能之后,速度更加慢。通过上面这个6种功能,可以对main函数和其他函数的调用关系进行各种方式的分析,让我们对这个工程代码能进一步的深入了解。如果想进一步了解这个函数的其他信息,可以在这个函数上单机鼠标右键,在属性中查看,这里就不再一一列举了。原创 2023-04-29 13:16:01 · 10350 阅读 · 21 评论 -
STM32F407软件仿真时不能进入main函数解决方法
最近在用keil软件仿真功能仿真STM32F407单片机时,发现进不到main函数位置处。下来点OK按钮,保存设置。这时候再使用软件仿真的时候,就可以直接进入到main函数中了。开始仿真的时候总是卡在Wait till HSE is ready 这块。网上找了好久解决方法,总算是搞定了。接下来在keil软件中点击魔术棒工具,切换到Debug选项设置界面。然后使用记事本打开该文件,在里面输入下面的内容。然后选择keil安装目录下的这个。接下来打开keil的安装目录。复制到keil的安装目录中。原创 2023-03-07 16:52:10 · 2680 阅读 · 8 评论 -
STM32系列单片机标准库移植FreeRTOS V10.4.6详解
最近看正点原子新录制了手把手教你学FreeRTOS的视频教程,看了一下教程发现视频里面讲的是使用HAL移植 FreeRTOS V10.4.6 版本,以前的标准库移植的是FreeRTOS V9.0 版本。而自己平时写代码使用的都是标准库,就想着能不能把FreeRTOS V10.4.6 版移植到标准库中去。为了移植简单,直接下载正点原子的代码在上面修改。原创 2023-01-07 15:48:46 · 4885 阅读 · 4 评论 -
由一个按键程序引发的思考(下)
上文[由一个按键程序引发的思考(中)]讨论了如何实现按键单次按下后能立即执行按键动作,同时又能滤除掉按下时间非常短的无效按键。但是在实际项目中,一个按键往往会具有多种功能,可以通过单击、双击、长按等方式切换不同的功能。 那对于单击、双击、长按这些功能要如何有效区分呢?下面就从按键的波形和判断逻辑来讨论这三种情况如何区分?原创 2022-11-05 11:55:29 · 985 阅读 · 3 评论 -
由一个按键程序引发的思考(中)
按键的波形无非就是高、低、高三种状态。要判断按键从根本上来说就是对这三种状态的检测和分析。由于按下未按下时和弹起时都是高电平,那么直接通过电平判断不能有效区分这两个高电平的状态,就不能直接同电平来判断。观察按键波形可以发现,按键按下的一瞬间电平出现了下降沿,按键弹起的一瞬间出现了上升沿。这样通过上升沿和下降沿就能区分出按键按下或者弹起。原创 2022-10-30 10:24:09 · 2470 阅读 · 9 评论 -
由一个按键程序引发的思考(上)
说起按键程序,只要会单片机的肯定都很熟悉。一般开始学习单片机的时候,入门程序基本都是LED灯和按键。那么这个按键程序有什么特别的吗,还需要专门去思考吗?如果我刚开始学单片机的时候也会这么想,但是随着项目的积累,经验的增加,越来越觉得`复杂的事情简单做,简单的事情复杂做`,这句话很有哲理,越是看起来简单的事情,真正做好却很不容易。下面就抽丝剥茧的来慢慢分析下这个按键程序有什么特别之处。原创 2022-10-29 19:21:35 · 3561 阅读 · 6 评论 -
IAR自定义文件注释模板和函数注释模板
在IAR编辑器中自定义函数注释模板和文件说明模板,在写代码的时候可以一键插入自己定义的代码段或者注释。原创 2022-10-28 17:21:47 · 1928 阅读 · 1 评论 -
从代码层面分析STM32 标准库和HAL库的差异
相当于每个设置都是独立的函数。HAL库将一段代码通过宏定义的方式封装成了一个函数,每个端口的时钟都单独的定义了一个名称,标准库是一个独立的函数,通过参数传递的方式来设置每个端口的时钟。这两个版本的函数本质上操作的还是寄存器,不过HAL库操作的只是BSRR寄存器,而标准库端口置1的时候操作的是BSRR寄存器,端口清0的时候操作的是BRR寄存器。标准库设置端口模式的时候,是在if语句中判断之后直接设置的,而HAL端口模式设置时,却使用了switch语句去设置,说明在HAL库中,端口模式和标准库中发生了改变。原创 2022-09-08 20:24:41 · 17859 阅读 · 12 评论 -
在嵌入式开发中如何提高自己的代码水平
但是随着项目的增加和需求的各种变化,就会发现,第一种代码修改起来比较麻烦,比如LED口发生了变化,那么头文件和和初始化函数都需要修改,变动一次要修改好几个地方,修改的时候容易漏掉有些地方,导致调试起来各种问题不断,增加了调试的难度。如果感觉自己的技术比较好了,那么就可以去看库函数的源码,或者操作系统的源码,看看官方的源码是如何将不同类型不同型号的单片机抽象为统一的函数。如果哪天你看到别人的代码之后,一眼就能看出代码的优缺点时,那么就说明你的水平已经很高了,已经突破了自己的瓶颈了。这是 led.h 的代码。原创 2022-09-07 19:37:43 · 35776 阅读 · 42 评论 -
为什么要在单片机程序中使用结构体和指针
在刚开始学习单片机写程序的时候,大多数人都比较喜欢使用全局变量。因为这样写程序写起来比较简单,也容易理解。但是看官方例程的时候,大多数都喜欢使用结构体和指针。感觉指针和结构体看起来麻烦,写起来更麻烦,往往都是一长串字母。但是为什么官方都爱这样用呢?这样用的好处是什么,自己写程序怎么才能写成这种方式。下面通过一个实际的工程例子来说明,如何一步一步将全局变量改为指针和结构体的方式。原创 2022-09-05 14:18:15 · 4722 阅读 · 13 评论 -
STM8单片机通过PWM触发ADC同步采样
在做数字开关电源开发过程中使用最多的就是PWM功能和ADC采样功能。ADC采样时采样的时间点很重要,必须在PWM输出高电平的时候取采样,这样采样出来的数据才是最准确的。在STM8单片机中,可以通过定时器的TRG信号去触发ADC采样,这样就可以将PWM波形的输出和ADC采样结合在一起了。 下面就演示一下,如何在输出PWM波的过程中触发ADC采样。 首先看ADC的初始化代码。#include "adc.h"#include "main.h"#include "led.h"u16 DATA原创 2021-12-13 17:30:03 · 6754 阅读 · 3 评论 -
STM8单片机ADC采样功能通过定时器触发
在使用STM8单片机的ADC功能时,读取ADC数据时一般有两种方式,一种是通常不断地读取采样标志位,来判断ADC采样是否结束,一种是通过中断的方式来通知系统采样是否结束。 有时候采样ADC数据的时候,需要按照一定的时间间隔,定点的去采样数据。一般使用的方式就是通过定时器定时,然后在定时中断函数中再去读取ADC采样的数据。但是这种方式采样的时间是不固定的,比如进入定时器中断后,ADC采样刚结束,就可以直接使用当前采样到的数据。但是如果运气不好的话,进入定时中断后,ADC采样刚开始,那么此时就需要等到A原创 2021-12-13 15:50:48 · 5785 阅读 · 4 评论 -
单片机快速将库函数版代码移植为寄存器代码方法
现在单片机开发越来越多用的是库函数版本的,寄存器版本使用越来越少了。但是在有些项目中使用库函数会导致程序运行速度比较慢,没有直接操作寄存器运行起来速度快。所以在对时间要求比较严格的项目中,还是需要使用寄存器来开发。如果不能够找到寄存器相关示例代码的时候,开发起来还是比较困难的。今天就来总结一个快速将库函数移植为寄存器的方法,这个方式为通用方法,在任何单片机上都可以使用。 现在就用一个STM8单片机库函数的工程来举例。 这个代码的主要功能就是使用定时器1的捕获功能来计算输入波形的频率。对于定时原创 2021-12-13 10:29:43 · 1548 阅读 · 4 评论 -
STM8单片机串口同时识别自定义协议和Modbus协议
在单片机开发中,串口是最常用的和外界交换数据的渠道,要使用串口,那必不可少的就是通信协议,通信协议就是单片机和外界通信的语言,要想正常和其他设备正常交流,首先语言必须相通。 在实际开发过程中由于各种原因,导致很多时候单片机和外界其他设备协议不兼容,在使用的时候就比较麻烦。比如单片机要和两个设备通信,但是这两个设备的通信协议的不一样,在使用时单片机就必须使用两个串口分别和两个设备通信。如果这两个设备同时使用时还不感觉到资源浪费,如果每次只接一个设备,那么另一个串口也不能作为其他功能使用,还得留着备用。原创 2021-12-03 21:16:58 · 6161 阅读 · 6 评论 -
串口示波器---伏特加 彻底的爱了
最近在调试代码的时候发现了一款串口示波器软件,功能相当强大,而且上手起来非常容易。目前是我自己使用过的多款串口显示软件里功能最强大的,而且是免费的。 软件名字叫 VOFA+,中文名称叫伏特加。官网地址:https://www.vofa.plus/ ,官网界面如下: 点立即下载按钮进入到下载界面 支持在多个系统上运行,其中Windows版本还可以下载免安装版,也就是下载的文件夹解压后就可以直接运行。功能和安装版没有任何区别。这里下载的是免安装版。解压后文件夹如下: 双击vofa+.原创 2021-11-23 22:11:54 · 12581 阅读 · 12 评论 -
STM32单片机一个定时器输出不同频率PWM波
在使用STM32单片机输出PWM波形的时候,通常可以直接使用定时器提供的PWM模式。可以通过自动重装载寄存器(TIMx_ARR)来设置定时器的输出频率,然后通过捕获/ 比较寄存器 1(TIMx_CCRx)来设置占空比。一个定时器只有一个自动重装载寄存器(TIMx_ARR),但是有4个通道的捕获/ 比较寄存器 1(TIMx_CCR1、TIMx_CCR2、TIMx_CCR3、TIMx_CCR4)。所以使用一个定时器输出PWM波形的时候,频率时统一调整的,4个通道的频率时相同的,但是占空比每个通道可以独立设置原创 2021-10-27 16:15:32 · 14136 阅读 · 40 评论 -
STM32F103串口1 printf函数的实现
在单片机中使用最多的通信接口基本就是串口了,说起串口就不得不提串口中最常用的一个函数就是打印函数printf()函数,在上位机上中这个函数直接从库函数中调用就可以了,那么在单片机中这个函数要怎么使用呢?能不能将这个函数和串口1对应起来,当然是有方法的。 下面就通过代码来演示一下如何在串口1上使用printf()函数的功能。void uart_init(u32 bound){ //GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; U原创 2021-10-20 11:43:27 · 2891 阅读 · 10 评论 -
STM32F103自定义的printf函数的实现
在单片机中使用最多的通信接口基本就是串口了,说起串口就不得不提串口中最常用的一个函数就是打印函数printf()函数,通常使用这个函数都是直接调用库函数来实现的,在单片机中如何要使用printf()函数一般都是在串口中进行重映射。如要在串口1中使用printf()函数,可以使用下面的代码进行重映射。//加入以下代码,支持printf函数,而不需要选择use MicroLIB#if 1#pragma import(__use_no_semihosting)//标准库需要的支持函数struct _原创 2021-10-20 11:41:51 · 2762 阅读 · 0 评论 -
STM32F103基本定时器使用
STM32F103单片机中定时器分为3种,高级定时器、通用定时器、基本定时器。 基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。它们可以作为通用定时器提供时间基准,特别地可以为数模转换器(DAC)提供时钟。实际上,它们在芯片内部直接连接到DAC并通过触发输出直接驱动DAC。这2个定时器是互相独立的,不共享任何资源。TIM6和TIM7定时器的主要功能包括:16位自动重装载累加计数器16位可编程(可实时修改)预分频器,用于对输入的时钟按系数为1~65536原创 2021-10-19 13:16:10 · 2341 阅读 · 0 评论 -
STM32F103通用定时器使用
STM32F103单片机中定时器分为3种,高级定时器、通用定时器、基本定时器。 通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)。使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作。通用TIMx (TIM2、TIM3、TIM4和TIM5)定时器功能包括:16位向上、向下、向原创 2021-10-19 13:15:04 · 2875 阅读 · 0 评论 -
STM32F103高级定时器使用
STM32F103单片机中定时器分为3种,高级定时器、通用定时器、基本定时器。 高级控制定时器(TIM1和TIM8)由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动。它适合多种用途,包含测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较、PWM、嵌入死区时间的互补PWM等)。使用定时器预分频器和RCC时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫秒的调节。高级控制定时器(TIM1和TIM8)和通用定时器(TIMx)是完全独立的,它们不共享任何资源。它们可以同原创 2021-10-19 13:13:50 · 3820 阅读 · 2 评论 -
STM32F103单片机RTC实时时钟的使用
实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒后,RTC的设置和时间维持不变。 系统复位后,对后备寄存器和RTC的访问被禁止,这是为了防止对后备区域(BKP)的意外写操作。执行以下操作将使能对后备寄存器和RTC的访问:设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备接口原创 2021-10-15 09:26:57 · 3465 阅读 · 0 评论 -
STM32F103单片机读取芯片自身ID
每一个STM32单片机出厂的时候都有全球唯一的ID,当在数据安全性比较高的地方,需要对每一个接入系统的芯片进行身份验证,那么这个芯片自身的ID号就可以作为它的身份信息。产品唯一的身份标识非常适合:用来作为序列号(例如USB字符序列号或者其他的终端应用)用来作为密码,在编写闪存时,将此唯一标识与软件加解密算法结合使用,提高代码在闪存存储器内的安全性。用来激活带安全机制的自举过程 96位的产品唯一身份标识所提供的参考号码对任意一个STM32微控制器,在任何情况下都是唯一的。用户在何种情况下,原创 2021-10-15 09:25:55 · 8236 阅读 · 10 评论 -
STM32F103单片机PWM单脉冲输出模式
通常输出PWM波形的时候是一直输出的。但是在电机控制中往往只需要输出一定个数的脉冲,不需要一直输出,那么这就需要每次输出PWM时,输出的脉冲个数可控。要实现这个功能,一般有三种方法。 方法一:void TIM1_PWM_Init(u16 arr, u16 psc){ GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseInitTypeDef TIM_T原创 2021-10-14 16:32:02 · 5987 阅读 · 9 评论 -
STM32F103单片机PWM功能实现
PWM模式也叫脉冲宽度调制模式,它可以产生一个频率和占空比可调的方波。由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。在硬件电路中,PWM波产生通常是由一个三角波和参考值送入比较器中,然后比较器输出的就是PWM波。V1是三角波发生器,幅度为5V,频率为1K,V2是直流源,电压为3V,将这两个波形送入到比较器中,然后比较器输出的就是PWM波。输出波形如下:当V1的电压值大于V2时,比较器输出高电平。当V1电压值小于V2时,比较器输出的就是低电平。改变V2的值,就可以改原创 2021-10-14 16:30:21 · 3525 阅读 · 0 评论 -
如何通过map文件优化代码
在平时写代码的时候,特别是嵌入式相关的代码时,能想到的优化方法一般就是通过设置编译器的优化等级。或者是在定义变量的时候考虑变量的使用范围,然后根据数据范围选择比较适合的数据类型。但是这种优化方式操作起来都比较模糊,没有一个直观的感受。为了让代码的优化有个直观的感受,今天就借助map文件来优化代码。 首先看一段简单的示例。 这是一段很简单的测试代码,就是在主程序里面让LED灯闪烁,同时给x变量每次加0.1。这个代码还需要优化吗?别着急,先打开工程中生成的map文件看看。 map文件在工程目原创 2021-10-13 21:58:37 · 616 阅读 · 2 评论 -
IAR软件中查看代码大小
在使用IAR软件时,各种调试功能使用起来都挺好的,唯一感觉有缺陷的就是不能查看代码大小。不像keil那样代码编译后可以直接看到大小。那么在IAR中有没有办法可以查看到代码的大小呢?当然是可以的,最简单的方法就是通过map文件查看。 什么是map文件呢?简单的说map文件就是代码在编译后,关于代码的各种信息描述的文本文件。比如哪些变量在哪个地址空间存储?每个函数的入口地址是啥?每个变量都占用了多大空间等,在map文件中都会有详细的描述。 现在通过一个简单的例程来演示如何查看map文件。 这是原创 2021-10-13 20:02:14 · 3063 阅读 · 0 评论 -
STM32F103看门狗功能实现
STM32F10xxx内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备( 独立看门狗 和 窗口看门狗 )可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。 独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。窗口看门狗由从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。 IWDG最适合应用于那些需要看门狗作为一个原创 2021-10-13 19:48:46 · 3068 阅读 · 0 评论 -
STM32F103定时器输入捕获功能
STM32F103单片机的定时器不仅能输出PWM波,而且还能捕获输入的PWM波。可以通过定时器的捕获功能测量输入PWM波的周期和占空比。其中定时器的输入捕获功能如下: 在输入捕获模式下,当检测到ICx信号上相应的边沿后,计数器的当前值被锁存到捕获/比较寄存器(TIMx_CCRx)中。当发生捕获事件时,相应的CCxIF标志(TIMx_SR寄存器)被置1,如果开放了中断或者DMA操作,则将产生中断或者DMA请求。如果发生捕获事件时CCxIF标志已经为高,那么重复捕获标志CCxOF(TIMx_SR寄存器原创 2021-10-13 19:47:37 · 3449 阅读 · 1 评论