zoukankan      html  css  js  c++  java
  • HAL——学习SysTick

    开始:

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

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


    2.外部中断/事件控制器 (EXTI):
    外部中断/事件控制器包含多达 23 个用于产生事件/中断请求的边沿检测器。每根输入线都可单独进行配置,以选择类型(中断或事件)和相应的触发事件(上升沿触发、下降沿触发或边沿触发)。每根输入线还可单独屏蔽。挂起寄存器用于保持中断请求的状态线
    在CMSISDeviceSTSTM32F4xxInclude 芯片对应的头文件中,定义了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参考在 CMSISDeviceSTSTM32F4xxInclude 芯片对应的头文件中,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函数进行延迟

  • 相关阅读:
    (转)我是一个小线程
    Gson本地和服务器环境不同遇到的Date转换问题 Failed to parse date []: Invalid time zone indicator
    Bigdecimal 比较equals与compareTo
    springboot jpa mongodb 多条件分页查询
    springboot Consider defining a bean of type 'xxx' in your configuration
    mongodb you can't add a second
    java8 获取某天最大(23:59:59)和最小时间(00:00:00)
    java volatile详解
    SpringBoot dubbo之class is not visible from class loader
    springboot dubbo filter之依赖注入null
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/10471037.html
Copyright © 2011-2022 走看看