123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335 |
- #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();
- }
-
- }
|