• 女性之声——全国妇联 2019-03-19
  • 【理上网来·辉煌十九大】德国北威州经济部长:十九大报告表明中国有能力为世界做出更多贡献 2019-03-11
  • 全国小麦收获进度过八成 2019-03-07
  • 【人事】中共临汾市委组织部公示3名拟任职干部 2019-03-07
  • 这泼猴,物理。古文,哲学,基础语文,那一项没出丑?看着就想笑 2019-02-20
  • 云南理发店老板涉嫌杀害女演员因办卡纠纷起杀心 2019-02-20
  • 1至5月我区为企业和社会减负4200余万元 2019-02-09
  • 【学习时刻】参会专家盛小云:坚定文化自信,用高尚的作品引领社会风尚 2019-01-28
  • 绘就生态文明新画卷—甘南州造林绿化工作纪实 2019-01-28
  • 某些人总是用“客观事实”来为自己壮胆,实际上根本不懂什么是“客观事实。 2019-01-12
  • 圣洁的雪山文章中国国家地理网 2018-11-22
  • 崇尚英雄 精忠报国——我们家的报国故事 2018-11-22
  • 618史上最壕“买家”现身 Google以 5.5亿美元投资京东 2018-11-21
  • 看好啦!是时候表演真正的技术了 2018-11-21
  • 日本大阪6.1级地震已致4人死亡 370多人受伤 2018-11-20
  • 打印

    广东十一选5官网: [DemoCode下载] M051的GPIO中断赏析

    [复制链接]
    1953|23
    跳转到指定楼层
    楼主
    这是Keil的pack自带的例子,非常有意思,对学习IO的中断非常有帮助
    1. /**************************************************************************//**
    2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
    3. * [url=home.php?mod=space&uid=895143]@version[/url]  V3.00
    4. * $Revision: 3 $
    5. * $Date: 15/05/22 2:51p $
    6. * [url=home.php?mod=space&uid=247401]@brief[/url]    Show the usage of GPIO interrupt function.
    7. *
    8. * @note
    9. * Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
    10. ******************************************************************************/
    11. #include <stdio.h>
    12. #include "M051Series.h"


    13. #define PLL_CLOCK           50000000


    14. /**
    15. * @brief       Port0/Port1 IRQ
    16. *
    17. * @param       None
    18. *
    19. * [url=home.php?mod=space&uid=266161]@return[/url]      None
    20. *
    21. * [url=home.php?mod=space&uid=1543424]@Details[/url]     The Port0/Port1 default IRQ, declared in startup_M051Series.s.
    22. */
    23. void GPIOP0P1_IRQHandler(void)
    24. {
    25.     /* To check if P1.3 interrupt occurred */
    26.     if(GPIO_GET_INT_FLAG(P1, BIT3))
    27.     {
    28.         GPIO_CLR_INT_FLAG(P1, BIT3);
    29.         printf("P1.3 INT occurred.\n");
    30.     }
    31.     else
    32.     {
    33.         /* Un-expected interrupt. Just clear all PORT0, PORT1 interrupts */
    34.         P0->ISRC = P0->ISRC;
    35.         P1->ISRC = P1->ISRC;
    36.         printf("Un-expected interrupts.\n");
    37.     }
    38. }

    39. /**
    40. * @brief       Port2/Port3/Port4 IRQ
    41. *
    42. * @param       None
    43. *
    44. * @return      None
    45. *
    46. * @details     The Port2/Port3/Port4 default IRQ, declared in startup_M051Series.s.
    47. */
    48. void GPIOP2P3P4_IRQHandler(void)
    49. {
    50.     /* To check if P4.5 interrupt occurred */
    51.     if(GPIO_GET_INT_FLAG(P4, BIT5))
    52.     {
    53.         GPIO_CLR_INT_FLAG(P4, BIT5);
    54.         printf("P4.5 INT occurred.\n");
    55.     }
    56.     else
    57.     {
    58.         /* Un-expected interrupt. Just clear all PORT2, PORT3 and PORT4 interrupts */
    59.         P2->ISRC = P2->ISRC;
    60.         P3->ISRC = P3->ISRC;
    61.         P4->ISRC = P4->ISRC;
    62.         printf("Un-expected interrupts.\n");
    63.     }
    64. }

    65. void SYS_Init(void)
    66. {
    67.     /*---------------------------------------------------------------------------------------------------------*/
    68.     /* Init System Clock                                                                                       */
    69.     /*---------------------------------------------------------------------------------------------------------*/
    70.     /* Enable Internal RC 22.1184MHz clock */
    71.     CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

    72.     /* Waiting for Internal RC clock ready */
    73.     CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

    74.     /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
    75.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));

    76.     /* Enable external XTAL 12MHz clock */
    77.     CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);

    78.     /* Waiting for external XTAL clock ready */
    79.     CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);

    80.     /* Set core clock as PLL_CLOCK from PLL */
    81.     CLK_SetCoreClock(PLL_CLOCK);

    82.     /* Enable UART module clock */
    83.     CLK_EnableModuleClock(UART0_MODULE);

    84.     /* Select UART module clock source */
    85.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_PLL, CLK_CLKDIV_UART(1));

    86.     /*---------------------------------------------------------------------------------------------------------*/
    87.     /* Init I/O Multi-function                                                                                 */
    88.     /*---------------------------------------------------------------------------------------------------------*/

    89.     /* Set P3 multi-function pins for UART0 RXD and TXD */
    90.     SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
    91.     SYS->P3_MFP |= (SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0);

    92. }

    93. void UART0_Init(void)
    94. {
    95.     /*---------------------------------------------------------------------------------------------------------*/
    96.     /* Init UART                                                                                               */
    97.     /*---------------------------------------------------------------------------------------------------------*/
    98.     /* Reset UART0 */
    99.     SYS_ResetModule(UART0_RST);

    100.     /* Configure UART0 and set UART0 Baudrate */
    101.     UART_Open(UART0, 115200);
    102. }

    103. /*---------------------------------------------------------------------------------------------------------*/
    104. /* MAIN function                                                                                           */
    105. /*---------------------------------------------------------------------------------------------------------*/
    106. int main(void)
    107. {
    108.     /* Unlock protected registers */
    109.     SYS_UnlockReg();

    110.     /* Init System, peripheral clock and multi-function I/O */
    111.     SYS_Init();

    112.     /* Lock protected registers */
    113.     SYS_LockReg();

    114.     /* Init UART0 for printf */
    115.     UART0_Init();

    116.     printf("\n\nCPU [url=home.php?mod=space&uid=72445]@[/url] %d Hz\n", SystemCoreClock);
    117.     printf("+------------------------------------------------+\n");
    118.     printf("|    GPIO P1.3 and P4.5 Interrupt Sample Code    |\n");
    119.     printf("+------------------------------------------------+\n\n");

    120.     /*-----------------------------------------------------------------------------------------------------*/
    121.     /* GPIO Interrupt Function Test                                                                        */
    122.     /*-----------------------------------------------------------------------------------------------------*/
    123.     printf("P1.3 and P4.5 are used to test interrupt ......\n");

    124.     /* Configure P1.3 as Input mode and enable interrupt by rising edge trigger */
    125.     GPIO_SetMode(P1, BIT3, GPIO_PMD_INPUT);
    126.     GPIO_EnableInt(P1, 3, GPIO_INT_RISING);
    127.     NVIC_EnableIRQ(GPIO_P0P1_IRQn);

    128.     /*  Configure P4.5 as Quasi-bidirection mode and enable interrupt by falling edge trigger */
    129.     GPIO_SetMode(P4, BIT5, GPIO_PMD_QUASI);
    130.     GPIO_EnableInt(P4, 5, GPIO_INT_FALLING);
    131.     NVIC_EnableIRQ(GPIO_P2P3P4_IRQn);

    132.     /* Waiting for interrupts */
    133.     while(1);
    134. }

    135. /*** (C) COPYRIGHT 2013 Nuvoton Technology Corp. ***/
    复制代码


    评论

    xuanhuanzi 2018-11-9 16:07 回复TA
    补充:GPIO_EnableInt(P4, 5, GPIO_INT_FALLING); 这个函数第二个参数直接用的数字,没有用BITx这种宏,是因为函数原型这么定义的,里面通过一个移位操作实现的,所以这里必须要用0~7中的某个数字。 
    沙发
     楼主 | 2018-11-8 11:21 | 只看该作者
    输入模式和双向模式都可以作为IO输入中断使用
    我们看到例子用了P1.3和P4.5两个管脚进行了演示,第一个使用的IO输入模式,上升沿触发;第二个是IO准双向模式,下降沿触发。都实现了输入中断。
    板凳
     楼主 | 2018-11-8 11:24 | 只看该作者
    中断处理函数,我们可以看到P0和P1是一个中断入口,P2,P3,P4是另外一个中断入口,进入后,你想知道是不是自己设置的那个IO管脚触发,还需要判断。
        if(GPIO_GET_INT_FLAG(P4, BIT5))
        {
            GPIO_CLR_INT_FLAG(P4, BIT5);
    都是使用这个函数,处理,先判断,然后如果是该管脚就清理。
    然后
    如果发生的中断没有一个是自己设置的,那么要全部清理怎么清理呢?
    几个共用的端口清理地方是各有各自的呢
            P2->ISRC = P2->ISRC;
            P3->ISRC = P3->ISRC;
            P4->ISRC = P4->ISRC;
    这就是清理234共用的,每个都要进行重写就是清理,也就是写1是清0
    地板
    | 2018-11-8 12:42 | 只看该作者
    很好很强大呀
    5
     楼主 | 2018-11-8 13:24 | 只看该作者

    是的,找个写的优美的例子,更容易懂单片机的套路。
    6
    | 2018-11-8 15:02 | 只看该作者
    照猫画虎,学会了这个中断,谢谢。
    7
    | 2018-11-9 12:44 | 只看该作者
    xuanhuanzi 发表于 2018-11-8 13:24
    是的,找个写的优美的例子,更容易懂单片机的套路。

    是的 我一直想优美  可是真的很难 呀
    8
    | 2018-11-9 15:45 | 只看该作者
    代码写的 堪做榜样呀
    9
    | 2018-11-11 11:18 | 只看该作者
    这代码写的是新唐例程里最好的了,楼主这么一解释,更通透。特别那补充的两句,让好多看糊涂的人茅塞顿开
    10
    | 2018-11-11 21:45 | 只看该作者
    库函数写的,更容易读懂。
    11
    | 2018-12-13 08:49 | 只看该作者

    大家好,我用的是M453R系列(最小系统板),为啥它经常每次PE13中断完毕都进入一次其他,而且其他几个管脚的中断好像没有禁止掉似的(其他管脚变化也会进入),帮忙解决下!谢谢




    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    12
    | 2018-12-13 15:32 | 只看该作者
    bsp0321 发表于 2018-12-13 08:49
    大家好,我用的是M453R系列(最小系统板),为啥它经常每次PE13中断完毕都进入一次其他,而且其他几个管脚 ...

    其他管脚没有设置成中断模式,结果跳入了中断函数?
    另外其他管脚的电平是不是没有固定下来。
    13
    | 2018-12-13 15:34 | 只看该作者
    bsp0321 发表于 2018-12-13 08:49
    大家好,我用的是M453R系列(最小系统板),为啥它经常每次PE13中断完毕都进入一次其他,而且其他几个管脚 ...

    不要让管脚悬空,容易触发。。。
    14
    | 2018-12-13 15:35 | 只看该作者
    bsp0321 发表于 2018-12-13 08:49
    大家好,我用的是M453R系列(最小系统板),为啥它经常每次PE13中断完毕都进入一次其他,而且其他几个管脚 ...

    另外不用的管脚设置为输出模式,输出模式不会导致输入中断。
    15
    | 2018-12-13 15:35 | 只看该作者
    bsp0321 发表于 2018-12-13 08:49
    大家好,我用的是M453R系列(最小系统板),为啥它经常每次PE13中断完毕都进入一次其他,而且其他几个管脚 ...

    另外不用的管脚设置为输出模式,输出模式不会导致输入中断。准双向输出
    16
    | 2018-12-13 15:35 | 只看该作者
    bsp0321 发表于 2018-12-13 08:49
    大家好,我用的是M453R系列(最小系统板),为啥它经常每次PE13中断完毕都进入一次其他,而且其他几个管脚 ...

    另外不用的管脚设置为输出模式,输出模式不会导致输入中断。准双向输出
    17
    | 2018-12-13 20:34 | 只看该作者
    dongnanxibei 发表于 2018-12-13 15:35
    另外不用的管脚设置为输出模式,输出模式不会导致输入中断。准双向输出 ...

    我设置成输出试试,谢谢!
    18
    | 2018-12-13 20:41 | 只看该作者
    bsp0321 发表于 2018-12-13 20:34
    我设置成输出试试,谢谢!

    设置成准双向模式好多了,但是进入真正的PE13产生的中断之后完成之后还会进入一次else的断点
    19
    | 2018-12-13 21:01 | 只看该作者
    bsp0321 发表于 2018-12-13 20:41
    设置成准双向模式好多了,但是进入真正的PE13产生的中断之后完成之后还会进入一次else的断点 ...

    这里肯定还是有某个地方设置有问题。你慢慢研究尝试,把所有的IO都分类筛查一遍。
    20
    | 2018-12-13 21:02 | 只看该作者
    比如读出来中断标志位,看看具体是哪几个会出问题,然后看看那个是什么配置。
    扫描二维码,随时随地手机跟帖
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    我要发帖 投诉建议 创建版块 申请版主

    快速回复

    您需要登录后才可以回帖
    登录 | 注册
    高级模式

    论坛热帖

    快速回复 广东快乐十分走势图 返回列表
  • 女性之声——全国妇联 2019-03-19
  • 【理上网来·辉煌十九大】德国北威州经济部长:十九大报告表明中国有能力为世界做出更多贡献 2019-03-11
  • 全国小麦收获进度过八成 2019-03-07
  • 【人事】中共临汾市委组织部公示3名拟任职干部 2019-03-07
  • 这泼猴,物理。古文,哲学,基础语文,那一项没出丑?看着就想笑 2019-02-20
  • 云南理发店老板涉嫌杀害女演员因办卡纠纷起杀心 2019-02-20
  • 1至5月我区为企业和社会减负4200余万元 2019-02-09
  • 【学习时刻】参会专家盛小云:坚定文化自信,用高尚的作品引领社会风尚 2019-01-28
  • 绘就生态文明新画卷—甘南州造林绿化工作纪实 2019-01-28
  • 某些人总是用“客观事实”来为自己壮胆,实际上根本不懂什么是“客观事实。 2019-01-12
  • 圣洁的雪山文章中国国家地理网 2018-11-22
  • 崇尚英雄 精忠报国——我们家的报国故事 2018-11-22
  • 618史上最壕“买家”现身 Google以 5.5亿美元投资京东 2018-11-21
  • 看好啦!是时候表演真正的技术了 2018-11-21
  • 日本大阪6.1级地震已致4人死亡 370多人受伤 2018-11-20