开始:

1.嵌套向量中断寄存器 (NVIC):

嵌套向量中断控制器 (NVIC) 和处理器内核接口紧密配合,可以实现低延迟的中断处理和晚到中断的高效处理。包括内核异常在内的所有中断均通过 NVIC 进行管理。
在CMSIS\Include\core_cm4.h头文件中,给出了NVIC结构体以及一些基本函数。
详细介绍以及寄存器、基层配置查询参考资料ST-《Cortex™-M4内核编程手册》

2.外部中断/事件控制器 (EXTI):
外部中断/事件控制器包含多达 23 个用于产生事件/中断请求的边沿检测器。每根输入线都可单独进行配置,以选择类型(中断或事件)和相应的触发事件(上升沿触发、下降沿触发或边沿触发)。每根输入线还可单独屏蔽。挂起寄存器用于保持中断请求的状态线
在CMSIS\Device\ST\STM32F4xx\Include 芯片对应的头文件中,定义了IRQn_Type枚举体,包含了F4系列全部异常声明以及其编号 (编号在中断编程中起到了标识的作用)
详细介绍参考资料ST-《STM32F4xx中文参考手册》,更为详细的教程参阅《零死角玩转STM32-F429》[16.STM32中断应用概览,17.EXTI-外部中断]

3.HAL_Init()
此函数用来初始化HAL库,应当作为主函数中第一个被调用的函数。其主要功能:
1.配置FLASH预取,指令以及Data缓存
2.配置好SysTick,使其每1ms产生一次中断
3.设置NVIC优先级分组为第四组(主优先级[0~15],子优先级[0])
4.调用回调函数 HAL_MspInit() 来进行全局低级硬件初始化(MSP:MCU Support Package).
详细代码实现参考文件stm32f4xx_hal.c

4.HAL_Delay(__IO uint32_t Delay )
 此函数为HAL库中定义的延迟函数,使用前需开启SysTick。
通过调用 HAL_GetTick() 函数获取时间,若未达到时间,则在一死循环内。
HAL_GetTick() 返回一个HAL库中变量 uwTick (static __IO uint32_t uwTick)。
为了使 uwTick 变量在每进行一次SysTick中断时自增,需在SysTick_Handler() 中调用 HAL_IncTick()。
HAL_IncTick() 是一个WEAK定义的函数,默认是使每被调用一次便让uwTick 自增1.
详细代码实现参考文件stm32f4xx_hal.c

补充:
  1.产生中断后,程序自动跳转到相应中断处理函数 ( 例如SysTick计时到点后则跳转到SysTick_Handler() 中断函数中),在用户未自行定义的情况下,默认进入由启动文件汇编语言编写的同名称死循环内。

2.SysTick被用作 HAL_Delay() 的时间基准,若要使其运算ms延时精确,需保证SysTick设置为1ms

3.在HAL库中,没有了NVIC以及EXTI的初始化结构体函数,而是将EXTI的初始化设置归纳在GPIO_InitTypeDef 结构体中。在该结构体的Mode中,可设置某GPIO为中断或者事件。中断 (IT) 与事件 (EVT)都各有三种可选模式。

4.HAL_GPIO_Init 函数起到了引脚参数设置以及中断/事件的基层配置,用户使用后需要进行NVIC的对应中断优先级设置以及使能。详细代码参考stm32f4xx_hal_gpio.c

5.HAL_NVIC_SetPriority(IRQn,PreemptPriority,SubPriority ) , 函数进行对应IRQn中断的 主优先级(PreemptPriority) 以及 子优先级(SubPriority) 配置。
IRQn参考在 CMSIS\Device\ST\STM32F4xx\Include 芯片对应的头文件中,IRQn_Type枚举体中的所需的枚举量
主优先级与子优先级可设置范围由优先级组决定,HAL_NVIC_SetPriorityGrouping() 可对优先级组进行配置
注意,调用 HAL_Init() 后,则已经设置好优先级组为Group4.

流程:
中断:
   某中断产生后,进入对应中断函数 ( 例如SysTick计时到点后,进入其对应 SysTick_Handler() 中断函数中)
自实现(定义)对应中断函数,若为外部中断则一般在该中断函数中调用 HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) 函数,该函数中进行判断看中断挂起寄存器上对应GPIO_Pin 位上是否被置1(发生了中断)。若有,则调用一个WEAK函数HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin), 用户一般在该回调函数中进行自己中断配置操作。

SysTick延时:
   SysTick计时到点后,产生中断,跳转到SysTick_Handler() 中断函数中。
在自实现的该中断函数中,调用 HAL_IncTick() 使得uwTick 变量自增
使用 HAL_Delay() 或类似自定义的延迟函数进行延迟

实现:
中断:
   配置GPIO(Pin、Mode[中断/事件]、无上拉)
开启对应GPIO时钟,使用 HAL_GPIO_Init() 进行初始化
HAL_NVIC_SetPriority(IRQn,PreemptPriority,SubPriority )//设置对应中断优先级
HAL_NVIC_EnableIRQ(IRQn )//使能对应中断,参数IRQn同参考 IRQn_Type 枚举体

GPIO_InitTypeDef s_GPIO;
s_GPIO.Pin = EXTIGPIO_PIN;
s_GPIO.Mode = GPIO_MODE_IT_XXXXXX;
s_GPIO.Pull = GPIO_NOPULL;

EXTIGPIO_CLK_ENABLE(); //使能时钟

HAL_GPIO_Init(EXTIGPIO_PIN,&s_GPIO);

HAL_NVIC_SetPriority(EXTIx_IRQn,i,j);//EXTIx_IRQn 参考IRQn编号 i-主优先级 j-子优先级
HAL_NVIC_EnableIRQ(EXTIx_IRQn);

将将要用到的中断函数进行自实现
void EXTIx_IRQHandler()
{
HAL_GPIO_EXTI_IRQHandler(EXTIGPIO_PIN);
}

定义回调函数HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
//TODO:自己的代码
}

SysTick延时:
   HAL_Init()已经开启了SysTick,使其每1ms产生一次中断
自实现SysTick中断函数 SysTick_Handler() ,在该函数内调用HAL_IncTick( )使 uwTick 变量自增
void SysTick_Handler()
{
HAL_IncTick();
}

在需要ms延迟的地方调用HAL_Delay函数进行延迟

HAL——学习SysTick的更多相关文章

  1. 第18章 SysTick—系统定时器

    第18章     SysTick—系统定时器 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ...

  2. SysTick—系统定时器

    本章参考资料<ARM Cortex™-M4F 技术参考手册> -4.5 章节 SysTick Timer(STK), 和4.48 章节 SHPRx,其中 STK 这个章节有 SysTick ...

  3. 第18章 SysTick—系统定时器—零死角玩转STM32-F429系列

    第18章     SysTick—系统定时器 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ...

  4. STM32学习及应用笔记一:SysTick定时器学习及应用

    这几年一直使用STM32的MCU,对ARM内核的SysTick计时器也经常使用,但几乎没有仔细了解过.最近正好要在移植一个新的操作系统时接触到了这块,据比较深入的了解了一下. 1.SysTick究竟是 ...

  5. 在Ubuntu上为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序(老罗学习笔记3)

    简单来说,硬件驱动程序一方面分布在Linux内核中,另一方面分布在用户空间的硬件抽象层中.接着,在Ubuntu上为Android系统编写Linux内核驱动程序(老罗学习笔记1)一文中举例子说明了如何在 ...

  6. 【STM32H7教程】第12章 STM32H7的HAL库框架设计学习

    完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第12章       STM32H7的HAL库框架设计学 ...

  7. HAL库延时、SYCCNT与SYSTICK

    HAL库驱动中,由于某些外设的驱动需要使用超时判断(比如I2C.SPI.SDIO等),需要精确延时(精度为1ms),使用的是SysTick,但是在操作系统里面,我们需要使用SysTick来提供系统时基 ...

  8. 【安富莱】V6,V5开发板用户手册,重在BSP驱动包设计方法,HAL库的框架学习,授人以渔(2019-11-04)

    说明: 1.本教程重在BSP驱动包设计方法和HAL库的框架学习,并将HAL库里面的各种弯弯绕捋顺,从而方便我们的程序设计. 2.本次工程延续以往的代码风格,从底层BSP驱动包到应用代码,变量命名,文件 ...

  9. 【安富莱】STM32H7用户手册发布,重在BSP驱动包设计方法,HAL库的框架学习,授人以渔,更新至63章(2019-07-21)

    说明: 1.本教程重在BSP驱动包设计方法和HAL库的框架学习,并将HAL库里面的各种弯弯绕捋顺,从而方便我们的程序设计. 2.由于是基于HAL库的文档,所以不限制H7系列,其它F1,F2,F3,F4 ...

随机推荐

  1. (bzoj1337 || 洛谷P1742 最小圆覆盖 )|| (bzoj2823 || 洛谷P2533 [AHOI2012]信号塔)

    bzoj1337 洛谷P1742 用随机增量法.讲解:https://blog.csdn.net/jokerwyt/article/details/79221345 设点集A的最小覆盖圆为g(A) 可 ...

  2. 记录一下在SpringBoot中实现简单的登录认证

    代码参考博客: https://blog.csdn.net/weixin_37891479/article/details/79527641 在做学校的课设的时候,发现了安全的问题,就不怀好意的用户有 ...

  3. python学习之列表元组,字典

    list:元素性质可以不一致,元素还可以是list,可类似数组方法进行索引(也可以用负数索引,-1表示最后一个),可用.append('')进行动态增加,可用pop()删除最后一个或者pop(i)删除 ...

  4. python采用sqlachmy购物商城

    一.流程图: 二.目录结构: C:\USERS\DAISY\PYCHARMPROJECTS\S12\MARKET │ __init__.py │ __init__.pyc │ ├─backend │ ...

  5. Spark Mllib里如何将trainDara训练数据文件里第一行是字段名不是数据给删除掉(图文详解)

    不多说,直接上干货! 具体,见 Hadoop+Spark大数据巨量分析与机器学习整合开发实战的第13章 使用决策树二元分类算法来预测分类StumbleUpon数据集

  6. hdu4553约会安排(线段树区间合并)

    链接 poj3667的加强版 当时的题解 这里只不过对于女神需要另开算,DS的占用的时间不加在女神身上,女神的时间都要加,清空的时候也都要算. #include <iostream> #i ...

  7. WPF 控件树

    WPF控件树按照基类进行分类,记录下来便于编写自定义控件时查阅 RangeBase范围控件 Thumb拖到控件 TextBoxBase文本控件 ItemControl组控件 ContrentContr ...

  8. thinkphp分页集成

    控制器: $User = M('webcase'); //  实例化 User 对象 $list = $User->order('id desc')->page($_GET['p'].', ...

  9. 将centos6的php5.3升级为5.6

    在阿里云主机上,操作系统是Centos6,php版本是5.3.因为安装Yii2.0的需要,我要升级php为5.4.因为还有5.5和5.6,当然要升到高版本了.我决定升到5.6.   首先,按照这里的步 ...

  10. 在SQL SERVER 2005中还原数据库时出现错误:system.data.sqlclient.sqlerror 媒体集有 2 个媒体簇 但只提供了 1 个。必须提供所有成员。 (microsoft.sqlserver.smo)

    问题:在SQL SERVER 2005中还原数据库时出现错误:system.data.sqlclient.sqlerror 媒体集有 2 个媒体簇 但只提供了 1 个.必须提供所有成员. (micro ...