| |
|
开发:
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内核的一个外设,控制着芯片的中断相关功能。由于ARM给NVIC预留了非常多的功能,但对于使用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)
(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例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |