IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32实现呼吸灯实验《持续更新中。。。。》 -> 正文阅读

[嵌入式]STM32实现呼吸灯实验《持续更新中。。。。》

一、开源程序代码阅读

1、SysTick定时器简介:

(1)介绍:

SYSTick定时器也叫SYSTick滴答定时器,它是Cortex-M3内核的一个外设,被嵌入在NVIC中。它是一个24位向下递减的定时器,每计数一次所需时间为1/SYSTICK(SYSTICK是系统定时器时钟,它可以直接取自系统时钟,还可以通过系统时钟8分频后获取)。当定时器计数到0时,将从LOAD寄存器中自动重装定时器初值,重新向下递减计数,如此循环往复。如果开启SysTick中断的话,当定时器计数到0,将产生一个中断信号。因此只要知道计数的次数就可以准确得到它的延时时间。

(2)定时器寄存器:

CTRL寄存器

CTRL是SYSTick定时器的控制及状态寄存器。其相应功能如下:

?countflag:计数

clksource:时钟源。0表示分频后,1表示内部系统时钟

tickint:中断时开启

enable:使能位

LOAD寄存器

LOAD是SYSTick定时器的重装载数值寄存器。其相应功能如下:

VAL寄存器

VAL是SYSTick定时器的当前数值寄存器。其相应功能如下:

?

?current:可用于获取寄存器计数状态。

CALIB寄存器

CALIB是SYSTick定时器的校准数值寄存器。其相应功能如下:

(3)SYSTick定时器配置步骤:

分为四步:

(1)设置时钟源;

(2)设置重装初始值(如果要用中断的话,将中断使能打开);

(3)清零当前计数器的值(防止之前用过定时器的值未被清除);

(4)打开定时器。(使能位)

2、SysTick系统定时器编程:

SysTick_Init(72)中72表示72MHz系统时钟。

采用系统函数8分频。

fac_us:表示us延时倍乘数;

fac_ms:表示ms延时倍乘数。?

注意:delay_ms(nms)最多延时1864ms(1.864s),如需更长时间需要多次使用。delay_us同理。

2、中断系统

(1)中断介绍:

CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂时中断正在运行的程序,转去执行一段特殊的服务程序(中断服务子程序或中断处理程序),以处理该事件,该事件处理完后又返回被中断的程序继续执行,这一过程称为中断。引发中断的称为中断源。

?(2)NVIC介绍:

NVIC英文全称是Nested Vectored Interrupt Controller,中文意思就是嵌套向量中断控制器,它属于M3内核的一个外设,控制着芯片的中断相关功能。由于ARMNVIC预留了非常多的功能,但对于使用M3内核设计芯片的公司可能就不需要这么多功能,于是就需要在NVIC上裁剪。ST公司的STM32F103芯片内部中断数量就是NVIC裁剪后的结果。

中断控制相关寄存器在固件库core_cm3.h文件NVIC结构体内。可打开任意库函数工程即可查看到。

(3)中断优先级:

STM32F103芯片支持60个可屏蔽中断通道,每个中断通道都具备自己的中断优先级控制字节(8位,但是STM32F103中只使用4位,高4位有效),用于表达优先级的高4位又被为组成抢占式优先级响应优先级,通常也把响应优先级称为“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。

高抢占式优先级的中断事件会打断当前的主程序或者中断程序运行,俗称中断嵌套(抢占式优先级不同)。在抢占式优先级相同的情况下,高响应优先级的中断优先被响应。

当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理那一个。

STM32F103中指定中断优先级的寄存器位有4位,这4位的分组方式如下:

设置优先级分组可调用库函数 NVIC_PriorityGroupConfig(),在misc.c可以查看。

(4)中断配置步骤:

要使用中断我们就需要先配置它,通常都需经过这几步:

(1)使能外设某个中断(有专门的库函数进行配置);

(2)设置中断优先级分组,初始化 NVIC_InitTypeDef 结构体(misc.c)

typedef struct
{
  uint8_t NVIC_IRQChannel;                    //中断源
  uint8_t NVIC_IRQChannelPreemptionPriority;  //抢占优先级
  uint8_t NVIC_IRQChannelSubPriority;         //响应优先级
  FunctionalState NVIC_IRQChannelCmd;         //中断使能或失能   
} NVIC_InitTypeDef;

(3)编写中断服务函数(有固定函数名,在启动文件里可以查找,不要修改)。

(5)外部中断:

(1)外部中断介绍

EXTI简介

STM32F10x外部中断/事件控制器(EXTI)包含多达 20 个用于产生事件/中断请求的边沿检测器。EXTI的每根输入线都可单独进行配置,以选择类型(中断或事件)和相应的触发事件(上升沿触发、下降沿触发或边沿触发),还可独立地被屏蔽。

(视频中了解到EXTI类似于是外部按键触发外部中断,这个还挺有利于我们做一些外部按钮啥的)

EXTI结构框图(重要,掌握有利于软件编程思路)

1-->2-->3-->4-->5:这条路线是控制NVIC中断进入执行中断服务函数;

1-->2-->3-->6-->7-->8:这条线是产生脉冲信号到外设,我的理解是做触发信号使用(触发定时器或ADC转换等)。

注意到EXTI时钟源是PCLK2,也就是APB2总线提供,所以使能EXTI挂接在APB2,要开启其时钟。

(6)EXTI配置步骤:

(1)外部中断、事件线映射

STM32F10x的EXTI具有20个中断/事件线,如下:

?要是用AFIO来进行EXTI的配置:

#注意:PA0,PB0,PC0 、、、PG0都是对应EXTI0,同理其他。

?(2)外部中断配置步骤

要使用外部中断我们就需要先配置它,通常都需经过这几步:(EXTI相关库函数在stm32f10x_exti.c和stm32f10x_exti.h文件中)

(1)使能IO口时钟(基本套路),配置IO口模式为输入;

(2)开启AFIO时钟,设置IO口与中断线的映射关系:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);

例如:GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);

(3)配置中断分组(NVIC),使能中断。

(4)初始化EXTI,选择触发方式:

void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);

typedef struct

{

? uint32_t EXTI_Line;?????????????? //中断/事件线

? EXTIMode_TypeDef EXTI_Mode;?????? //EXTI模式

? EXTITrigger_TypeDef EXTI_Trigger; //EXTI触发方式

? FunctionalState EXTI_LineCmd;???? //中断线使能或失能

}EXTI_InitTypeDef;

(5)编写EXTI中断服务程序:

EXTI0_IRQHandler

EXTI1_IRQHandler

EXTI2_IRQHandler

EXTI3_IRQHandler

EXTI4_IRQHandler

EXTI9_5_IRQHandler

EXTI15_10_IRQHandler

#注意:0-4有专门的函数名,5-9和10-15都是上面共有的函数名。

(6)编写外部中断控制程序:

使能IO口时钟

?设置IO口与中断线的映射关系

配置中断分组,使能中断

?(IRQ是中断请求通道)

EXTI初始化,选择触发方式

?

编写EXTI中断服务函数

?

?

3、定时器中断实验

(1)定时器介绍:

STM32F1的定时器非常多,由2个基本定时器(TIM6、TIM7)4个通用定时器(TIM2-TIM5)2个高级定时器(TIM1、TIM8)组成。基本定时器的功能最为简单,类似于51单片机内定时器。通用定时器是在基本定时器的基础上扩展而来,增加了输入捕获与输出比较等功能。高级定时器又是在通用定时器基础上扩展而来,增加了可编程死区互补输出、重复计数器、带刹车(断路)功能,这些功能主要针对工业电机控制方面。

通用定时器简介

STM32F1的通用定时器包含一个 16 位自动重载计数器(CNT),该计数器由可编程预分频器(PSC)驱动。STM32F1的通用定时器可用于多种用途,包括测量输入信号的脉冲宽度(输入捕获)或者生成输出波形(输出比较和PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32F1 的每个通用定时器都是完全独立的,没有互相共享的任何资源。

STM32F1的通用定时器TIMx (TIM2-TIM5 )具有如下功能

(1)16 位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。

(2)16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535之间的任意数值。

(3)4个独立通道(TIMx_CH1-4),这些通道可以用来作为

A. 输入捕获

B. 输出比较

C. PWM生成(边缘或中间对齐模式)

D. 单脉冲模式输出

(4)可使用外部信号(TIMx_ETR)控制定时器,且可实现多个定时器互连(可以使用1个定时器控制另外一个定时器)的同步电路。

(5)发生如下事件时产生中断/DMA请求:

A. 更新:计数器向上或向下溢出,计数器初始化(通过软件或者内部、外部触发)

B. 出发时间(计数器启动、停止、初始化或者内部、外部触发计数)

C. 输入捕获

D. 输出比较

(6)支持针对定位的增量(正交)编码器和霍尔传感器电路

(7)触发输入作为外部时钟或者按周期的电流管理

通用定时器结构框图

(2)通用定时器配置步骤:

?

#以上图片均来自普中STM32带你进入ARM世界系列视频

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-19 08:09:02  更:2021-09-19 08:10:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:36:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码