OpenEdv-开源电子网

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

STM32 USART1中断进不了串口 别的中断都可以进去,就是USART1_IRQn进不去????请高手解决!!!

[复制链接]

2

主题

9

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2012-5-5
在线时间
0 小时
发表于 2013-9-28 02:59:45 | 显示全部楼层 |阅读模式

 STM32   USART1中断进不了串口 别的中断(外部)都可以进去,就是USART1_IRQn进不去
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

 不加这句不卡NVIC_Init(&NVIC_InitStructure);
加上这句就卡住不动了.
????请高手解决!!!

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-28 09:48:34 | 显示全部楼层
估计是你的串口中断服务函数没有。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2012-5-5
在线时间
0 小时
 楼主| 发表于 2013-9-28 10:36:00 | 显示全部楼层
void USART1_IRQHandler(void)                 //串口1中断服务程序
{
u8 Res;

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
 printf("iojwfo\r\n");
// 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;//接收数据错误,重新开始接收
// }
// }
// }
     }
}

有中断服务函数 还是卡到这不动
回复 支持 反对

使用道具 举报

9

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2013-9-24
在线时间
0 小时
发表于 2013-9-28 11:18:44 | 显示全部楼层
把Printf 去掉试试
人需要沐浴阳光,也必将经历风雨
回复 支持 反对

使用道具 举报

9

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2013-9-24
在线时间
0 小时
发表于 2013-9-28 11:20:34 | 显示全部楼层
而且你根本没清中断标志位
USART_ClearFlag(USART1,USART_FLAG_RXNE);
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
人需要沐浴阳光,也必将经历风雨
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2012-5-5
在线时间
0 小时
 楼主| 发表于 2013-9-28 12:13:50 | 显示全部楼层
我按你说的做了,可是还是不行!!!
回复 支持 反对

使用道具 举报

9

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2013-9-24
在线时间
0 小时
发表于 2013-9-28 12:38:41 | 显示全部楼层
能否贴USART初始化程序和中断程序看看
人需要沐浴阳光,也必将经历风雨
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2012-5-5
在线时间
0 小时
 楼主| 发表于 2013-9-28 12:40:28 | 显示全部楼层
你给我你的邮箱,你帮我看看,我调了好久调不出来!!!
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2012-5-5
在线时间
0 小时
 楼主| 发表于 2013-9-28 12:40:59 | 显示全部楼层
我把我的程序发给你!
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2012-5-5
在线时间
0 小时
 楼主| 发表于 2013-9-28 12:41:43 | 显示全部楼层
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "stm32f10x_it.h"
#include <stdio.h>

#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define UTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define UTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */

/* rivate function prototypes -----------------------------------------------*/
void USART_Configuration(void);
void NVIC_Configuration(void);
   
/*******************************************************************************
* Function Name: main
* Description : Main program
* Input       : None
* Output      : None
* Return      : None
* Attention : None
*******************************************************************************/
u8 USART_RX_BUF[64];     //接收缓冲,最大64个字节.
//接收状态
//bit7,接收完成标志
//bit6,接收到0x0d
//bit5~0,接收到的有效字节数目
u8 USART_RX_STA=0;       //接收状态标记

int main(void)
{
USART_Configuration();
NVIC_Configuration();
    printf("*****************************************************************\r\n");
    printf("*                                                               *\r\n");
    printf("*  Thank you for using HY-RedBull V3.0 Development Board ! ^_^  *\r\n");
    printf("*                                                               *\r\n");
    printf("*****************************************************************\r\n");
    printf("\r\nPlease input any word:\r\n");
    /* Infinite loop */
    while (1){
    u8 len,t;

/* Loop until RXNE = 1 */
//        while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
//   USART_SendData(USART1,USART_ReceiveData(USART1));
  if(USART_RX_STA&0x80)
{    
len=USART_RX_STA&0x3f;            //得到此次接收到的数据长度
printf("\n您发送的消息为:\n");
for(t=0;t<len;t++)
{
USART1->DR=USART_RX_BUF[t];
while((USART1->SR&0X40)==0);  //等待发送结束
}
printf("\n\n");//插入换行
USART_RX_STA=0;
}
printf("\n123124324123423:\n");
    }
}


/*******************************************************************************
* Function Name: USART_Configuration
* Description : Configure USART1 
* Input       : None
* Output      : None
* Return      : None
* Attention : None
*******************************************************************************/
void USART_Configuration(void)

  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure; 
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO,ENABLE);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  /*
  *  USART1_TX -> A9 , USART1_RX -> PA10
  */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;          
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
  GPIO_Init(GPIOA, &GPIO_InitStructure);    

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;         
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  USART_InitStructure.USART_BaudRate = 115200;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;



  USART_Init(USART1, &USART_InitStructure); 
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
  USART_ClearFlag(USART1,USART_FLAG_TC);
  USART_Cmd(USART1, ENABLE);
}



void NVIC_Configuration(void)

  NVIC_InitTypeDef NVIC_InitStructure;

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2012-5-5
在线时间
0 小时
 楼主| 发表于 2013-9-28 12:42:28 | 显示全部楼层
/* Includes ------------------------------------------------------------------*/
/* Uncomment the line below to enable peripheral header file inclusion */
/* #include "stm32f10x_adc.h" */
   #include "stm32f10x_bkp.h" 
/* #include "stm32f10x_can.h" */
   #include "stm32f10x_cec.h"
   #include "stm32f10x_crc.h" 
/* #include "stm32f10x_dac.h" */
   #include "stm32f10x_dbgmcu.h"  
/* #include "stm32f10x_dma.h" */
   #include "stm32f10x_exti.h" 
/* #include "stm32f10x_flash.h" */
/* #include "stm32f10x_fsmc.h" */
   #include "stm32f10x_gpio.h"
/* #include "stm32f10x_i2c.h"*/
/* #include "stm32f10x_iwdg.h" */
    #include "stm32f10x_pwr.h"  
   #include "stm32f10x_rcc.h"
/* #include "stm32f10x_rtc.h" */
/* #include "stm32f10x_sdio.h" */
/* #include "stm32f10x_spi.h" */
/* #include "stm32f10x_tim.h" */
   #include "stm32f10x_usart.h"
/* #include "stm32f10x_wwdg.h" */
   #include "misc.h" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2012-5-5
在线时间
0 小时
 楼主| 发表于 2013-9-28 13:18:49 | 显示全部楼层
解决了!!!!
LOVE_FYD 太厉害了!!!!!这是他给解决的程序!
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
  {
  USART_ClearFlag(USART1,USART_FLAG_RXNE); 
  USART_ClearITPendingBit(USART1, USART_IT_RXNE);

  Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
     printf("iojwfo\r\n");
  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;//接收数据错误,重新开始接收
     }
    }
   }
     }
}

还有把发送中断使能注释掉   
USART_InitStructure.USART_BaudRate = 115200;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  USART_Init(USART1, &USART_InitStructure); 

  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
 // USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
  //USART_ClearFlag(USART1,USART_FLAG_TC);
  USART_Cmd(USART1, ENABLE);
回复 支持 反对

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2013-10-4
在线时间
4 小时
发表于 2013-10-5 19:02:14 | 显示全部楼层
回复【12楼】lzw3218:
---------------------------------
可是我试了一下,不清除中断标志(USART_ClearFlag(USART1,USART_FLAG_RXNE);  
  USART_ClearITPendingBit(USART1, USART_IT_RXNE); 不要这2句)也可以发送数据。这是怎么回事?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2014-4-28
在线时间
0 小时
发表于 2014-4-28 22:02:41 | 显示全部楼层
回复【12楼】lzw3218:
---------------------------------有个不情之请,,我现在用的是正点的现在的程序,和你贴的有点出入,但不知道怎么改,大致都是一样的,也碰到了无法进入接收中断的问题,能否吧整个project发我一份,,不甚感激。。943051071@qq.com,,谢谢。。。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2014-5-29
在线时间
0 小时
发表于 2014-5-29 19:07:33 | 显示全部楼层
回复【12楼】lzw3218:
---------------------------------
没看明白,你们是啥解决的问题,我目前在调一个程序,也是进不了中断,所以想参考一下你们的程序,如果不麻烦,请把代码发给lzf048518@sohu.com
回复 支持 反对

使用道具 举报

4

主题

12

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2014-4-3
在线时间
0 小时
发表于 2015-5-22 22:57:59 | 显示全部楼层
其实只要把发送中断使能去掉就可以进入接受中断,我不知道为什么?原子哥请解释
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-22 23:23:03 | 显示全部楼层
回复【16楼】moon20704:
---------------------------------
看看是不是冲突了,你进入发送中断,没有清发送中断标志。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-2-2
在线时间
0 小时
发表于 2015-7-27 11:26:25 | 显示全部楼层
回复【17楼】正点原子:
---------------------------------
原子兄,今天看到您USART文件夹中的串口中断服务程序(如下),有个疑问。假设发送到串口的数据包含了一个以上的0x0D,例如0x01,0x0D,0x03,0x04,0x0D,0x05,0x0D,0x0A,那么通过这段程序接收到的有效数据也就只有0x05了,也就是不允许一段数据中出现两个或以上0x0D,是这样吗?
void USART1_IRQHandler(void)                 //串口1中断服务程序
{
u8 Res;
#ifdef OS_TICKS_PER_SEC   //如果时钟节拍数定义了,说明要使用ucosII了.
OSIntEnter();    
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据

if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else USART_RX_STA|=0x8000; //接收完成了 
}
else //还没收到0X0D
{
if(Res==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收   
}  
}
}     
  } 
#ifdef OS_TICKS_PER_SEC   //如果时钟节拍数定义了,说明要使用ucosII了.
OSIntExit();    
#endif

#endif
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-7-27 23:23:26 | 显示全部楼层
回复【18楼】YouDream:
---------------------------------
是的,所以不适合你这种数据的接收。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

14

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2015-8-4
在线时间
39 小时
发表于 2015-8-4 10:09:05 | 显示全部楼层
回复【10楼】lzw3218:
---------------------------------
对于这个,到底是什么问题呢?我也遇到了,而且我只开启接收中断,依然不能进入中断程序
回复 支持 反对

使用道具 举报

14

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2015-8-4
在线时间
39 小时
发表于 2015-8-4 10:11:52 | 显示全部楼层
回复【5楼】LOVE_FYD:
---------------------------------
接收中断标志位能在读取完接收数据后自动清除吗?
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2016-4-29
在线时间
20 小时
发表于 2016-6-19 17:39:23 | 显示全部楼层
楼主解决了吗
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-7-1
在线时间
0 小时
发表于 2016-7-1 12:55:37 | 显示全部楼层
hblgxy 发表于 2015-8-4 10:09
回复【10楼】lzw3218:
---------------------------------
对于这个,到底是什么问题呢?我也遇到了, ...

你好,我在调试stm32 F401 spi2 使用DMA接收,能接收到数据,但是就是不进入DMA中断,这是为什么呢,谢谢
回复 支持 反对

使用道具 举报

6

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2016-12-14
在线时间
37 小时
发表于 2017-1-23 14:29:16 | 显示全部楼层
hblgxy 发表于 2015-8-4 10:09
回复【10楼】lzw3218:
---------------------------------
对于这个,到底是什么问题呢?我也遇到了, ...

你有没有解决?我也碰到了同样的问题
回复 支持 反对

使用道具 举报

yxl167083 该用户已被删除
发表于 2017-4-6 11:03:15 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

8

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2018-6-21
在线时间
31 小时
发表于 2019-4-24 17:22:51 | 显示全部楼层
hblgxy 发表于 2015-8-4 10:11
回复【5楼】LOVE_FYD:
---------------------------------
接收中断标志位能在读取完接收数据后自动清除吗 ...

请问解决了吗 我遇到和你一样的问题
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2020-7-21
在线时间
3 小时
发表于 2020-8-16 13:47:42 | 显示全部楼层
zzzgx 发表于 2019-4-24 17:22
请问解决了吗 我遇到和你一样的问题

请问你这个问题解决了吗?
我现在也遇到中断进入不了的问题,不用中断,串口读写都没问题,用中断没反应
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 13:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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