ToB企服应用市场:ToB评测及商务社交产业平台

标题: STM32_HAL库_外部制止 [打印本页]

作者: 宁睿    时间: 2024-6-20 19:50
标题: STM32_HAL库_外部制止


一、设置分组 

stm32f1xx_hal_cortex.c

查看分组
五个形参,分组0~4


stm32f1xx_hal.c

设置了分组为2, 此工程就不需要再设置了


再回到stm32f1xx_hal_cortex.c
查看NVIC_SetPriorityGrouping的界说,若无法跳转,先编译一下,

继续找界说




这段代码是用于设置 NVIC 的优先级分组的内联函数。关键部门:

总的来说,这个函数的目标是安全地设置 NVIC 的优先级分组,确保在举行任何更改之前正确地处理了旧的设置值,而且将写入操作限定在答应的范围内。

二、设置优先级


stm32f1xx_hal_cortex.c


没有返回值,三个形参

这段代码是用于设置特定制止的优先级的函数。
这个函数的目标是设置特定制止的优先级,确保传递给函数的优先级参数在有效范围内,并将优先级值编码后传递给 NVIC。







查看IRQn_Type界说

跳转到stm32f103xe.h



举个例子
RTC_IRQn

制止号是3




NVIC_SetPriority

看界说 

跳转到这里,再去看界说

 跳转到:

用于设置特定制止的优先级的内联函数。每个部门的作用:
这个函数的目标是根据制止类型设置对应制止的优先级,确保优先级值在正确的范围内,并将其正确地写入到相应的寄存器中。





stm32f1xx_hal_cortex.c对cortex_cm3.h文件里的函数举行了封装


这段代码是一个内联函数,用于查抄特定制止是否已经被使能。让我们渐渐解释每个部门的作用:
这个函数的目标是根据制止类型查抄特定制止是否已经被使能,并返回相应的结果。

三、EXTI





p60



P61
两种制止


四、GPIO外部制止











复制跑马灯实验,BSP新建EXTI文件夹,keil5中新建exti.c与exti.h并添加到EXTI文件夹,添加到工程里







复制拿过来用


 若无法跳转界说,参考这份博客
   http://t.csdnimg.cn/RCJyL
  




重新编译步伐

再次执行Go To Definition of ''的操作,可以了




参考

需选用外部制止下降沿触发,且输入上拉

  1. #define  GPIO_MODE_IT_RISING                    0x10110000u   /*!< External Interrupt Mode with Rising edge trigger detection          */
  2. #define  GPIO_MODE_IT_FALLING                   0x10210000u   /*!< External Interrupt Mode with Falling edge trigger detection         */
  3. #define  GPIO_MODE_IT_RISING_FALLING            0x10310000u   /*!< External Interrupt Mode with Rising/Falling edge trigger detection  */
  4. #define  GPIO_MODE_EVT_RISING                   0x10120000u   /*!< External Event Mode with Rising edge trigger detection               */
  5. #define  GPIO_MODE_EVT_FALLING                  0x10220000u   /*!< External Event Mode with Falling edge trigger detection              */
  6. #define  GPIO_MODE_EVT_RISING_FALLING           0x10320000u   /*!< External Event Mode with Rising/Falling edge trigger detection       */
复制代码

这些宏界说了用于 GPIO(通用输入/输出)引脚的不同模式,用于处理外部制止和事件,根据触发边沿的不同来触发。具体而言:

雷同地:

这些宏通常与 GPIO 设置函数一起使用,以设置 GPIO 引脚的所需模式,以便根据特定边沿触发来处理外部制止或事件。

上下拉设置
  1. #define  GPIO_NOPULL        0x00000000u   /*!< No Pull-up or Pull-down activation  */
  2. #define  GPIO_PULLUP        0x00000001u   /*!< Pull-up activation                  */
  3. #define  GPIO_PULLDOWN      0x00000002u   /*!< Pull-down activation                */
复制代码
这些宏界说了用于 GPIO 引脚的不同上拉和下拉设置选项。具体来说:

这些选项通常用于设置 GPIO 引脚的电气特性,以确保引脚在特定条件下的正确操作,如减少干扰、提高信号质量等。

选择输入上拉



制止优先级:HAL_NVIC_SetPriority()

go to definition


选择制止号

笔者选用的是B1,选择EXTI1_IRQn


设置抢断优先级与响应优先级
笔者设置的是2和0

使能制止:HAL_NVIC_EnableIRQ()
笔者的是EXTI1_IRQn



设计制止服务函数:
去到设置文件查找


选择EXTI1_IRQHandler

 





  1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
  2. {
  3.   /* EXTI line interrupt detected */
  4.   if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u)
  5.   {
  6.     __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
  7.     HAL_GPIO_EXTI_Callback(GPIO_Pin);
  8.   }
  9. }
复制代码
这段代码是一个 HAL(Hardware Abstraction Layer,硬件抽象层)的 GPIO(通用输入/输出)外部制止处理函数。让我来解释它:

用于在外部制止事件发生时执行相应的操作,如清除制止标志并调用用户界说的回调函数。

回调函数


  1. __weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  2. {
  3.   /* Prevent unused argument(s) compilation warning */
  4.   UNUSED(GPIO_Pin);
  5.   /* NOTE: This function Should not be modified, when the callback is needed,
  6.            the HAL_GPIO_EXTI_Callback could be implemented in the user file
  7.    */
  8. }
复制代码
用于处理 GPIO 外部制止回调的弱界说函数 HAL_GPIO_EXTI_Callback。

这个函数提供了一个默认的外部制止处理回调函数,并答应用户根据需要举行修改或扩展。


制止信号到来,去翻转led引脚的信号,在led.h中查看引脚是B5



4.1使能GPIO时钟

  1. __HAL_RCC_GPIOB_CLK_ENABLE();
复制代码
4.2 HAL_GPIO_init


  1.         GPIO_InitTypeDef gpio_init_struct;
  2.         __HAL_RCC_GPIOB_CLK_ENABLE();
  3.     gpio_init_struct.Pin = LED0_GPI1_PIN;                   /* 引脚B1 */
  4.     gpio_init_struct.Mode = GPIO_MODE_IT_FALLING;            /* 推挽输出 */
  5.     gpio_init_struct.Pull = GPIO_PULLUP;                    /* 上拉 */
  6.     gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;          /* 高速 */
  7.     HAL_GPIO_Init(GPIOB, &gpio_init_struct);       /* 初始化 */
  8.                
复制代码
4.3 设置制止分组


设置文件已设置分组为2 


4.4 设置制止优先级

  1. HAL_NVIC_SetPriority(EXTI1_IRQn,2,0);
复制代码
4.5 使能制止

  1. HAL_NVIC_EnableIRQ(EXTI1_IRQn);
复制代码

4.6 设计制止服务函数

  1. void EXTI1_IRQHandler(void)
  2. {
  3.         HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);
  4. }
  5. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  6. {
  7.         delay_ms(20);
  8.         if(GPIO_Pin=GPIO_Pin_1)
  9.         {
  10.                 if(HAL_GPIO_ReadPin(GPIOB,GPIO_Pin_1) ==0)
  11.                 {
  12.                         HAL_GPIO_TogglePin(GPIOB,GPIO_Pin_5);
  13.                
  14.                 }
  15.         }
  16. }
复制代码
exti.h


函数声明
  1. void exti_init(void);
复制代码

EXTI1_IRQHandler与HAL_GPIO_EXTI_Callback已经在设置文件里声明过
startup_stm32f103xe.s

stm32f1xx_hal_gpio.h



五、源码

exti.h

  1. #ifndef _EXTI_H
  2. #define _EXTI_H
  3. #include "./SYSTEM/sys/sys.h"
  4. void exti_init(void);
  5. #endif
复制代码
exit.c

  1. #include "./BSP/EXTI/exti.h"
  2. void exti_init(void)
  3. {
  4.         GPIO_InitTypeDef gpio_init_struct;
  5.         __HAL_RCC_GPIOB_CLK_ENABLE();
  6.     gpio_init_struct.Pin = GPIO_PIN_1;                   /* 引脚B1 */
  7.     gpio_init_struct.Mode = GPIO_MODE_IT_FALLING;            /* 推挽输出 */
  8.     gpio_init_struct.Pull = GPIO_PULLUP;                    /* 上拉 */
  9.     gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;          /* 高速 */
  10.     HAL_GPIO_Init(GPIOB, &gpio_init_struct);       /* 初始化 */
  11.                
  12.         HAL_NVIC_SetPriority(EXTI1_IRQn,2,0);
  13.         HAL_NVIC_EnableIRQ(EXTI1_IRQn);
  14. }
  15. void EXTI1_IRQHandler(void)
  16. {
  17.         HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);
  18. }
  19. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  20. {
  21.         delay_ms(20);
  22.         if(GPIO_Pin == GPIO_PIN_1)
  23.         {
  24.                 if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) ==0)
  25.                 {
  26.                         HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
  27.                
  28.                 }
  29.        
  30.         }
  31. }
复制代码


main.c

  1. #include "./SYSTEM/sys/sys.h"
  2. #include "./SYSTEM/delay/delay.h"
  3. #include "./SYSTEM/usart/usart.h"
  4. #include "./BSP/LED/led.h"
  5. #include "./BSP/EXTI/exti.h"
  6. int main(void)
  7. {
  8.     HAL_Init();                                 /* 初始化HAL库 */
  9.     sys_stm32_clock_init(RCC_PLL_MUL9);         /* 设置时钟,72M */
  10.     delay_init(72);                             /* 初始化延时函数 */
  11.     led_init();                                 /* 初始化LED */
  12.     exti_init();
  13.        
  14.        
  15.     while(1)
  16.     {
  17.                 HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
  18.                 delay_ms(5000);
  19.                
  20.     }
  21. }
复制代码









参考

   【【正点原子】手把手教你学STM32 HAL库开辟全集【真人出镜】STM32入门教学视频教程 单片机 嵌入式】https://www.bilibili.com/video/BV1bv4y1R7dp?p=56&vd_source=be33b1553b08cc7b94afdd6c8a50dc5a

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4