[STM32L4+] STM32外部中断封装函数

[复制链接]
 楼主| xiaoqi000 发表于 2023-8-26 17:33 | 显示全部楼层 |阅读模式
STM32外部中断:

外部中断的配置非常简单,只需要以下几步:

  • 根据实际需要配置GPIO的模式
  • 开启AFIO时钟
  • 使用GPIO_EXTILineConfig函数选中GPIO口
  • 初始化NVIC_InitTypeDef,EXTI_InitTypeDef结构体
但是呢,开启时钟,配置结构体等步骤我感觉还是有点繁琐,所以就封装了以下,哎,可是我还是个STM32新手,对寄存器并不太熟悉(或者说,对位运算不熟悉),所以只能用固件库来封装了


下面给出.h文件和.c文件



 楼主| xiaoqi000 发表于 2023-8-26 17:33 | 显示全部楼层
1.GuiStar_EXTI.h
  1. #ifndef __EXTI_H__
  2. #define __EXTI_H__

  3. /**
  4.   ****************************************************************************************
  5.   * [url=home.php?mod=space&uid=288409]@file[/url]    GuiStar_EXTI.h
  6.   * [url=home.php?mod=space&uid=187600]@author[/url]  GuiStar-李什么恩
  7.   * [url=home.php?mod=space&uid=895143]@version[/url] V1.1.2
  8.   * [url=home.php?mod=space&uid=212281]@date[/url]    2023-1-15
  9.   * [url=home.php?mod=space&uid=247401]@brief[/url]   该文件仅含配置外部中断的函数        
  10.   ****************************************************************************************
  11.   */

  12. void GuiStar_EXTI_Init(GPIO_TypeDef* GPIOx, u16 GPIO_Pin_x, EXTITrigger_TypeDef EXTITrigger);
  13. void GuiStar_EXTI_SetEXTI0_IRQHandler(void (*Function)(void));
  14. void GuiStar_EXTI_SetEXTI1_IRQHandler(void (*Function)(void));
  15. void GuiStar_EXTI_SetEXTI2_IRQHandler(void (*Function)(void));
  16. void GuiStar_EXTI_SetEXTI3_IRQHandler(void (*Function)(void));
  17. void GuiStar_EXTI_SetEXTI4_IRQHandler(void (*Function)(void));
  18. void GuiStar_EXTI_SetEXTI15_10_IRQHandler(void (*Function)(void));
  19. void GuiStar_EXTI_SetEXTI9_5_IRQHandler(void (*Function)(void));

  20. /****************************************************************************************
  21.   * @attention
  22.   * 所有中断函数在启动文件中都可以找到,但是为了
  23.   * 方便使用,这里直接把外部中断的所有函数都列出来:
  24.   *        实际上,您只需要调用本文件中的几个设置中断函数行为的几个函数即可设置中断行为
  25.   *        也可以选择直接去设置下列的函数的行为达到同样的效果!
  26.   *
  27.   * EXTI0_IRQHandler
  28.   * EXTI1_IRQHandler
  29.   * EXTI2_IRQHandler
  30.   * EXTI3_IRQHandler
  31.   * EXTI4_IRQHandler
  32.   * EXTI15_10_IRQHandler
  33.   * EXTI9_5_IRQHandler
  34.   *
  35.   *****************************************************************************************/
  36.   
  37. /************************************************************************
  38.                                                    外部中断函数模板
  39. *************************************************************************

  40. void EXTI9_5_IRQHandler(void)
  41. {
  42.         if(EXTI_GetITStatus(EXTI_Line5)==SET)
  43.         {
  44.                
  45.                 此处写中断的相关操作。。。
  46.                 EXTI_ClearITPendingBit(EXTI_Line5);
  47.         }
  48. }

  49. */

  50. #endif



 楼主| xiaoqi000 发表于 2023-8-26 17:33 | 显示全部楼层
2.GuiStar_EXTI.c
  1. #include "stm32f10x.h"                  // Device header

  2. void (*GuiStar_EXTI0_IRQHandler)(void);
  3. void (*GuiStar_EXTI1_IRQHandler)(void);
  4. void (*GuiStar_EXTI2_IRQHandler)(void);
  5. void (*GuiStar_EXTI3_IRQHandler)(void);
  6. void (*GuiStar_EXTI4_IRQHandler)(void);
  7. void (*GuiStar_EXTI9_5_IRQHandler)(void);
  8. void (*GuiStar_EXTI15_10_IRQHandler)(void);

  9. /**
  10.   * @brief  确定外部中断0处理器的行为
  11.   * @param  *Function 它是一个指向定时器中断行为的指针
  12.   * @retval 无
  13.   */
  14. void GuiStar_EXTI_SetEXTI0_IRQHandler(void (*Function)(void))
  15. {
  16.         GuiStar_EXTI0_IRQHandler=Function;
  17. }

  18. /**
  19.   * @brief  确定外部中断1处理器的行为
  20.   * @param  *Function 它是一个指向定时器中断行为的指针
  21.   * @retval 无
  22.   */
  23. void GuiStar_EXTI_SetEXTI1_IRQHandler(void (*Function)(void))
  24. {
  25.         GuiStar_EXTI1_IRQHandler=Function;
  26. }

  27. /**
  28.   * @brief  确定外部中断2处理器的行为
  29.   * @param  *Function 它是一个指向定时器中断行为的指针
  30.   * @retval 无
  31.   */
  32. void GuiStar_EXTI_SetEXTI2_IRQHandler(void (*Function)(void))
  33. {
  34.         GuiStar_EXTI2_IRQHandler=Function;
  35. }

  36. /**
  37.   * @brief  确定外部中断3处理器的行为
  38.   * @param  *Function 它是一个指向定时器中断行为的指针
  39.   * @retval 无
  40.   */
  41. void GuiStar_EXTI_SetEXTI3_IRQHandler(void (*Function)(void))
  42. {
  43.         GuiStar_EXTI3_IRQHandler=Function;
  44. }

  45. /**
  46.   * @brief  确定外部中断4处理器的行为
  47.   * @param  *Function 它是一个指向定时器中断行为的指针
  48.   * @retval 无
  49.   */
  50. void GuiStar_EXTI_SetEXTI4_IRQHandler(void (*Function)(void))
  51. {
  52.         GuiStar_EXTI4_IRQHandler=Function;
  53. }

  54. /**
  55.   * @brief  确定外部中断15_10处理器的行为
  56.   * @param  *Function 它是一个指向定时器中断行为的指针
  57.   * @retval 无
  58.   */
  59. void GuiStar_EXTI_SetEXTI15_10_IRQHandler(void (*Function)(void))
  60. {
  61.         GuiStar_EXTI15_10_IRQHandler=Function;
  62. }

  63. /**
  64.   * @brief  确定外部中断9_5处理器的行为
  65.   * @param  *Function 它是一个指向定时器中断行为的指针
  66.   * @retval 无
  67.   */
  68. void GuiStar_EXTI_SetEXTI9_5_IRQHandler(void (*Function)(void))
  69. {
  70.         GuiStar_EXTI9_5_IRQHandler=Function;
  71. }

  72. /**
  73.   * @brief 外部中断配置函数
  74.   * @param GPIOx                         选择GPIO端口(ABCDEFG)
  75.   * @param GPIO_Pin_x                  选择GPIO引脚(0~16)
  76.   * @param EXTITrigger                选择什么边沿触发
  77.   *                                                                EXTI_Trigger_Rising               上升沿触发;
  78.   *                                                                EXTI_Trigger_Falling                    下降沿触发;
  79.   *                                                                EXTI_Trigger_Rising_Falling   双边沿触发;
  80.   * @attention  此函数内部并没有配置GPIO的模式,请根据需要自行配置模式
  81.   * @retval
  82.   */
  83. void GuiStar_EXTI_Init(GPIO_TypeDef* GPIOx, u16 GPIO_Pin_x, EXTITrigger_TypeDef EXTITrigger)
  84. {       
  85.         u8 GPIO_PortSourceGPIOx;
  86.         u8 GPIO_PinSourcex=0;
  87.         for(;((1<<GPIO_PinSourcex) & (GPIO_Pin_x))==0;)
  88.         {
  89.                 GPIO_PinSourcex++;
  90.         };
  91.         if(GPIOx==GPIOA)
  92.         {
  93.                 GPIO_PortSourceGPIOx=GPIO_PortSourceGPIOA;
  94.         }
  95.         if(GPIOx==GPIOB)
  96.         {
  97.                 GPIO_PortSourceGPIOx=GPIO_PortSourceGPIOB;
  98.         }
  99.         if(GPIOx==GPIOC)
  100.         {
  101.                 GPIO_PortSourceGPIOx=GPIO_PortSourceGPIOC;
  102.         }
  103.         if(GPIOx==GPIOD)
  104.         {
  105.                 GPIO_PortSourceGPIOx=GPIO_PortSourceGPIOD;
  106.         }
  107.         if(GPIOx==GPIOE)
  108.         {
  109.                 GPIO_PortSourceGPIOx=GPIO_PortSourceGPIOE;
  110.         }
  111.         if(GPIOx==GPIOF)
  112.         {
  113.                 GPIO_PortSourceGPIOx=GPIO_PortSourceGPIOF;
  114.         }
  115.         if(GPIOx==GPIOG)
  116.         {
  117.                 GPIO_PortSourceGPIOx=GPIO_PortSourceGPIOG;
  118.         }
  119.        
  120.        
  121.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启AFIO的时钟
  122.        
  123.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOx,GPIO_PinSourcex);//配置外部引脚
  124.         EXTI_InitTypeDef EXTI_InitStruct;
  125.        
  126.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  127.         NVIC_InitTypeDef NVIC_InitStruct;
  128.        
  129.         if(GPIO_PinSourcex==0)//选中外部中断线
  130.         {
  131.                 EXTI_InitStruct.EXTI_Line = EXTI_Line0;
  132.                 NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
  133.         }
  134.        
  135.        
  136.         if(GPIO_PinSourcex==1)
  137.         {
  138.                 EXTI_InitStruct.EXTI_Line = EXTI_Line1;
  139.                 NVIC_InitStruct.NVIC_IRQChannel = EXTI1_IRQn;
  140.         }
  141.        
  142.        
  143.         if(GPIO_PinSourcex==2)
  144.         {
  145.                 EXTI_InitStruct.EXTI_Line = EXTI_Line2;
  146.                 NVIC_InitStruct.NVIC_IRQChannel = EXTI2_IRQn;
  147.         }
  148.        
  149.         if(GPIO_PinSourcex==3)
  150.         {
  151.                 EXTI_InitStruct.EXTI_Line = EXTI_Line3;
  152.                 NVIC_InitStruct.NVIC_IRQChannel = EXTI3_IRQn;
  153.         }
  154.        
  155.         if(GPIO_PinSourcex==4)
  156.         {
  157.                 EXTI_InitStruct.EXTI_Line = EXTI_Line4;
  158.                 NVIC_InitStruct.NVIC_IRQChannel = EXTI4_IRQn;
  159.         }
  160.        
  161.         if(GPIO_PinSourcex==5)
  162.         {
  163.                 EXTI_InitStruct.EXTI_Line = EXTI_Line5;
  164.                 NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
  165.         }
  166.        
  167.         if(GPIO_PinSourcex==6)
  168.         {
  169.                 EXTI_InitStruct.EXTI_Line = EXTI_Line6;
  170.                 NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
  171.         }
  172.        
  173.         if(GPIO_PinSourcex==7)
  174.         {
  175.                 EXTI_InitStruct.EXTI_Line = EXTI_Line7;
  176.                 NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
  177.         }
  178.        
  179.         if(GPIO_PinSourcex==8)
  180.         {
  181.                 EXTI_InitStruct.EXTI_Line = EXTI_Line8;
  182.                 NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
  183.         }
  184.        
  185.         if(GPIO_PinSourcex==9)
  186.         {
  187.                 EXTI_InitStruct.EXTI_Line = EXTI_Line9;
  188.                 NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
  189.         }
  190.        
  191.         if(GPIO_PinSourcex==10)
  192.         {
  193.                 EXTI_InitStruct.EXTI_Line = EXTI_Line10;
  194.                 NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
  195.         }
  196.        
  197.         if(GPIO_PinSourcex==11)
  198.         {
  199.                 EXTI_InitStruct.EXTI_Line = EXTI_Line11;
  200.                 NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
  201.         }
  202.        
  203.         if(GPIO_PinSourcex==12)
  204.         {
  205.                 EXTI_InitStruct.EXTI_Line = EXTI_Line12;
  206.                 NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
  207.         }
  208.        
  209.         if(GPIO_PinSourcex==13)
  210.         {
  211.                 EXTI_InitStruct.EXTI_Line = EXTI_Line13;
  212.                 NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
  213.         }
  214.        
  215.         if(GPIO_PinSourcex==14)
  216.         {
  217.                 EXTI_InitStruct.EXTI_Line = EXTI_Line14;
  218.                 NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
  219.         }
  220.        
  221.         if(GPIO_PinSourcex==15)
  222.         {
  223.                 EXTI_InitStruct.EXTI_Line = EXTI_Line15;
  224.                 NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
  225.         }
  226.        
  227.        
  228.         EXTI_InitStruct.EXTI_LineCmd = ENABLE;//使能选中的外部中断线
  229.         EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;//选择中断事件
  230.         EXTI_InitStruct.EXTI_Trigger = EXTITrigger;//选择触发源
  231.         EXTI_Init(&EXTI_InitStruct);
  232.        
  233.         //配置NVIC中断
  234.         NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  235.         NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
  236.         NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
  237.         NVIC_Init(&NVIC_InitStruct);
  238.        
  239.        
  240. }


  241. void EXTI0_IRQHandler(void)
  242. {
  243.         if(EXTI_GetITStatus(EXTI_Line0)==SET)
  244.         {
  245.                 GuiStar_EXTI0_IRQHandler();
  246.                 EXTI_ClearITPendingBit(EXTI_Line0);
  247.         }
  248. }

  249. void EXTI1_IRQHandler(void)
  250. {
  251.         if(EXTI_GetITStatus(EXTI_Line1)==SET)
  252.         {
  253.                 GuiStar_EXTI1_IRQHandler();
  254.                 EXTI_ClearITPendingBit(EXTI_Line1);
  255.         }
  256. }

  257. void EXTI2_IRQHandler(void)
  258. {
  259.         if(EXTI_GetITStatus(EXTI_Line2)==SET)
  260.         {
  261.                 GuiStar_EXTI2_IRQHandler();
  262.                 EXTI_ClearITPendingBit(EXTI_Line2);
  263.         }
  264. }

  265. void EXTI3_IRQHandler(void)
  266. {
  267.         if(EXTI_GetITStatus(EXTI_Line3)==SET)
  268.         {
  269.                 GuiStar_EXTI3_IRQHandler();
  270.                 EXTI_ClearITPendingBit(EXTI_Line3);
  271.         }
  272. }

  273. void EXTI4_IRQHandler(void)
  274. {
  275.         if(EXTI_GetITStatus(EXTI_Line4)==SET)
  276.         {
  277.                 GuiStar_EXTI4_IRQHandler();
  278.                 EXTI_ClearITPendingBit(EXTI_Line4);
  279.         }
  280. }

  281. void EXTI15_10_IRQHandler(void)
  282. {
  283.         if(EXTI_GetITStatus(EXTI_Line10)==SET)
  284.         {
  285.                 GuiStar_EXTI15_10_IRQHandler();
  286.                 EXTI_ClearITPendingBit(EXTI_Line10);
  287.         }
  288.         else if(EXTI_GetITStatus(EXTI_Line11)==SET)
  289.         {
  290.                 GuiStar_EXTI15_10_IRQHandler();
  291.                 EXTI_ClearITPendingBit(EXTI_Line11);
  292.         }
  293.         else if(EXTI_GetITStatus(EXTI_Line12)==SET)
  294.         {
  295.                 GuiStar_EXTI15_10_IRQHandler();
  296.                 EXTI_ClearITPendingBit(EXTI_Line12);
  297.         }
  298.         else if(EXTI_GetITStatus(EXTI_Line13)==SET)
  299.         {
  300.                 GuiStar_EXTI15_10_IRQHandler();
  301.                 EXTI_ClearITPendingBit(EXTI_Line13);
  302.         }
  303.         else if(EXTI_GetITStatus(EXTI_Line14)==SET)
  304.         {
  305.                 GuiStar_EXTI15_10_IRQHandler();
  306.                 EXTI_ClearITPendingBit(EXTI_Line14);
  307.         }
  308.         else if(EXTI_GetITStatus(EXTI_Line15)==SET)
  309.         {
  310.                 GuiStar_EXTI15_10_IRQHandler();
  311.                 EXTI_ClearITPendingBit(EXTI_Line15);
  312.         }
  313. }

  314. void EXTI9_5_IRQHandler(void)
  315. {
  316.         if(EXTI_GetITStatus(EXTI_Line5)==SET)
  317.         {
  318.                 GuiStar_EXTI9_5_IRQHandler();
  319.                 EXTI_ClearITPendingBit(EXTI_Line5);
  320.         }
  321.         else if(EXTI_GetITStatus(EXTI_Line6)==SET)
  322.         {
  323.                 GuiStar_EXTI9_5_IRQHandler();
  324.                 EXTI_ClearITPendingBit(EXTI_Line6);
  325.         }
  326.         else if(EXTI_GetITStatus(EXTI_Line7)==SET)
  327.         {
  328.                 GuiStar_EXTI9_5_IRQHandler();
  329.                 EXTI_ClearITPendingBit(EXTI_Line7);
  330.         }
  331.         else if(EXTI_GetITStatus(EXTI_Line8)==SET)
  332.         {
  333.                 GuiStar_EXTI9_5_IRQHandler();
  334.                 EXTI_ClearITPendingBit(EXTI_Line8);
  335.         }
  336.         else if(EXTI_GetITStatus(EXTI_Line9)==SET)
  337.         {
  338.                 GuiStar_EXTI9_5_IRQHandler();
  339.                 EXTI_ClearITPendingBit(EXTI_Line9);
  340.         }
  341. }


liuzaiy 发表于 2023-8-26 23:42 | 显示全部楼层
配置结构体等步骤是比较麻烦
您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

820

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部