OpenEdv-开源电子网

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

串口和EXTI15_10_IRQChannel冲突,急,不知道为什么?

[复制链接]

3

主题

14

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2012-5-23
在线时间
0 小时
发表于 2012-8-25 18:35:38 | 显示全部楼层 |阅读模式

使用原子的函数,发现只要对对EXTI15_10_IRQChannel进行设置中断分组,则串口就无法使用,不知道为什么?
分组如下:

 Ex_NVIC_Config(GPIO_A,12,RTIR);
MY_NVIC_Init(1,0,EXTI15_10_IRQChannel,2); // Pa12
 

void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group) 
{
 u32 temp; 
 
 u8 IPRADDR=NVIC_Channel/4;  //每组只能存4个,得到组地址
 u8 IPROFFSET=NVIC_Channel%4;//在组内的偏移
 IPROFFSET=IPROFFSET*8+4;    //得到偏移的确切位置
 MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组
 temp=NVIC_PreemptionPriority<<(4-NVIC_Group);  
 temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
 temp&=0xf;//取低四位

 
 if(NVIC_Channel<32)NVIC->ISER[0]|=1<<NVIC_Channel;//使能中断位(要清除的话,相反操作就OK)
 else NVIC->ISER[1]|=1<<(NVIC_Channel-32);   
 NVIC->IPR[IPRADDR]|=temp<<IPROFFSET;//设置响应优先级和抢断优先级                 
}
只要注释掉第二名,串口就正常工作。大家快来帮帮我,急。

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-8-25 19:01:41 | 显示全部楼层
和你这个配置无关啊。
你是不是没有实现中断服务函数?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2012-5-23
在线时间
0 小时
 楼主| 发表于 2012-8-26 01:45:45 | 显示全部楼层

void EXTI3_IRQHandler(void)  //XF中断
{
 //Sample=0;  //打开线性门
 OUTB=1;
 NVIC->ICER[0]|=1<<(EXTI3_IRQChannel);
 EXTI->R=1<<4;
 NVIC->ISER[0]|=1<<EXTI4_IRQChannel;
 //NVIC->ISER[1]|=1<<(EXTI15_10_IRQChannel-32); //关闭下阀中断,开启上阀和采集
 
 EXTI->R=1<<3;  //清除LINE0上的中断标志位 
}
void EXTI4_IRQHandler(void)  //CFSS中断
{  
    Sample=1;  //关线性门
 XFC=0;//开线放
 //TIM3->CNT=0;
 TIM3->EGR|=0X01;//初始化
 TIM3->CR1|=0x01;    //使能定时器3
 //NVIC->ICER[0]|=1<<(EXTI3_IRQChannel);
 NVIC->ICER[0]|=1<<(EXTI4_IRQChannel);
 //EXTI->R=1<<7;
 //NVIC->ISER[0]|=1<<(EXTI9_5_IRQChannel); //关闭下阀,上阀和采集中断 开CFSX中断
    //NVIC->ICER[1]|=1<<(EXTI15_10_IRQChannel-32);

 EXTI->R=1<<4;  //清除LINE0上的中断标志位 
}
//外部中断9~5服务程序
void EXTI9_5_IRQHandler(void)    //CFSX中断
{    
 XFTime=TIM3->CNT;
 //if(OutSign==0)
 //{     
  TIM3->CR1&=0xfe;   //关定时器   
  XFC=1;
     //NVIC->ICER[0]|=1<<(EXTI3_IRQChannel);
     //NVIC->ICER[0]|=1<<(EXTI4_IRQChannel);
     NVIC->ICER[0]|=1<<(EXTI9_5_IRQChannel);    //关闭下阀,上阀和采集
     //NVIC->ICER[1]|=1<<(EXTI15_10_IRQChannel-32);

     SendBuff[0]=XFTime&0xff;//adcx/256;
     SendBuff[1]=XFTime>>8;//adcx%256;  
 
//     MYDMA_Enable(DMA1_Channel4);//开始一次DMA传输! 
//     while(!(DMA1->ISR&(1<<13)));//等待通道4传输完成
//     {
//      DMA1->IFCR|=1<<13;//清除通道4传输完成标志    
//     }

     //CJS=!CJS;
     Sample=0;  //打开线性门
     OUTB=0; 
     EXTI->R=1<<3;
  NVIC->ISER[0]|=1<<EXTI3_IRQChannel;   //开下阀中断     
 //}
 //else
 //{
//     TIM3->CR1|=0<<0;   //关定时器   
//  OutSign=0;
//  KFC=1; //关闭快放
//  Sample=0;  //打开线性门
//  EXTI->R=1<<3;
//  NVIC->ISER[0]|=1<<EXTI3_IRQChannel;   //开下阀中断
 //}
 EXTI->R=1<<7;     //清除LINE7上的中断标志位   
}
void EXTI15_10_IRQHandler(void)    //SF中断
{  
//    //CJS=0;
// NVIC->ICER[0]|=1<<(EXTI3_IRQChannel);
// NVIC->ICER[0]|=1<<(EXTI4_IRQChannel);
// NVIC->ICER[0]|=1<<(EXTI9_5_IRQChannel);    //关闭下阀,上阀和采集
// NVIC->ICER[1]|=1<<(EXTI15_10_IRQChannel-32);
// Sample=1; //关闭线性门    
// while(CFSS);
// KFC=0;  //打开快放 
// while(!CFSS);  
// //CJS=!CJS;
// KFC=1; //关闭快放 
// Sample=0; //打开线性门 
// NVIC->ISER[0]|=1<<EXTI3_IRQChannel;     //开下阀中断 
    EXTI->R=1<<12;     //清除LINE12上的中断标志位 
 //CJS=1;
}
外部中断都有。就是15-10的那个中断不能配置,去掉一切正常。
串口中断
void USART1_IRQHandler(void)
{
 u8 res;    
 if(USART1->SR&(1<<5))//接收到数据
 { 
  
  res=USART1->DR; 
  if((USART_RX_STA&0x80)==0)//接收未完成
  {
   if(USART_RX_STA&0x40)//接收到了0x0d
   {
    if(res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
    else USART_RX_STA|=0x80; //接收完成了
   }
   else //还没收到0X0D
   { 
    if(res==0x0d)USART_RX_STA|=0x40;
    else
    {
     USART_RX_BUF[USART_RX_STA&0X3F]=res;
     USART_RX_STA++;
     if(USART_RX_STA>63)USART_RX_STA=0;//接收数据错误,重新开始接收  
    }  
   }

  }          
 }             
}
void uart_init(u32 pclk2,u32 bound)
{   
 float temp;
 u16 mantissa;
 u16 fraction;   
 temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
 mantissa=temp;     //得到整数部分
 fraction=(temp-mantissa)*16; //得到小数部分 
    mantissa<<=4;
 mantissa+=fraction;
 RCC->APB2ENR|=1<<2;   //使能PORTA口时钟 
 RCC->APB2ENR|=1<<14;  //使能串口时钟
 //tt=tt;
 //tt=tt; 
 GPIOA->CRH&=0XFFFFF00F;
 GPIOA->CRH|=0X000008B0;//IO状态设置
   
 RCC->APB2RSTR|=1<<14;   //复位串口1
 RCC->APB2RSTR&=~(1<<14);//停止复位       
 //波特率设置
  USART1->BRR=mantissa; // 波特率设置 
 USART1->CR1|=0X200C;  //1位停止,无校验位.
#ifdef EN_USART1_RX    //如果使能了接收
 //使能接收中断
 USART1->CR1|=1<<8;    //PE中断使能
 USART1->CR1|=1<<5;    //接收缓冲区非空中断使能      
 MY_NVIC_Init(3,3,USART1_IRQChannel,2);//组2,最低优先级
#endif
}

回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2012-5-23
在线时间
0 小时
 楼主| 发表于 2012-8-26 01:47:42 | 显示全部楼层

void EXTIX_Init(void)
{
 RCC->APB2ENR|=1<<2;     //使能PORTA时钟 
 //tt=tt;
 //tt=tt;
 JTAG_Set(JTAG_SWD_DISABLE);//关闭JTAG和SWD  
    //GPIOA->CRL&=0XFFFFF00F;//PA1 2设置成输 出  
 //GPIOA->CRL|=0X00000330;
 GPIOA->CRH&=0XF0F0FFFF;
 GPIOA->CRH|=0X03080000;//PB14 推挽输出  PB11 PB12外部中断输入  11暂时不用
 //GPIOA->ODR|=1<<11;   //输出1 PB11上拉,PB12默认下拉
//
 RCC->APB2ENR|=1<<3;     //使能PORTB时钟 
 GPIOB->CRL&=0X00F00FFF;//PB3 PB4   7设置成输入 6输出 
 GPIOB->CRL|=0X83088000;
 GPIOB->ODR|=1<<4|1<<6;  //PB6输出1 PB4上拉 PB7默认下拉
 GPIOB->CRH&=0XFFFFF000;//PB8 PB9   10设置成输出 
 GPIOB->CRH|=0X00000333;      
 GPIOB->ODR|=1<<10|1<<9|1<<8;    //PB8 9 10输出1  
 
 
 Ex_NVIC_Config(GPIO_B,3,RTIR); //上升沿触发 XF
 MY_NVIC_Init(1,1,EXTI3_IRQChannel,2);    //抢占0,子优先级0,组2 PB3
 NVIC->ICER[0]|=1<<(EXTI3_IRQChannel);
 
 Ex_NVIC_Config(GPIO_B,4,FTIR);//下降沿触发  CFS S
 MY_NVIC_Init(1,2,EXTI4_IRQChannel,2);//抢占0,子优先级1,组2 PB4
 NVIC->ICER[0]|=1<<(EXTI4_IRQChannel);

 Ex_NVIC_Config(GPIO_B,7,RTIR); //上升沿触发  CFS X
 MY_NVIC_Init(1,3,EXTI9_5_IRQChannel,2); // PB6
 NVIC->ICER[0]|=1<<(EXTI9_5_IRQChannel); //关闭下阀,上阀和采集中断

// Ex_NVIC_Config(GPIO_A,12,RTIR); //上升沿触发  SF
// MY_NVIC_Init(1,0,EXTI15_10_IRQChannel,2); // Pa12
// NVIC->ICER[1]|=1<<(EXTI15_10_IRQChannel-32); //关闭下阀,上阀和采集中断
}

回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2012-5-23
在线时间
0 小时
 楼主| 发表于 2012-8-26 01:50:22 | 显示全部楼层
 // Ex_NVIC_Config(GPIO_A,12,RTIR); //上升沿触发  SF
// MY_NVIC_Init(1,0,EXTI15_10_IRQChannel,2); // Pa12
// NVIC->ICER[1]|=1<<(EXTI15_10_IRQChannel-32); //关闭下阀,上阀和采集中断
只要这个的第二句注解掉,一切正常,加上串口就无法工作。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-8-26 11:14:02 | 显示全部楼层
除了串口不正常,其他正常么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2012-5-23
在线时间
0 小时
 楼主| 发表于 2012-8-26 11:43:24 | 显示全部楼层
其它控制都挺正常的,对外部设备的控制如预期,不知道为什么
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2012-5-23
在线时间
0 小时
 楼主| 发表于 2012-8-26 12:10:24 | 显示全部楼层
发现在外部中断中启动定时器无效,定时器不启动。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-8-26 12:28:41 | 显示全部楼层
有没有JTAG?跟踪代码看一下.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2012-5-23
在线时间
0 小时
 楼主| 发表于 2012-8-26 14:58:39 | 显示全部楼层
有,但做样板的时候,没有做接口,只有做了串口通讯。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-8-26 17:14:10 | 显示全部楼层
悲剧了...
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 13:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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