OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 16635|回复: 5

请教一下关于串口中断和外中断合用的问题

[复制链接]

5

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2011-7-13
在线时间
3 小时
发表于 2011-7-13 10:17:13 | 显示全部楼层 |阅读模式

STM32F103,4路串口中断接受没有问题,单测外部中断也没有问题,放在一起的时候,出问题了,外中断能影响串口中断(选用的是下降沿中断,单侧是没有问题的,和串口中断在一起的时候,发现串口丢数据了,而且在按键没有抬起时,串口不能接受了,在主循环里一个流水等也不流了)反复改NVIC里的中断优先级了,4路串口在115200  100MS定时发送500字节左右,都能正确响应(中断函数里就是收到什么在回发出来),同时定时器里控制灯闪和主程序里流水也没问题。好几天了,哪位给指教一下,对NVIC里的优先级什么的搞的云里雾里的,呵呵要求外中断级别是最低的,不能影响串口
俺在线等结果呢,在好几个群里发了问,都无人回应!!


 





void  EXTI_Configuration(void)
{
 EXTI_InitTypeDef  EXTI_InitStructure;

/*********************外部中断0配置*************************/
   GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1); //把PA.0设置为外部中断0

   EXTI_DeInit();     //将EXIT寄存器重设置为缺省值
   EXTI_InitStructure.EXTI_Line = EXTI_Line1;  //设置外部中断线0
   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//EXTI_Mode_Interrupt; EXTI_Mode_Event //设置EXTI线路为重点请求
   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  //设置输入线路为下降沿为中断请求
   EXTI_InitStructure.EXTI_LineCmd = ENABLE;   //中断使能
   EXTI_Init(&EXTI_InitStructure); 
   //EXTI_GenerateSWInterrupt(EXTI_Line1);

}

void NVIC_Configuration(void)
{  
 NVIC_InitTypeDef NVIC_InitStructure;

#ifdef  VECT_TAB_RAM 
   /* Set the Vector Table base location at 0x20000000 */
   NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
   /* Set the Vector Table base location at 0x08000000 */
   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);  
#endif

 
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); // 设置先占优先级2位,从优先级2位 ;
 
   // Enable the TIM2 global Interrupt
   /*
   NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;  // TIM2 全局中断
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 先占优先级 0 ;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  // 从优先级 0 ;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // IRQ通道被使能 ;
   NVIC_Init(&NVIC_InitStructure);
    */
  // Enable the TIM3 Interrupt
   NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQChannel; // TIM3 全局中断
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 先占优先级 1 ;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 先占优先级 0 ;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // IRQ通道被使能 ;
   NVIC_Init(&NVIC_InitStructure);
 
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;  // USART1 全局中断 ;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);
   /*
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQChannel;  // USART2 全局中断 ;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);
   */
      /*
   NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQChannel;  // USART3 全局中断 ;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
   // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);
   */
   /*
   NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQChannel;  // USART4 全局中断 ;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5;
   //NVIC_InitStructure.NVIC_IRQChannelSubPriority = 5;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);
    */
    /*  */
  NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQChannel;//EXTI0_IRQChannel;//设置外部中断0
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//主优先级为4
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//从优先级为4
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//中断使能
   NVIC_Init(&NVIC_InitStructure);
   
   
}

void USART2_IRQHandler(void)
{
 u8 mm,i,p,n;
 if(USART_GetITStatus(USART2, USART_FLAG_ORE) != RESET)
  {
    mm=(u8)(USART_ReceiveData(USART2));
    USART_SendData(USART2,mm);
  }
}


void UART4_IRQHandler(void)
{
 u8 mm,i,p,n;
 //USART_SendData(USART1,'<');
 if(USART_GetITStatus(UART4, USART_FLAG_RXNE) != RESET)
  {
    mm=(u8)(USART_ReceiveData(UART4));
    USART_SendData(UART4,mm);
  }
 //USART_SendData(USART1,'>');
}

最开始调试的时候在中断里一直判断这个USART_FLAG_RXNE,后来在把4个串口都打开的时候在判断这个不行了,程序一直在这个中断里不出来,所以就判断USART_FLAG_ORE这个,目前串口还没问题,这个我稍后在查

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-7-13 10:39:00 | 显示全部楼层
你的分组完全乱了.
好好看看中断分组.
组1,只有1位抢占优先级.所以抢占优先级要嘛是1,要嘛是0.
 你看看你的设置...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2011-7-13
在线时间
3 小时
 楼主| 发表于 2011-7-13 10:41:42 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
从0 到4 我都实验过
回复 支持 反对

使用道具 举报

5

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2011-7-13
在线时间
3 小时
 楼主| 发表于 2011-7-13 10:45:47 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
您给说个数吧,我按照这个数填上好用了我在理解一下,您给说个数吧,能把串口1中断高于外中断就可以,其他的不先不管,我实验一下
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-7-13 11:13:34 | 显示全部楼层
组1.
抢占0,sub0>sub1>sub2>sbu3...>sub7,
抢占1,sub0>sub1>sub2>sub3...>sub7
而抢占0>抢占1.
所以(0,x)>(1,x)
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2011-7-13
在线时间
3 小时
 楼主| 发表于 2011-7-13 11:26:01 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
谢谢原子兄,我实验一下,呵呵
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 17:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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