SN_EXIT.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. #include "SN_EXIT.h"
  2. #include "common.h"
  3. /*
  4. 文件名:SN_EXIT.c/.h
  5. 作者: SN_FAE_黄泽洪
  6. 免责声明:无版权,可随意传播和篡改,该代码仅供开发参考,如需使用请自行验证
  7. 本人不担负商业使用上带来的风险。
  8. */
  9. /*
  10. SN_EXIT模块的使用方法:
  11. //用户设置的中断是处理的逻辑
  12. void LED(void){
  13. std_gpio_toggle_pin(LED_GPIO_PORT, LED_PIN);
  14. }
  15. int main(void){
  16. SN_SYSCLK_set(SYSCLK_48MHZ);
  17. SN_EXIT_set(GPIOA,GPIO_PIN_1,GPIO_PULLUP,LED,EXTI_TRIGGER_FALLING,NVIC_PRIO_3);
  18. while(1){
  19. }
  20. }
  21. 这样我们只要在PA1端口给一个下拉的边沿,LED就会改变亮灭状态。
  22. */
  23. //8个exti全局回调函数指针
  24. void (*EXTI_call_fun0) (void) = NULL;
  25. void (*EXTI_call_fun1) (void) = NULL;
  26. void (*EXTI_call_fun2) (void) = NULL;
  27. void (*EXTI_call_fun3) (void) = NULL;
  28. void (*EXTI_call_fun4) (void) = NULL;
  29. void (*EXTI_call_fun5) (void) = NULL;
  30. void (*EXTI_call_fun6) (void) = NULL;
  31. void (*EXTI_call_fun7) (void) = NULL;
  32. //外部中断信号线列表
  33. const uint32_t EXTI_LINE_list[8]={
  34. EXTI_LINE_GPIO_PIN0,
  35. EXTI_LINE_GPIO_PIN1,
  36. EXTI_LINE_GPIO_PIN2,
  37. EXTI_LINE_GPIO_PIN3,
  38. EXTI_LINE_GPIO_PIN4,
  39. EXTI_LINE_GPIO_PIN5,
  40. EXTI_LINE_GPIO_PIN6,
  41. EXTI_LINE_GPIO_PIN7
  42. };
  43. /*
  44. 函数名称:uint8_t SN_EXIT_set(GPIO_t* gpiox,uint32_t pin_mask,uint32_t pull ,void (*fun) (void),uint32_t EXTI_TRIGGER ,uint32_t NVIC_PRIO_x)
  45. ------------------------------------------------------------------------------------------------------------------------------------------
  46. @功能: 设置外部触发,中断事件(使用回调函数设置)
  47. ------------------------------------------------------------------------------------------------------------------------------------------
  48. @参数: 触发GPIO_X
  49. @GPIOA
  50. @GPIOB
  51. @GPIOC
  52. @参数: 触发pin_mask
  53. @ GPIO_PIN_0
  54. @ GPIO_PIN_1
  55. @ GPIO_PIN_2
  56. .......
  57. @ GPIO_PIN_7
  58. @参数: IO上下拉电阻设置 pull
  59. @GPIO_NOPULL 无上下拉
  60. @GPIO_PULLUP 上拉设置
  61. @GPIO_PULLDOWN 下拉设置
  62. @参数: 回调函数 类型: void*fun(void)指针 ;外部触发后要响应的函数操作 填入函数名称 (注意函数名就是函数指针)
  63. @参数: 触发的信号
  64. @EXTI_TRIGGER_RISING 上升沿
  65. @EXTI_TRIGGER_FALLING 下降沿
  66. @EXTI_TRIGGER_RISING_FALLING 上下双边沿
  67. @参数: 回调函数优先级
  68. @:NVIC_PRIO_0
  69. @:NVIC_PRIO_1
  70. @:NVIC_PRIO_2
  71. @:NVIC_PRIO_3
  72. -------------------------------------------------------------------------------------------------------------------------------------------
  73. @返回值: EXIT触发IO
  74. -------------------------------------------------------------------------------------------------------------------------------------------
  75. 注意: 前面3个参数是关于gpio的,后面的参数是关于exit中断的 ,注意:使用PC0要修改选项字节
  76. */
  77. uint8_t SN_EXIT_set(GPIO_t* gpiox,uint32_t pin_mask,uint32_t pull ,void (*fun) (void),uint32_t EXTI_TRIGGER ,uint32_t NVIC_PRIO_x){
  78. uint8_t j = 0;
  79. uint32_t pin_mask1 = pin_mask;
  80. std_gpio_init_t gpio_config = {0} ;
  81. std_exti_init_t exti_config = {0} ;
  82. if(gpiox == GPIOA){
  83. std_rcc_gpio_clk_enable(RCC_PERIPH_CLK_GPIOA); //初始化对应使用的IO
  84. exti_config.gpio_id = EXTI_GPIOA; //设置中断id号
  85. goto gpio_int ;
  86. }else if( gpiox == GPIOB ){
  87. std_rcc_gpio_clk_enable(RCC_PERIPH_CLK_GPIOB);
  88. exti_config.gpio_id = EXTI_GPIOB;
  89. goto gpio_int ;
  90. }else if( gpiox == GPIOC ){
  91. std_rcc_gpio_clk_enable(RCC_PERIPH_CLK_GPIOC);
  92. exti_config.gpio_id = EXTI_GPIOC;
  93. goto gpio_int ;
  94. }
  95. gpio_int: /* 初始化GPIO & EXTI*/
  96. gpio_config.pin = pin_mask;
  97. gpio_config.mode = GPIO_MODE_INPUT;
  98. gpio_config.pull = pull;
  99. std_gpio_init(gpiox, &gpio_config);
  100. //设置中断线号
  101. for(int i = 0; i < 8 ;i++){
  102. j++;
  103. if( (pin_mask1 & 0x0001) == 1){
  104. break;
  105. }
  106. pin_mask1 >>= 1;
  107. }
  108. switch((j-1)){
  109. case 0: EXTI_call_fun0 = fun; //设置中断调用函数
  110. break;
  111. case 1: EXTI_call_fun1 = fun; //设置中断调用函数
  112. break;
  113. case 2: EXTI_call_fun2 = fun; //设置中断调用函数
  114. break;
  115. case 3: EXTI_call_fun3 = fun; //设置中断调用函数
  116. break;
  117. case 4: EXTI_call_fun4 = fun; //设置中断调用函数
  118. break;
  119. case 5: EXTI_call_fun5 = fun; //设置中断调用函数
  120. break;
  121. case 6: EXTI_call_fun6 = fun; //设置中断调用函数
  122. break;
  123. case 7: EXTI_call_fun7 = fun; //设置中断调用函数
  124. break;
  125. default:
  126. break;
  127. }
  128. exti_config.line_id = EXTI_LINE_list[(j-1)];
  129. exti_config.mode = EXTI_MODE_INTERRUPT;
  130. exti_config.trigger = EXTI_TRIGGER;
  131. std_exti_init(&exti_config);
  132. /* 配置中断优先级 */
  133. /* 使能中断 */
  134. if((j-1) <= 1){
  135. NVIC_SetPriority(EXTI0_1_IRQn, NVIC_PRIO_x);
  136. NVIC_EnableIRQ(EXTI0_1_IRQn);
  137. }else if((j-1) <= 3){
  138. NVIC_SetPriority(EXTI2_3_IRQn, NVIC_PRIO_x);
  139. NVIC_EnableIRQ(EXTI2_3_IRQn);
  140. }else if((j-1) <= 7){
  141. NVIC_SetPriority(EXTI4_7_IRQn, NVIC_PRIO_x);
  142. NVIC_EnableIRQ(EXTI4_7_IRQn);
  143. }
  144. return j-1;
  145. }
  146. //-----------------------------------------------------------------中断处理函数(初始化后才被使用)-----------------------------------------------------------------------------------------
  147. void EXTI0_1_IRQHandler(void){
  148. if (std_exti_get_pending_status(EXTI_LINE_GPIO_PIN0))
  149. {
  150. /* 清除EXTI通道中断挂起状态 */
  151. std_exti_clear_pending(EXTI_LINE_GPIO_PIN0);
  152. EXTI_call_fun0();
  153. }
  154. if (std_exti_get_pending_status(EXTI_LINE_GPIO_PIN1))
  155. {
  156. /* 清除EXTI通道中断挂起状态 */
  157. std_exti_clear_pending(EXTI_LINE_GPIO_PIN1);
  158. EXTI_call_fun1();
  159. }
  160. }
  161. void EXTI2_3_IRQHandler(void){
  162. if (std_exti_get_pending_status(EXTI_LINE_GPIO_PIN2))
  163. {
  164. /* 清除EXTI通道中断挂起状态 */
  165. std_exti_clear_pending(EXTI_LINE_GPIO_PIN2);
  166. EXTI_call_fun2();
  167. }
  168. if (std_exti_get_pending_status(EXTI_LINE_GPIO_PIN3))
  169. {
  170. /* 清除EXTI通道中断挂起状态 */
  171. std_exti_clear_pending(EXTI_LINE_GPIO_PIN3);
  172. EXTI_call_fun3();
  173. }
  174. }
  175. void EXTI4_7_IRQHandler(void){
  176. if (std_exti_get_pending_status(EXTI_LINE_GPIO_PIN4))
  177. {
  178. /* 清除EXTI通道中断挂起状态 */
  179. std_exti_clear_pending(EXTI_LINE_GPIO_PIN4);
  180. EXTI_call_fun4();
  181. }
  182. if (std_exti_get_pending_status(EXTI_LINE_GPIO_PIN5))
  183. {
  184. /* 清除EXTI通道中断挂起状态 */
  185. std_exti_clear_pending(EXTI_LINE_GPIO_PIN5);
  186. EXTI_call_fun5();
  187. }
  188. if (std_exti_get_pending_status(EXTI_LINE_GPIO_PIN6))
  189. {
  190. /* 清除EXTI通道中断挂起状态 */
  191. std_exti_clear_pending(EXTI_LINE_GPIO_PIN6);
  192. EXTI_call_fun6();
  193. }
  194. if (std_exti_get_pending_status(EXTI_LINE_GPIO_PIN7))
  195. {
  196. /* 清除EXTI通道中断挂起状态 */
  197. std_exti_clear_pending(EXTI_LINE_GPIO_PIN7);
  198. EXTI_call_fun7();
  199. }
  200. }