[STM32F1] F103C8T6程序老是进串口中断?

[复制链接]
1824|7
 楼主| it_yrj 发表于 2014-6-10 23:28 | 显示全部楼层 |阅读模式
在串口初始化中开启了接收中断,通过调试助手给串口1发送一个字节之后就老是进入串口接收中断函数,可是在串口的中断函数中清除了接收中断标志位了啊,不知道这是怎么一回事啊?请大神们指点。
串口初始化代码:
  1. void Uart1Init( uint32 Bps )
  2. {
  3.   OS_CPU_SR  cpu_sr;  
  4.   OS_ENTER_CRITICAL();
  5.   
  6.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);
  7.   GPIO_InitTypeDef GPIO_InitStructure;
  8.   
  9.   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;      //PA8/RS485EN_1
  10.   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//输出
  11.   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  12.   GPIO_Init(GPIOA,&GPIO_InitStructure);
  13.   
  14.   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;      //PA9_uart1_TX
  15.   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
  16.   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  17.   GPIO_Init(GPIOA,&GPIO_InitStructure);
  18.   
  19.   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;                                                 //PA10 USART1_RX
  20.   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//悬空输入
  21.   GPIO_Init(GPIOA,&GPIO_InitStructure);

  22.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//只有串口1 使用72M,其他串口使用36M
  23.   USART_InitTypeDef USART_InitStructure;
  24. //串口参数配置:9600,8,1,无奇偶校验,无硬流量控制 ,使能发送和接收
  25.   USART_InitStructure.USART_BaudRate = Bps;                   //设置波特率
  26.   USART_InitStructure.USART_WordLength = USART_WordLength_8b; //一帧中8个数据位
  27.   USART_InitStructure.USART_StopBits = USART_StopBits_1;                        //一帧中1个停止位
  28.   USART_InitStructure.USART_Parity = USART_Parity_No ;                                //一帧中无奇偶校验位
  29.   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//一帧中无硬件流校验
  30.   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//使能发送和接收模式
  31.   USART_Init(USART1, &USART_InitStructure);                                           //初始化串口3
  32.   
  33.   USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);          //使能发送、接收中断
  34.   USART_Cmd(USART1, ENABLE);                                     //使能串口2
  35.   
  36. //  St2Pt_EN();//RS485使能 ST输出到Pt  //发送模式
  37.   Pt2St_EN();  //Rs485 使能PT输出到St  //接收模式
  38.   OS_EXIT_CRITICAL();
  39. }
  1. void Uart1_SendByte(unsigned char dat)
  2. {
  3.   USART_SendData(USART1,dat);    //发送8位字符数据
  4.   while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//查询发送数据寄存器空标志,等待发送完毕
  5. }


mmuuss586 发表于 2014-6-11 08:50 | 显示全部楼层
你用的485芯片,是不是485芯片那边一直有数据,导致你程序一直进串口中断;
icecut 发表于 2014-6-11 10:24 | 显示全部楼层
把485芯片拆了.看效果.
 楼主| it_yrj 发表于 2014-6-11 22:01 | 显示全部楼层
mmuuss586 发表于 2014-6-11 08:50
你用的485芯片,是不是485芯片那边一直有数据,导致你程序一直进串口中断;
...

我用的AZRS485,与之相连的两个串口都出现了此种现象,难道真是转换芯片的问题
 楼主| it_yrj 发表于 2014-6-11 22:02 | 显示全部楼层
icecut 发表于 2014-6-11 10:24
把485芯片拆了.看效果.

我先接收一次,然后把芯片使能为发送试试
 楼主| it_yrj 发表于 2014-6-11 22:19 | 显示全部楼层
it_yrj 发表于 2014-6-11 22:02
我先接收一次,然后把芯片使能为发送试试

使485芯片在接收到一个字符之后改为发送状态,现象得到改善,但还是会进两次中断,第一次为想要的数据,第二次为“0x00”,怎么会这样呢?
guangbiao 发表于 2014-6-11 22:22 | 显示全部楼层
1、RX引脚如果没有外部上拉,就先把RX引脚设置为内部上拉,看看结果如何。。。
2、在串口接收中断中,除了清标志外,把数据也读出来。。。
3、以上都不行,用示波器看看RX线上的电平,正常情况下是高电平的,如果不是,检查一下电路,拆换一些元器件看看。。。
tianli1980 发表于 2014-6-12 10:38 | 显示全部楼层
不要用串口中断发送,串口只做接收中断。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

63

主题

615

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部