注册 登录
查看: 963|回复: 71

山外大哥求助,写了个UART中断的接收程序,有问题,谢谢!

[复制链接]
发表于 2014-9-9 20:50:22 | 显示全部楼层 |阅读模式

  1. //程序接收不到数据

  2. #include "common.h"
  3. #include "include.h"

  4. typedef struct int16_rcget
  5. {
  6.   int16 ROLL;
  7.   int16 PITCH;
  8.   int16 THROTTLE;
  9.   int16 YAW;
  10.   int16 AUX1;
  11.   int16 AUX2;
  12.   int16 AUX3;
  13.   int16 AUX4;
  14.   int16 AUX5;
  15. }RC_GETDATA;

  16. uint8 FLY_ENABLE;

  17. RC_GETDATA Rc_Get;//接收到的RC数据,1000~2000

  18. //uint8 data[32];
  19. /*!
  20. *  @brief      UART3中断服务函数
  21. *  @since      v5.0
  22. */
  23. void uart3_handler(void)
  24. {
  25.   uint8 data_buff[32];
  26.   uint8 i = 0,sum = 0;
  27.   UARTn_e uratn = UART3;
  28.   if(UART_S1_REG(UARTN[uratn]) & UART_S1_RDRF_MASK)   //接收数据寄存器满
  29.   {
  30.    
  31.     uart_getchar(UART3, data_buff+i);        //该句中有警告,因为data_buff[],我定义成了uint8类型,而uart_getchar参数为char类型,需不需要修改??????????????????????????
  32.     i = i +1;//判断接收字节数目
  33.    
  34.     if(i == 31)
  35.     {
  36.       uart_putbuff(UART3, data_buff, 32);//发送一帧数据,测试收不到数据??????????????????????????????????????
  37.       
  38.       for(i=0;i<31;i++)
  39.         sum += *(data_buff+i);
  40.       if(!sum==*(data_buff+31))  return;//判断校验字节sum
  41.       if(*data_buff==0x8A)//判断帧头
  42.       {
  43.         if(*(data_buff+1)==0x8A)//判断功能字,=0x8A,为遥控数据(键鼠控制)
  44.         {
  45.           Rc_Get.THROTTLE = (int16)(*(data_buff+3)<<8) |(*(data_buff+4));//油门
  46.           Rc_Get.YAW        = (int16)(*(data_buff+5)<<8) |(*(data_buff+6));
  47.           Rc_Get.ROLL        = (int16)(*(data_buff+7)<<8) |(*(data_buff+8));
  48.           Rc_Get.PITCH        = (int16)(*(data_buff+9)<<8) |(*(data_buff+10));
  49.           Rc_Get.AUX1        = (int16)(*(data_buff+11)<<8)|(*(data_buff+12));
  50.           Rc_Get.AUX2        = (int16)(*(data_buff+13)<<8)|(*(data_buff+14));
  51.           Rc_Get.AUX3        = (int16)(*(data_buff+15)<<8)|(*(data_buff+16));
  52.           Rc_Get.AUX4        = (int16)(*(data_buff+17)<<8)|(*(data_buff+18));
  53.           Rc_Get.AUX5        = (int16)(*(data_buff+19)<<8)|(*(data_buff+20));
  54.         }
  55.       }
  56.       else if(*data_buff==0x8B)
  57.       {
  58.         if((*data_buff+3)==0xA1)
  59.           FLY_ENABLE=1;
  60.         if((*data_buff+3)==0xA0)
  61.           FLY_ENABLE=0;
  62.         if((*data_buff+3)==0xAA)
  63.         {
  64.           //校正加速度,陀螺仪
  65.         }
  66.       }
  67.     }
  68.   }
  69. }

  70. /*!
  71. *  @brief      main函数
  72. *  @since      v5.0
  73. *  @note       串口中断接收测试
  74. */
  75. void main()
  76. {
  77.     uart_init(UART3,115200);     //初始化串口(UART3 是工程里配置为printf函数输出端口,故已经进行初始化)

  78.     uart_putstr   (UART3 ,"\n\n\n接收中断测试:");           //发送字符串

  79.     set_vector_handler(UART3_RX_TX_VECTORn,uart3_handler);   // 设置中断复位函数到中断向量表里

  80.     uart_rx_irq_en (UART3);                                 //开串口接收中断

  81.     while(1)
  82.     {

  83.     }
  84. }

回复

使用道具 举报

发表于 2014-9-9 20:53:25 | 显示全部楼层
i ,你想第二次进入函数还保存原先的值,就应该定义为 static 静态变量啊!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-9 20:59:18 | 显示全部楼层
虚竹 发表于 2014-9-9 20:53
i ,你想第二次进入函数还保存原先的值,就应该定义为 static 静态变量啊!

是i定义为 static 静态变量吗?我用一个if语句判断了下,只要不近IF语句,i就会一加,循环把32字节的数据放大data_buff[32]里,当i=31时,data_buff[32]数据填满后,把有用的数据放到结构体变量里。可是就是没反应?

回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-9 21:04:49 | 显示全部楼层

把i定义程了static,试了一下,K60总是发送下面一句话
HardFault Interrupt
****default_isr entered on vector 3*****


回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-9 21:13:59 | 显示全部楼层
快乐的味道92 发表于 2014-9-9 21:04
把i定义程了static,试了一下,K60总是发送下面一句话
HardFault Interrupt
****default_isr entered on ...

谢谢,改好了,i应该定义成静态变量,且进入if语句i要清零才可以,程序中有个警告,这个影响程序的数据处理吗?data_buff[32]填满后我需要把数据填充到结构体中,而不是把字符串填充到结构体中。
回复 支持 反对

使用道具 举报

发表于 2014-9-9 21:16:30 | 显示全部楼层
快乐的味道92 发表于 2014-9-9 21:13
谢谢,改好了,i应该定义成静态变量,且进入if语句i要清零才可以,程序中有个警告,这个影响程序的数据处 ...

出现警告,那是类型问题,你可以进行强制类型转换来消除警告。

回复 支持 反对

使用道具 举报

发表于 2014-9-9 21:18:06 | 显示全部楼层
快乐的味道92 发表于 2014-9-9 21:13
谢谢,改好了,i应该定义成静态变量,且进入if语句i要清零才可以,程序中有个警告,这个影响程序的数据处 ...

数据,不就是你串口接收到的数据吗?直接复制过去不就行了吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-9 21:33:22 | 显示全部楼层
虚竹 发表于 2014-9-9 21:18
数据,不就是你串口接收到的数据吗?直接复制过去不就行了吗?

问题已解决,另外程序中还有几个小问题都以解决,谢谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-11 09:54:17 | 显示全部楼层
虚竹 发表于 2014-9-9 21:18
数据,不就是你串口接收到的数据吗?直接复制过去不就行了吗?

问你下,K60串口波特率最大能达到多大?UART串口中断属于什么类型的中断?是外部中断还是定时中断?谢谢!
回复 支持 反对

使用道具 举报

发表于 2014-9-11 10:20:40 | 显示全部楼层
快乐的味道92 发表于 2014-9-11 09:54
问你下,K60串口波特率最大能达到多大?UART串口中断属于什么类型的中断?是外部中断还是定时中断?谢谢!

最大测过256000是可以的(电脑最大支持的波特率)

串口中断,就是串口中断。如同你问中国人是美国人还是日本人?中国人就是中国人
回复 支持 反对

使用道具 举报

发表于 2014-9-11 11:05:05 | 显示全部楼层
快乐的味道92 发表于 2014-9-11 09:54
问你下,K60串口波特率最大能达到多大?UART串口中断属于什么类型的中断?是外部中断还是定时中断?谢谢!

电脑最大的是 256000,不过单片机,可以用更高的波特率,注意,高波特率,容易出问题。
蓝牙模块,一般也就 115200,而且不能连续大数据,不然容易丢数据。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-11 19:45:53 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-11 10:20
最大测过256000是可以的(电脑最大支持的波特率)

串口中断,就是串口中断。如同你问中国人是美国人还 ...

为什么我写的程序里,只有一个UART中断接收时,可以成功接收到外部数据(我的外部数据是上位机发的),当我再往程序里加入PIT0中断时UART中断就不能收到数据了。程序在下面,麻烦看一下,谢谢!
  1. #include "common.h"
  2. #include "MK60_uart.h"
  3. #include "Interrupt.h"
  4. #include "FIRE_LED.H"
  5. #include "ANO_Tech_RC.h"
  6. #include "mpu6050.h"
  7. #include  "MK60_PIT.h"

  8. uint8 FLY_ENABLE;
  9. uint16 ACC_OFFSET_X,ACC_OFFSET_Y;
  10. //uint8 GYRO_OFFSET_OK = 1,ACC_OFFSET_OK = 1;

  11. RC_GETDATA Rc_Get;//接收到的RC数据,1000~2000

  12. void UART_RC(void)//中断服务函数
  13. {
  14.   static uint8 data_buff[32];
  15.   uint8 i,sum = 0;
  16.   static uint8 a = 0;
  17.   UARTn_e uratn = UART3;
  18.   if(UART_S1_REG(UARTN[uratn]) & UART_S1_RDRF_MASK)   //接收数据寄存器满
  19.   {  
  20.     uart_getchar(UART3, data_buff+a);        //该句中有警告,因为data_buff[],我定义成了uint8类型,而uart_getchar参数为char类型,需不需要修改?????
  21.     a = a +1;//判断接收字节数目
  22.     if(a == 32)
  23.     {
  24.       a = 0;
  25.       uart_putbuff(UART3, data_buff, 32);//发送一帧数据,测试收不到数据
  26.       
  27.       for(i=0;i<31;i++)
  28.         sum += *(data_buff+i);
  29.       //if(!sum==*(data_buff+31))  return;//判断校验字节sum
  30.       if(*data_buff==0x8A)//判断帧头
  31.       {
  32.         if(*(data_buff+1)==0x8A)//判断功能字,=0x8A,为遥控数据(键鼠控制)
  33.         {
  34.           Rc_Get.THROTTLE = (int16)(*(data_buff+3)<<8) |(*(data_buff+4));//油门
  35.           Rc_Get.YAW        = (int16)(*(data_buff+5)<<8) |(*(data_buff+6));
  36.           Rc_Get.ROLL        = (int16)(*(data_buff+7)<<8) |(*(data_buff+8));
  37.           Rc_Get.PITCH        = (int16)(*(data_buff+9)<<8) |(*(data_buff+10));
  38.           Rc_Get.AUX1        = (int16)(*(data_buff+11)<<8)|(*(data_buff+12));
  39.           Rc_Get.AUX2        = (int16)(*(data_buff+13)<<8)|(*(data_buff+14));
  40.           Rc_Get.AUX3        = (int16)(*(data_buff+15)<<8)|(*(data_buff+16));
  41.           Rc_Get.AUX4        = (int16)(*(data_buff+17)<<8)|(*(data_buff+18));
  42.           Rc_Get.AUX5        = (int16)(*(data_buff+19)<<8)|(*(data_buff+20));
  43.         }
  44.         else if(*(data_buff+1)==0x8B)
  45.         {
  46.           if(*(data_buff+3)==0xA1)
  47.           {
  48.             FLY_ENABLE=1;
  49.             led_stay_bright();
  50.           }
  51.           if(*(data_buff+3)==0xA0)
  52.           {
  53.             FLY_ENABLE=0;
  54.             led_stay_off();
  55.           }
  56.           if(*(data_buff+3)==0xAA)
  57.           {
  58.             //校正加速度,陀螺仪
  59.             if(*(data_buff+4)==0xA2) GYRO_OFFSET_OK = 0;
  60.             if(*(data_buff+4)==0xA1) ACC_OFFSET_OK = 0;
  61.             if(*(data_buff+4)==0xA3) {GYRO_OFFSET_OK = 0;ACC_OFFSET_OK = 0;}
  62.           }
  63.           if(*(data_buff+3)==0xAB)        //接收OFFSET(飞控设置----->传感器校正)
  64.           {
  65.             ACC_OFFSET_X = (*(data_buff+4)<<8) + *(data_buff+5);
  66.             ACC_OFFSET_Y = (*(data_buff+6)<<8) + *(data_buff+7);
  67.             //EE_SAVE_ACC_OFFSET();//EEPROM保存
  68.             //EE_SAVE_GYRO_OFFSET();//EEPROM保存
  69.           }
  70.           if(*(data_buff+3)==0xAC)        //Uart_Send_OFFSET(ACC_OFFSET,GYRO_OFFSET);
  71.           if(*(data_buff+3)==0xAD)        Uart_Send_PID();
  72.           if(*(data_buff+3)==0xAE)        //接收PID
  73.           {
  74.             PID_ROL.P = (float)((int16)(*(data_buff+4)<<8) |(*(data_buff+5)))/100;
  75.             PID_ROL.I = (float)((int16)(*(data_buff+6)<<8) |(*(data_buff+7)))/100;
  76.             PID_ROL.D = (float)((int16)(*(data_buff+8)<<8) |(*(data_buff+9)))/100;
  77.             PID_PIT.P = (float)((int16)(*(data_buff+10)<<8)|(*(data_buff+11)))/100;
  78.             PID_PIT.I = (float)((int16)(*(data_buff+12)<<8)|(*(data_buff+13)))/100;
  79.             PID_PIT.D = (float)((int16)(*(data_buff+14)<<8)|(*(data_buff+15)))/100;
  80.             PID_YAW.P = (float)((int16)(*(data_buff+16)<<8)|(*(data_buff+17)))/100;
  81.             PID_YAW.I = (float)((int16)(*(data_buff+18)<<8)|(*(data_buff+19)))/100;
  82.             PID_YAW.D = (float)((int16)(*(data_buff+20)<<8)|(*(data_buff+21)))/100;
  83.             //EE_SAVE_PID();//EEPROM保存
  84.           }
  85.          
  86.          
  87.         }
  88.         for(i=0;i<32;i++)
  89.         {
  90.           *(data_buff+i) = 0;
  91.         }
  92.       }
  93.     }
  94.   }
  95.   //if(UART_S1_REG(UARTN[uratn]) & UART_S1_TDRE_MASK )  //发送数据寄存器空
  96.   //{
  97.       //用户需要处理发送数据
  98.   //}
  99. }

  100. //中断设置
  101. void uart_interrupt(void)
  102. {
  103.   set_vector_handler(UART3_RX_TX_VECTORn , UART_RC);//把 uart3_handler 函数添加到中断向量表,不需要我们手动调用
  104.   uart_rx_irq_en(UART3);                            //开串口3接收中断
  105. }
  106. /**********************************************以上串口中断****************************************************************/

  107. /**********************************************以下PIT中断****************************************************************/

  108. void PIT0_service(void)
  109. {
  110.   static uint8 ms1 = 0,ms2 = 0,ms5 = 0,ms10 = 0;//中断次数计数器
  111.   PIT_Flag_Clear(PIT0);                         //清中断标志位
  112.   ms1++;
  113.   ms2++;
  114.   ms5++;
  115.   ms10++;
  116.   if(ms1==2)                                   //每两次中断一次,1ms
  117.   {
  118.     ms1=0;
  119.     Prepare_Data();
  120.     Send_AF();
  121.   }
  122.   if(ms2==4)                                   //每四次中断执行一次,2ms
  123.   {
  124.     ms2=0;
  125.     gesture_analyse();                        //姿态解算
  126.   }
  127.   if(ms5==10)                                  //每十次中断执行一次,5ms
  128.   {
  129.     ms5=0;
  130.   }
  131.   if(ms10==20)                                 //没二十次中断执行一次,10ms
  132.   {
  133.     ms10=0;
  134.     //Uart1_Send_AF();
  135.   }
  136.   
  137. }

  138. void control_interrupt(void)
  139. {
  140.   pit_init_us(PIT0,500);//初始化PIT0,定时时间为:0.5ms
  141.   set_vector_handler(PIT0_VECTORn ,PIT0_service);//设置PIT0的中断服务函数为 PIT0_IRQHandler
  142.   enable_irq (PIT0_IRQn);//使能PIT0中断
  143. }
回复 支持 反对

使用道具 举报

发表于 2014-9-11 19:47:01 | 显示全部楼层
快乐的味道92 发表于 2014-9-11 19:45
为什么我写的程序里,只有一个UART中断接收时,可以成功接收到外部数据(我的外部数据是上位机发的),当 ...

调一下中断优先级
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-11 19:48:21 | 显示全部楼层

中断优先级在哪个库里面,怎么使用?
回复 支持 反对

使用道具 举报

发表于 2014-9-11 19:49:21 | 显示全部楼层
快乐的味道92 发表于 2014-9-11 19:48
中断优先级在哪个库里面,怎么使用?

Coertx-M4系列中断嵌套、优先级说明(新增M0+系列说明) - 智能车资料区 - 山外 - vcan123论坛 http://www.vcan123.com/forum.php ... ;tid=959&ctid=1
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-11 19:56:40 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-11 19:49
Coertx-M4系列中断嵌套、优先级说明(新增M0+系列说明) - 智能车资料区 - 山外 - vcan123论坛 http://ww ...
  1. #include "common.h"
  2. #include "include.h"


  3. void main()
  4. {
  5.   DELAY_MS(500);                //上电延时
  6.   uart_init(UART3,500000);        //初始化串口3,波特率为115200
  7.   LCD_init();

  8.   MPU6050_init();
  9.   led_init_all();
  10.   uart_interrupt();
  11.   control_interrupt();
  12.   
  13.   NVIC_SetPriorityGrouping(4);            //设置优先级分组,4bit 抢占优先级,没有亚优先级
  14.   NVIC_SetPriority(PIT0_IRQn,0);          //配置优先级
  15.   NVIC_SetPriority(UART3_RX_TX_VECTORn,0);//配置优先级
  16.   
  17.   while(1)
  18.   {

  19.   }
  20. }
我在主函数里添加了优先级分组,你看下是否合适,主函数如下:
回复 支持 反对

使用道具 举报

发表于 2014-9-11 19:58:04 | 显示全部楼层
快乐的味道92 发表于 2014-9-11 19:56
我在主函数里添加了优先级分组,你看下是否合适,主函数如下:

降低一下 pit 的优先级,不然串口接收依旧有可能没接收成功。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-11 19:59:01 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-11 19:49
Coertx-M4系列中断嵌套、优先级说明(新增M0+系列说明) - 智能车资料区 - 山外 - vcan123论坛 http://ww ...

我编译的时候有一个这样的警告!

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-11 20:01:09 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-11 19:58
降低一下 pit 的优先级,不然串口接收依旧有可能没接收成功。
  1.   NVIC_SetPriorityGrouping(4);            //设置优先级分组,4bit 抢占优先级,没有亚优先级
  2.   
  3.   NVIC_SetPriority(UART3_RX_TX_VECTORn,0);//配置优先级  
  4.   NVIC_SetPriority(PIT0_IRQn,1);          //配置优先级
刚才写错了,改成这了
回复 支持 反对

使用道具 举报

发表于 2014-9-11 20:02:14 | 显示全部楼层
快乐的味道92 发表于 2014-9-11 20:01
刚才写错了,改成这了

uart3 的后缀,是 IRQn,不是V***
回复 支持 反对

使用道具 举报

发表于 2014-9-11 20:02:54 | 显示全部楼层
快乐的味道92 发表于 2014-9-11 20:01
刚才写错了,改成这了

因为写错了,应该是这样:
  1. NVIC_SetPriority(UART3_RX_TX_IRQn,0);//配置优先级

回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-11 20:04:07 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-11 20:02
因为写错了,应该是这样:

恩恩,改过来了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-11 20:10:15 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-11 20:02
因为写错了,应该是这样:

还是不行啊,我这边上位机已经显示发送数据了,K60还没接收到
回复 支持 反对

使用道具 举报

发表于 2014-9-11 20:12:21 | 显示全部楼层
快乐的味道92 发表于 2014-9-11 20:10
还是不行啊,我这边上位机已经显示发送数据了,K60还没接收到

你可以看看有没有进入串口接收中断
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-11 20:16:17 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-11 20:12
你可以看看有没有进入串口接收中断

没有进入,我定义了进入UART中断会点亮LED,我用上位机发数据,LED不亮,我没加PIT中断时是可以接收到的
回复 支持 反对

使用道具 举报

发表于 2014-9-11 20:19:13 | 显示全部楼层
快乐的味道92 发表于 2014-9-11 20:16
没有进入,我定义了进入UART中断会点亮LED,我用上位机发数据,LED不亮,我没加PIT中断时是可以接收到的
...

PIT不会干扰到串口的,肯定还有些东西出错了。

你先在pit定时中断函数里仅保留清中断标志位看看。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-11 20:22:04 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-11 20:12
你可以看看有没有进入串口接收中断

PIT中断进入了,因为上位机接收到了数据,我把往上位机发数据的函数放在PIT定时中断里了
回复 支持 反对

使用道具 举报

发表于 2014-9-11 20:23:44 | 显示全部楼层
快乐的味道92 发表于 2014-9-11 20:22
PIT中断进入了,因为上位机接收到了数据,我把往上位机发数据的函数放在PIT定时中断里了

我的意思是排除法,先屏蔽 PIT中断函数的内容,仅保留PIT清标志位,方便判断串口接收
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-11 20:25:22 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-11 20:19
PIT不会干扰到串口的,肯定还有些东西出错了。

你先在pit定时中断函数里仅保留清中断标志位看看。

可以接收,只保留清除中断标志位
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-11 20:26:21 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-11 20:23
我的意思是排除法,先屏蔽 PIT中断函数的内容,仅保留PIT清标志位,方便判断串口接收

我把PIT中断服务函数注释掉了,只保留了清除中断标志,UART可以接收数据
回复 支持 反对

使用道具 举报

发表于 2014-9-11 20:26:38 | 显示全部楼层
快乐的味道92 发表于 2014-9-11 20:25
可以接收,只保留清除中断标志位

那就是PIT中断函数里的代码干扰到,你再排除法,确认是哪个代码干扰啊。

回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-11 20:29:48 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-11 20:26
那就是PIT中断函数里的代码干扰到,你再排除法,确认是哪个代码干扰啊。

中断服务这样写合理吗?
  1. /**********************************************以下PIT中断****************************************************************/

  2. void PIT0_service(void)
  3. {
  4.   static uint8 ms1 = 0,ms2 = 0,ms5 = 0,ms10 = 0;//中断次数计数器
  5.   PIT_Flag_Clear(PIT0);                         //清中断标志位
  6.   
  7.   ms1++;
  8.   ms2++;
  9.   ms5++;
  10.   ms10++;
  11.   
  12.   if(ms1==2)                                   //每两次中断一次,1ms
  13.   {
  14.     ms1=0;
  15.     Prepare_Data();
  16.     Send_AF();
  17.   }
  18.   
  19.   if(ms2==4)                                   //每四次中断执行一次,2ms
  20.   {
  21.     ms2=0;
  22.     gesture_analyse();                        //姿态解算
  23.   }
  24.   if(ms5==10)                                  //每十次中断执行一次,5ms
  25.   {
  26.     ms5=0;
  27.   }
  28.   if(ms10==20)                                 //没二十次中断执行一次,10ms
  29.   {
  30.     ms10=0;
  31.     //Uart1_Send_AF();
  32.   }
  33.   
  34. }


回复 支持 反对

使用道具 举报

发表于 2014-9-11 20:31:25 | 显示全部楼层
快乐的味道92 发表于 1410438588
中断服务这样写合理吗?
这个很难说合不合理啊,需要调试,看看能不能实现功能。

不知道是不是串口发送,影响到串口接收。
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-11 20:42:45 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-11 20:31
这个很难说合不合理啊,需要调试,看看能不能实现功能。

不知道是不是串口发送,影响到串口接收。

我把PIT定时时间改长一点,竟然有时收到数据有时收不到数据,但和以前相比能收到了,以前是PIT 0.5MS中断一次,改成了5MS中断一次
回复 支持 反对

使用道具 举报

发表于 2014-9-11 20:45:15 | 显示全部楼层
快乐的味道92 发表于 1410439365
我把PIT定时时间改长一点,竟然有时收到数据有时收不到数据,但和以前相比能收到了,以前是PIT 0.5MS中断一次,改成了5MS中断一次
你配置了中断优先级,是抢占优先级的,应该不会出现这情况啊。
你可以试试屏蔽pit中断服务函数的内容试试。
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-11 20:59:28 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-11 20:45
你配置了中断优先级,是抢占优先级的,应该不会出现这情况啊。
你可以试试屏蔽pit中断服务函数的内容试试 ...

是PIT定时问题,我把PIT定时50ms中断一次就正常,但是不能满足实际需求
回复 支持 反对

使用道具 举报

发表于 2014-9-11 21:01:10 | 显示全部楼层
快乐的味道92 发表于 1410440368
是PIT定时问题,我把PIT定时50ms中断一次就正常,但是不能满足实际需求
你的意思是,定时时间太短就不行。

那你再看看你的优先级配置是否正常。会嵌套中断的,按理是不会这样的,除非中断优先级没配置好。
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-11 21:11:05 | 显示全部楼层
本帖最后由 快乐的味道92 于 2014-9-11 21:12 编辑
山外メ雲ジ 发表于 2014-9-11 21:01
你的意思是,定时时间太短就不行。

那你再看看你的优先级配置是否正常。会嵌套中断的,按理是不会这样的 ...

你发的那个连接说,需要用CMSIS库的两个函数配置中断优先级(另外一个实现中断使能),我的工程文件夹里CMSIS库只有一个文件,看图

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-11 21:12:28 | 显示全部楼层
快乐的味道92 发表于 2014-9-11 21:11
你发的那个连接说,需要用CMSIS库的两个函数配置中断优先级(另外一个实现中断使能),我的工程文件夹里C ...

配置中断优先级的函数怎么跳不进去?
回复 支持 反对

使用道具 举报

发表于 2014-9-11 21:24:03 | 显示全部楼层
快乐的味道92 发表于 2014-9-11 21:12
配置中断优先级的函数怎么跳不进去?

因为是编译好的库函数,所以跳不进去。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-11 21:24:09 | 显示全部楼层
虚竹 发表于 2014-9-11 11:05
电脑最大的是 256000,不过单片机,可以用更高的波特率,注意,高波特率,容易出问题。
蓝牙模块,一般 ...

来看下这个帖子吧,共同讨论下,谢谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-11 21:27:01 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-11 21:24
因为是编译好的库函数,所以跳不进去。

我是用的是新库,总感好像是什么地方冲突了,很有可能是UART收发冲突,但是我的UART发送函数没有使用中断
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-11 21:28:41 | 显示全部楼层
快乐的味道92 发表于 2014-9-11 21:27
我是用的是新库,总感好像是什么地方冲突了,很有可能是UART收发冲突,但是我的UART发送函数没有使用中断 ...

还用不用加这个#include "core_cm4.h"头文件,在调用中断优先级配置函数时?
回复 支持 反对

使用道具 举报

发表于 2014-9-11 21:30:29 | 显示全部楼层
快乐的味道92 发表于 1410442121
还用不用加这个#include "core_cm4.h"头文件,在调用中断优先级配置函数时?
不需要,新库默认已经添加好的。

你可以先屏蔽串口发送,看看会不会这样。
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-11 21:33:27 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-11 21:30
不需要,新库默认已经添加好的。

你可以先屏蔽串口发送,看看会不会这样。

屏蔽了,屏蔽后还是接收不到,三个函数都屏蔽掉后才能收到,因为都屏蔽掉后,PIT就没有中断服务函数了。是不是中断服务函数执行时间过长导致的?
回复 支持 反对

使用道具 举报

发表于 2014-9-11 21:35:14 | 显示全部楼层
快乐的味道92 发表于 1410442407
屏蔽了,屏蔽后还是接收不到,三个函数都屏蔽掉后才能收到,因为都屏蔽掉后,PIT就没有中断服务函数了。是不是中断服务函数执行时间过长导致的?
你可以里面添加延时函数来测试的。
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-12 08:01:38 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-11 21:01
你的意思是,定时时间太短就不行。

那你再看看你的优先级配置是否正常。会嵌套中断的,按理是不会这样的 ...

中断优先级配置函数,应该在哪里配置,另外,是在开启中断后配置还是之前?问题还没解决啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-12 08:02:14 | 显示全部楼层
快乐的味道92 发表于 2014-9-12 08:01
中断优先级配置函数,应该在哪里配置,另外,是在开启中断后配置还是之前?问题还没解决啊

现在是放到主函数里了
回复 支持 反对

使用道具 举报

发表于 2014-9-12 11:00:38 | 显示全部楼层
快乐的味道92 发表于 2014-9-12 08:01
中断优先级配置函数,应该在哪里配置,另外,是在开启中断后配置还是之前?问题还没解决啊

没影响的,一般是函数开头写就好。

你重新把你的中断配置代码发上来,不清楚你现在是什么代码。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-12 16:17:15 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-12 11:00
没影响的,一般是函数开头写就好。

你重新把你的中断配置代码发上来,不清楚你现在是什么代码。

我把工程文件发给你吧,用什么传,论坛附件太小
回复 支持 反对

使用道具 举报

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

本版积分规则

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