查看: 2964|回复: 5

[已解决] KL27 PIT中断

[复制链接]

该用户从未签到

7

主题

13

帖子

0

注册会员

Rank: 2

积分
146
最后登录
2019-7-8
发表于 2016-11-3 09:47:25 | 显示全部楼层 |阅读模式
关闭PIT中断后进行UART操作,UART工作完毕后在开启PIT中断时。死循环再HardFault_Handler\  B.
代码如下:
        while (1)                                                           
        {
                if(ADC_UART_switch == 1)
                {
                        NVIC_DisableIRQ(PIT_IRQn);
                        uart2TranControl(UART_TX_ENABLE, UART_RX_ENABLE);                   /*ʹÄÜUART                      */
                        for(index_ADC_Value = 0; index_ADC_Value < 2000; index_ADC_Value++)
                        {
                                Vouth = (ADC_Value_temple[index_ADC_Value] & 0xFF00) >> 8;
                                Voutl = (INT8U)(ADC_Value_temple[index_ADC_Value] & 0x00FF);
                                uart2SendChar(Vouth);
                        myDelay(10);
                        uart2SendChar(Voutl);
                myDelay(10);
                        }
                        uart2TranControl(UART_TX_DISABLE, UART_RX_DISABLE);
                        ADC_UART_switch = 0;
                       
                        NVIC->ISER[0] = (1 << ((uint32_t)(PIT_IRQn) & 0x1F));
                        //NVIC_EnableIRQ(PIT_IRQn);
                        //NVIC_SetPriority(PIT_IRQn,3);
                }       
        }
直接调用 NVIC_EnableIRQ调用都不能写寄存器,而NVIC->ISER[0] = (1 << ((uint32_t)(PIT_IRQn) & 0x1F));却可以写成功。但是写成功之后还是进入HardFault中。
求大神解答啊

最佳答案

jianghe66 发表于 2016-11-3 11:22 终于有人回复了。。。谢谢! 我关中断的目的是要不让中断打断UART传输。 我的ADC采样是靠PIT硬件触发的。 ... 我觉得你没必要这样去做,串口传输可以随时传的,打断串口传输也无所 ...
回复

使用道具 举报

  • TA的每日心情

    2017-1-4 08:05
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
    发表于 2016-11-3 10:54:00 | 显示全部楼层
    不会有问题的,说明你具体干啥,给你找个好的算法
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-3-22 20:15
  • 签到天数: 21 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    23

    主题

    341

    帖子

    1

    高级会员

    Rank: 4

    积分
    909
    最后登录
    2019-4-7
    发表于 2016-11-3 11:06:51 | 显示全部楼层
    我想你的意思是为了防止中断打断ADC的采集而清除中断的,但是我想说,你这样的误差会累积的,这个自己回去慢慢考虑吧,一般必要的方法是放在中断中运行,每次触发的时间都是一致的。算了,先来解决这个问题吧,我回来尝试了一下发现没有什么问题。。。。呵呵,当然是我自己写的。。。给你看看代码吧:
    1. #include "includes.h"

    2. uint8 time=0;
    3. uint8 flag=0;
    4. void myDelay (INT32U ulTime)
    5. {
    6.     INT32U i;

    7.     i = 0;
    8.     while (ulTime--) {
    9.         for (i = 0; i < 5000; i++);
    10.     }
    11. }

    12. int  main (void)
    13. {
    14.                 uint16 count=0;
    15.     DisableInterrupts();
    16.                 SystemClockSetup();
    17.                 gpio_Init();
    18.                 uart_Init();
    19.                 LED_Init();
    20.                 KEY_Init();
    21. //                ADC_Init();
    22. //                PWM_Init();
    23.                 PIT_Init();
    24.           NVIC_EnableIRQ(PIT_IRQn);                                           /* PIT中断使能                  */
    25.     NVIC_SetPriority(PIT_IRQn,1);                                       /* 设置PIT中断优先级            */
    26.                 EnableInterrupts();
    27.     printf("YL-KL25Z128 GPIO_Blinky Test start\r\n");

    28.     while(1)
    29.                 {
    30.                                 if(flag==1)
    31.                                 {
    32.                                         NVIC_DisableIRQ(PIT_IRQn);
    33.                                         printf("nihao,%d",count++);
    34.                                         myDelay(2000);
    35.                                         flag=0;
    36.                                         PIT_TFLG0 = 1;// 标志位清空
    37.                                         NVIC_EnableIRQ(PIT_IRQn);
    38.                                 }       
    39.     }   
    40. }


    41. void PIT_IRQHandler(void)
    42. {
    43.     PIT_TFLG0 = 1;// 标志位清空
    44.                 LED1_Turn();
    45.                 LED2_Turn();       
    46.                 time++;
    47.                 if(time==10)
    48.                 {
    49.                         time=0;
    50.                         flag=1;
    51.                 }
    52. }
    复制代码

    成功的小小喜悦里,大脑自身可以产生兴奋剂哦!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    7

    主题

    13

    帖子

    0

    注册会员

    Rank: 2

    积分
    146
    最后登录
    2019-7-8
     楼主| 发表于 2016-11-3 11:22:41 | 显示全部楼层
    噬猎者 发表于 2016-11-3 11:06
    我想你的意思是为了防止中断打断ADC的采集而清除中断的,但是我想说,你这样的误差会累积的,这个自己回去 ...

    终于有人回复了。。。谢谢!
    我关中断的目的是要不让中断打断UART传输。
    我的ADC采样是靠PIT硬件触发的。
    整个程序的目的是先采后传,先把采样值放进数组,数组满了以后,停止采样,开始UART传输,数组里的数传完后再继续采样,这样的循环
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-3-22 20:15
  • 签到天数: 21 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    23

    主题

    341

    帖子

    1

    高级会员

    Rank: 4

    积分
    909
    最后登录
    2019-4-7
    发表于 2016-11-3 11:25:56 | 显示全部楼层
    jianghe66 发表于 2016-11-3 11:22
    终于有人回复了。。。谢谢!
    我关中断的目的是要不让中断打断UART传输。
    我的ADC采样是靠PIT硬件触发的。 ...

    我觉得你没必要这样去做,串口传输可以随时传的,打断串口传输也无所谓吧,因为串口传输的数据并不需要有严格的时间限制,相反,你的adc采集频率应该有合理的时间来控制
    成功的小小喜悦里,大脑自身可以产生兴奋剂哦!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16697
    最后登录
    1970-1-1
    发表于 2016-11-3 12:23:05 | 显示全部楼层
    一般是你硬件配置有问题
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-18 19:33 , Processed in 0.099091 second(s), 26 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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