查看: 12720|回复: 11

[S32] 关于S32K 按键中断问题

[复制链接]

该用户从未签到

1

主题

4

帖子

0

新手上路

Rank: 1

积分
23
最后登录
2017-4-10
发表于 2017-3-6 09:19:14 | 显示全部楼层 |阅读模式
本人刚接触嵌入式开发,对一些基础知识还不是很了解,最近在学习S32K开发板,在按键中断上碰到了点问题想问问各位。

程序为按键中断触发小灯亮灭,其中PTB4端口连接LED小灯,PTD15端口连接按键。程序是参照S32DS的定时器中断程序写的。

现在遇到的问题是程序跑不了,具体表现是运行到init_Key()函数入口时,直接死循环,并不能进入init_Key函数进行按键初始化设置。

下面是程序:
  1. #include "S32K144.h" /* include peripheral declarations S32K144 */

  2. #define PTB4     4                              /* Port PTB4, bit 4 :FRDM EVB output to red LED*/
  3. #define PTD15    15                                /* Port PTD15, bit 15 :FRDM EVB input from BTN0 [SW2]*/

  4. int idle_counter = 0;
  5. int PTD15_flag_counter = 0;

  6. void init_IRQs (void) {
  7.         FSL_NVIC->ICPR[1] = 1 << (78 % 32);  /* IRQ78-PTD ch0: clr any pending IRQ*/
  8.         FSL_NVIC->ISER[1] = 1 << (78 % 32);  /* IRQ78-PTD ch0: enable IRQ */
  9.         FSL_NVIC->IP[78] = 0xA;              /* IRQ78-PTD ch0: priority 10 of 0-15*/
  10. }

  11. void Init_ports(void)
  12. {
  13.                                                         /* Enable clocks to peripherals (PORT modules) */
  14.         PCC-> PCCn[PCC_PORTB_INDEX] = PCC_PCCn_CGC_MASK; /* Enable clock to PORT B */
  15.         PTB->PDDR |= 1<<PTB4;       /* Port B4: Data Direction= output */
  16.         PORTB->PCR[4] = 0x00000100; /* Port B4: MUX = GPIO */
  17. }

  18. void init_Key(void)
  19. {
  20.         /* Configure port D15 as INT input (BTN 0 [SW2] on EVB) */
  21.         PCC-> PCCn[PCC_PORTD_INDEX] = PCC_PCCn_CGC_MASK; /* Enable clock to PORT D */
  22.         PTD->PDDR &= ~(1<<PTD15);   /* Port D15: Data Direction= input (default) */
  23.         PORTD->PCR[15] = 0x000A0102;
  24.         /*Port D15: ISF flag and Interrupt on falling-edge, MUX = GPIO, Pull Enabled */
  25. }

  26. void disable_WDOG (void){
  27.         WDOG->CNT=0xD928C520;         /*Unlock watchdog*/
  28.         WDOG->TOVAL=0x0000FFFF;        /*Maximum timeout value*/
  29.         WDOG->CS = 0x00002100;  /*Disable watchdog*/
  30. }

  31. int main(void)
  32. {
  33.           disable_WDOG();
  34.           Init_ports();                                /*Configure ports*/
  35.           init_IRQs();                                /*Enable GPIO interrupts and priorities*/
  36.           init_Key();                                /*Initialize PTD15 as GPIO interrupts*/
  37.           for(;;)
  38.           {
  39.                   idle_counter++;
  40.           }
  41. }

  42. void PORTD_IRQHandler(void)
  43. {
  44.         PTD15_flag_counter++;
  45.         PTB->PTOR |= 1<<4;                /* Toggle output on port B4 (blue LED) */
  46.         PORTD->ISFR &= ~(1<<PTD15);
  47.         PORTD->PCR[15] |= 0x01000000;
  48. }
复制代码



下面是参考的S32DS的定时器中断程序:
  1. /*
  2. * hello_interrupts.c              Copyright NXP 2016
  3. * Description: Minimal interrupt example using LPIT0 chan 0 (vector 64)
  4. * 2016 Mar 04 S Mihalik - Initial Version
  5. *
  6. */

  7. #include "derivative.h" /* include peripheral declarations S32K144 */
  8. #include "clocks_and_modes.h" /* include peripheral declarations S32K144 */

  9. int idle_counter = 0;           /* main loop idle counter */
  10. int lpit0_ch0_flag_counter = 0; /* LPIT0 chan 0 timeout counter */

  11. void init_IRQs (void) {
  12.         FSL_NVIC->ICPR[1] = 1 << (48 % 32);  /* IRQ48-LPIT0 ch0: clr any pending IRQ*/
  13.         FSL_NVIC->ISER[1] = 1 << (48 % 32);  /* IRQ48-LPIT0 ch0: enable IRQ */
  14.         FSL_NVIC->IP[48] = 0xA;              /* IRQ48-LPIT0 ch0: priority 10 of 0-15*/
  15. }

  16. void init_ports (void) {
  17.   PCC-> PCCn[PCC_PORTB_INDEX] = PCC_PCCn_CGC_MASK; /* Enable clock for PORT B */
  18.   PTB->PDDR |= 1<<4;            /* Port B4:  Data Direction= output */
  19.   PORTB->PCR[4] =  0x00000100;  /* Port B4:  MUX = ALT1, GPIO (to blue LED on EVB) */
  20. }

  21. void init_LPIT0 (void) {
  22.   PCC->PCCn[PCC_LPIT0_INDEX] = PCC_PCCn_PCS(6);    /* Clock Src = 6 (SPLL2_DIV2_CLK)*/
  23.   PCC->PCCn[PCC_LPIT0_INDEX] |= PCC_PCCn_CGC_MASK; /* Enable clk to LPIT0 regs */
  24.   LPIT0->MCR = 0x00000001;    /* DBG_EN-0: Timer chans stop in Debug mode */
  25.                               /* DOZE_EN=0: Timer chans are stopped in DOZE mode */
  26.                               /* SW_RST=0: SW reset does not reset timer chans, regs */
  27.                               /* M_CEN=1: enable module clk (allows writing other LPIT0 regs) */
  28.   LPIT0->MIER = 0x00000001;   /* TIE0=1: Timer Interrupt Enabled fot Chan 0 */
  29.   LPIT0->TVAL0 = 80000000;    /* Chan 0 Timeout period: 80M clocks */
  30.   LPIT0->TCTRL0 = 0x00000001; /* T_EN=1: Timer channel is enabled */
  31.                               /* CHAIN=0: channel chaining is disabled */
  32.                               /* MODE=0: 32 periodic counter mode */
  33.                               /* TSOT=0: Timer decrements immediately based on restart */
  34.                               /* TSOI=0: Timer does not stop after timeout */
  35.                               /* TROT=0 Timer will not reload on trigger */
  36.                               /* TRG_SRC=0: External trigger soruce */
  37.                               /* TRG_SEL=0: Timer chan 0 trigger source is selected*/
  38. }
  39. void disable_WDOG (void){
  40.         WDOG->CNT=0xD928C520;         /*Unlock watchdog*/
  41.         WDOG->TOVAL=0x0000FFFF;        /*Maximum timeout value*/
  42.         WDOG->CS = 0x00002100;  /*Disable watchdog*/
  43. }
  44. int main(void) {
  45.   disable_WDOG();
  46.   init_ports();            /* Configure ports */
  47.   init_SOSC_8MHz();        /* Initialize system oscilator for 8 MHz xtal */
  48.   init_SPLL_80MHz();       /* Initialize SPLL to 80 MHz with 8 MHz SOSC */
  49.   NormalRUNmode_80MHz();   /* Init clocks: 80 MHz SPLL & core, 40 MHz bus, 20 MHz flash */
  50.   init_IRQs();             /* Enable desired interrupts and priorities */
  51.   init_LPIT0();            /* Initialize PIT0 for 1 second timeout  */

  52.   for (;;) {
  53.     idle_counter++;
  54.   }
  55. }

  56. void LPIT0_Ch0_IRQHandler (void) {
  57.   lpit0_ch0_flag_counter++;         /* Increment LPIT0 timeout counter */
  58.   PTB->PTOR |= 1<<4;                /* Toggle output on port D0 (blue LED) */
  59.   LPIT0->MSR |= LPIT_MSR_TIF0_MASK; /* Clear LPIT0 timer flag 0 */
  60. }
复制代码


最佳答案

FFGGYY66 发表于 2017-3-8 18:39 我用的就是您说的这款FRDM-S32K144 EVB,其中进入不了init_key()函数的问题我通过把它提前两行调用解决了 ... 楼主你好 请检查一下参考手册中断向量表,PORTD的IRQ号应该是62吧? vo ...
回复

使用道具 举报

  • TA的每日心情
    奋斗
    2017-2-13 08:29
  • 签到天数: 20 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    531

    主题

    2048

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    210
    最后登录
    2018-8-14
    发表于 2017-3-6 09:34:53 | 显示全部楼层
    帮顶
    签到 签到
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-4-17 08:39
  • 签到天数: 8 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    33

    主题

    788

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2796
    最后登录
    1970-1-1
    发表于 2017-3-6 11:16:35 | 显示全部楼层
    请问你S32的板子 哪里搞到的啊 ,官网还说样品阶段呀 ,谢谢
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    4

    帖子

    0

    新手上路

    Rank: 1

    积分
    23
    最后登录
    2017-4-10
     楼主| 发表于 2017-3-6 18:38:18 | 显示全部楼层
    qiu-368230 发表于 2017-3-6 11:16
    请问你S32的板子 哪里搞到的啊 ,官网还说样品阶段呀 ,谢谢

    以企业或者实验室名义联系当地经销商,一般会提供样板
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-4-17 08:39
  • 签到天数: 8 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    33

    主题

    788

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2796
    最后登录
    1970-1-1
    发表于 2017-3-7 08:25:42 | 显示全部楼层
    FFGGYY66 发表于 2017-3-6 18:38
    以企业或者实验室名义联系当地经销商,一般会提供样板

    你们厉害
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-2 06:04
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    59

    主题

    2888

    帖子

    10

    金牌会员

    Rank: 6Rank: 6

    积分
    6020
    最后登录
    2020-9-28
    发表于 2017-3-8 10:37:30 | 显示全部楼层
    楼主你好 能否直接把工程压缩后传上来。因为这个系列比较新,所以我这边暂时也没有配套的软件。
    另外请问你使用的是FRDM-S32K144开发板吗? 身边暂时只有这块板子可以拿来测试。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    4

    帖子

    0

    新手上路

    Rank: 1

    积分
    23
    最后登录
    2017-4-10
     楼主| 发表于 2017-3-8 18:39:47 | 显示全部楼层
    FSL_TICS_Robin 发表于 2017-3-8 10:37
    楼主你好 能否直接把工程压缩后传上来。因为这个系列比较新,所以我这边暂时也没有配套的软件。
    另外请问你 ...

    我用的就是您说的这款FRDM-S32K144 EVB,其中进入不了init_key()函数的问题我通过把它提前两行调用解决了,但是为什么可以解决我还不清楚。目前程序中断功能还是不能实现,我看了过程,好像这几种最后都死循环然后进入了EWM中断,目前还不是很清楚EWM模块的功能,正在看。
    工程文件我上传了,希望您能提供一些的指导,多谢!

    GPIO_LED_INT.rar

    546.71 KB, 下载次数: 81, 下载积分: 威望 1

    工程文件

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-2 06:04
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    59

    主题

    2888

    帖子

    10

    金牌会员

    Rank: 6Rank: 6

    积分
    6020
    最后登录
    2020-9-28
    发表于 2017-3-9 14:39:58 | 显示全部楼层
    FFGGYY66 发表于 2017-3-8 18:39
    我用的就是您说的这款FRDM-S32K144 EVB,其中进入不了init_key()函数的问题我通过把它提前两行调用解决了 ...

    楼主你好
    请检查一下参考手册中断向量表,PORTD的IRQ号应该是62吧?
    void init_IRQs (void) {
            FSL_NVIC->ICPR[1] = 1 << (62 % 32);  /* IRQ62-PTD ch0: clr any pending IRQ*/
            FSL_NVIC->ISER[1] = 1 << (62 % 32);  /* IRQ62-PTD ch0: enable IRQ */
            FSL_NVIC->IP[62] = 0xA;              /* IRQ62-PTD ch0: priority 10 of 0-15*/
    }


    另外那个不是由看门狗引起的,不用disable_WDOG
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    4

    帖子

    0

    新手上路

    Rank: 1

    积分
    23
    最后登录
    2017-4-10
     楼主| 发表于 2017-3-9 19:07:14 | 显示全部楼层
    FSL_TICS_Robin 发表于 2017-3-9 14:39
    楼主你好
    请检查一下参考手册中断向量表,PORTD的IRQ号应该是62吧?
    void init_IRQs (void) {

    谢了,问题解决了。
    没有注意到是NVIC配置的问题,把IRQ号填成Vector序号了。
    再次感谢!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-8-25 16:03
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    3

    主题

    53

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    369
    最后登录
    2018-3-26
    发表于 2017-3-31 11:09:01 | 显示全部楼层
    目前手头上有一块S32K144的板子,但是发现驱动有问题,开发环境是IAR,可以下程序,但是换成S32 Design Studio for ARM v1.3的时候,发现下不了程序,在S32 Design Studio for ARM v1.3中找的历程hello_interrupts,好不容易移植到IAR上,编译成功,但是发现进不了中断,
    能问一下,楼主,您的板子连上电脑,识别的驱动是什么?
    这个是我的;
    用S32 Design Studio for ARM v1.3下载的时候,发现这个问题,如图

    折腾了好几天!!!
    QQ截图20170331110655.png
    QQ图片20170331105248.png
    哎...今天够累的,签到来了1...
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-21 03:00 , Processed in 0.111778 second(s), 32 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表