#include "SN_EXIT.h" #include "common.h" /* 文件名:SN_EXIT.c/.h 作者: SN_FAE_黄泽洪 免责声明:无版权,可随意传播和篡改,该代码仅供开发参考,如需使用请自行验证 本人不担负商业使用上带来的风险。 */ /* SN_EXIT模块的使用方法: //用户设置的中断是处理的逻辑 void LED(void){ std_gpio_toggle_pin(LED_GPIO_PORT, LED_PIN); } int main(void){ SN_SYSCLK_set(SYSCLK_48MHZ); SN_EXIT_set(GPIOA,GPIO_PIN_1,GPIO_PULLUP,LED,EXTI_TRIGGER_FALLING,NVIC_PRIO_3); while(1){ } } 这样我们只要在PA1端口给一个下拉的边沿,LED就会改变亮灭状态。 */ //8个exti全局回调函数指针 void (*EXTI_call_fun0) (void) = NULL; void (*EXTI_call_fun1) (void) = NULL; void (*EXTI_call_fun2) (void) = NULL; void (*EXTI_call_fun3) (void) = NULL; void (*EXTI_call_fun4) (void) = NULL; void (*EXTI_call_fun5) (void) = NULL; void (*EXTI_call_fun6) (void) = NULL; void (*EXTI_call_fun7) (void) = NULL; //外部中断信号线列表 const uint32_t EXTI_LINE_list[8]={ EXTI_LINE_GPIO_PIN0, EXTI_LINE_GPIO_PIN1, EXTI_LINE_GPIO_PIN2, EXTI_LINE_GPIO_PIN3, EXTI_LINE_GPIO_PIN4, EXTI_LINE_GPIO_PIN5, EXTI_LINE_GPIO_PIN6, EXTI_LINE_GPIO_PIN7 }; /* 函数名称: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) ------------------------------------------------------------------------------------------------------------------------------------------ @功能: 设置外部触发,中断事件(使用回调函数设置) ------------------------------------------------------------------------------------------------------------------------------------------ @参数: 触发GPIO_X @GPIOA @GPIOB @GPIOC @参数: 触发pin_mask @ GPIO_PIN_0 @ GPIO_PIN_1 @ GPIO_PIN_2 ....... @ GPIO_PIN_7 @参数: IO上下拉电阻设置 pull @GPIO_NOPULL 无上下拉 @GPIO_PULLUP 上拉设置 @GPIO_PULLDOWN 下拉设置 @参数: 回调函数 类型: void*fun(void)指针 ;外部触发后要响应的函数操作 填入函数名称 (注意函数名就是函数指针) @参数: 触发的信号 @EXTI_TRIGGER_RISING 上升沿 @EXTI_TRIGGER_FALLING 下降沿 @EXTI_TRIGGER_RISING_FALLING 上下双边沿 @参数: 回调函数优先级 @:NVIC_PRIO_0 @:NVIC_PRIO_1 @:NVIC_PRIO_2 @:NVIC_PRIO_3 ------------------------------------------------------------------------------------------------------------------------------------------- @返回值: EXIT触发IO ------------------------------------------------------------------------------------------------------------------------------------------- 注意: 前面3个参数是关于gpio的,后面的参数是关于exit中断的 ,注意:使用PC0要修改选项字节 */ 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){ uint8_t j = 0; uint32_t pin_mask1 = pin_mask; std_gpio_init_t gpio_config = {0} ; std_exti_init_t exti_config = {0} ; if(gpiox == GPIOA){ std_rcc_gpio_clk_enable(RCC_PERIPH_CLK_GPIOA); //初始化对应使用的IO exti_config.gpio_id = EXTI_GPIOA; //设置中断id号 goto gpio_int ; }else if( gpiox == GPIOB ){ std_rcc_gpio_clk_enable(RCC_PERIPH_CLK_GPIOB); exti_config.gpio_id = EXTI_GPIOB; goto gpio_int ; }else if( gpiox == GPIOC ){ std_rcc_gpio_clk_enable(RCC_PERIPH_CLK_GPIOC); exti_config.gpio_id = EXTI_GPIOC; goto gpio_int ; } gpio_int: /* 初始化GPIO & EXTI*/ gpio_config.pin = pin_mask; gpio_config.mode = GPIO_MODE_INPUT; gpio_config.pull = pull; std_gpio_init(gpiox, &gpio_config); //设置中断线号 for(int i = 0; i < 8 ;i++){ j++; if( (pin_mask1 & 0x0001) == 1){ break; } pin_mask1 >>= 1; } switch((j-1)){ case 0: EXTI_call_fun0 = fun; //设置中断调用函数 break; case 1: EXTI_call_fun1 = fun; //设置中断调用函数 break; case 2: EXTI_call_fun2 = fun; //设置中断调用函数 break; case 3: EXTI_call_fun3 = fun; //设置中断调用函数 break; case 4: EXTI_call_fun4 = fun; //设置中断调用函数 break; case 5: EXTI_call_fun5 = fun; //设置中断调用函数 break; case 6: EXTI_call_fun6 = fun; //设置中断调用函数 break; case 7: EXTI_call_fun7 = fun; //设置中断调用函数 break; default: break; } exti_config.line_id = EXTI_LINE_list[(j-1)]; exti_config.mode = EXTI_MODE_INTERRUPT; exti_config.trigger = EXTI_TRIGGER; std_exti_init(&exti_config); /* 配置中断优先级 */ /* 使能中断 */ if((j-1) <= 1){ NVIC_SetPriority(EXTI0_1_IRQn, NVIC_PRIO_x); NVIC_EnableIRQ(EXTI0_1_IRQn); }else if((j-1) <= 3){ NVIC_SetPriority(EXTI2_3_IRQn, NVIC_PRIO_x); NVIC_EnableIRQ(EXTI2_3_IRQn); }else if((j-1) <= 7){ NVIC_SetPriority(EXTI4_7_IRQn, NVIC_PRIO_x); NVIC_EnableIRQ(EXTI4_7_IRQn); } return j-1; } //-----------------------------------------------------------------中断处理函数(初始化后才被使用)----------------------------------------------------------------------------------------- void EXTI0_1_IRQHandler(void){ if (std_exti_get_pending_status(EXTI_LINE_GPIO_PIN0)) { /* 清除EXTI通道中断挂起状态 */ std_exti_clear_pending(EXTI_LINE_GPIO_PIN0); EXTI_call_fun0(); } if (std_exti_get_pending_status(EXTI_LINE_GPIO_PIN1)) { /* 清除EXTI通道中断挂起状态 */ std_exti_clear_pending(EXTI_LINE_GPIO_PIN1); EXTI_call_fun1(); } } void EXTI2_3_IRQHandler(void){ if (std_exti_get_pending_status(EXTI_LINE_GPIO_PIN2)) { /* 清除EXTI通道中断挂起状态 */ std_exti_clear_pending(EXTI_LINE_GPIO_PIN2); EXTI_call_fun2(); } if (std_exti_get_pending_status(EXTI_LINE_GPIO_PIN3)) { /* 清除EXTI通道中断挂起状态 */ std_exti_clear_pending(EXTI_LINE_GPIO_PIN3); EXTI_call_fun3(); } } void EXTI4_7_IRQHandler(void){ if (std_exti_get_pending_status(EXTI_LINE_GPIO_PIN4)) { /* 清除EXTI通道中断挂起状态 */ std_exti_clear_pending(EXTI_LINE_GPIO_PIN4); EXTI_call_fun4(); } if (std_exti_get_pending_status(EXTI_LINE_GPIO_PIN5)) { /* 清除EXTI通道中断挂起状态 */ std_exti_clear_pending(EXTI_LINE_GPIO_PIN5); EXTI_call_fun5(); } if (std_exti_get_pending_status(EXTI_LINE_GPIO_PIN6)) { /* 清除EXTI通道中断挂起状态 */ std_exti_clear_pending(EXTI_LINE_GPIO_PIN6); EXTI_call_fun6(); } if (std_exti_get_pending_status(EXTI_LINE_GPIO_PIN7)) { /* 清除EXTI通道中断挂起状态 */ std_exti_clear_pending(EXTI_LINE_GPIO_PIN7); EXTI_call_fun7(); } }