打印
[STM32F1]

F103C8T6程序老是进串口中断?

[复制链接]
1513|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
it_yrj|  楼主 | 2014-6-10 23:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在串口初始化中开启了接收中断,通过调试助手给串口1发送一个字节之后就老是进入串口接收中断函数,可是在串口的中断函数中清除了接收中断标志位了啊,不知道这是怎么一回事啊?请大神们指点。
串口初始化代码:
void Uart1Init( uint32 Bps )
{
  OS_CPU_SR  cpu_sr;  
  OS_ENTER_CRITICAL();
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);
  GPIO_InitTypeDef GPIO_InitStructure;
  
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;      //PA8/RS485EN_1
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//输出
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOA,&GPIO_InitStructure);
  
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;      //PA9_uart1_TX
  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;                                                 //PA10 USART1_RX
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//悬空输入
  GPIO_Init(GPIOA,&GPIO_InitStructure);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//只有串口1 使用72M,其他串口使用36M
  USART_InitTypeDef USART_InitStructure;
//串口参数配置:9600,8,1,无奇偶校验,无硬流量控制 ,使能发送和接收
  USART_InitStructure.USART_BaudRate = Bps;                   //设置波特率
  USART_InitStructure.USART_WordLength = USART_WordLength_8b; //一帧中8个数据位
  USART_InitStructure.USART_StopBits = USART_StopBits_1;                        //一帧中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);                                           //初始化串口3
  
  USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);          //使能发送、接收中断
  USART_Cmd(USART1, ENABLE);                                     //使能串口2
  
//  St2Pt_EN();//RS485使能 ST输出到Pt  //发送模式
  Pt2St_EN();  //Rs485 使能PT输出到St  //接收模式
  OS_EXIT_CRITICAL();
}
void Uart1_SendByte(unsigned char dat)
{
  USART_SendData(USART1,dat);    //发送8位字符数据
  while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//查询发送数据寄存器空标志,等待发送完毕
}


沙发
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,与之相连的两个串口都出现了此种现象,难道真是转换芯片的问题

使用特权

评论回复
5
it_yrj|  楼主 | 2014-6-11 22:02 | 只看该作者
icecut 发表于 2014-6-11 10:24
把485芯片拆了.看效果.

我先接收一次,然后把芯片使能为发送试试

使用特权

评论回复
6
it_yrj|  楼主 | 2014-6-11 22:19 | 只看该作者
it_yrj 发表于 2014-6-11 22:02
我先接收一次,然后把芯片使能为发送试试

使485芯片在接收到一个字符之后改为发送状态,现象得到改善,但还是会进两次中断,第一次为想要的数据,第二次为“0x00”,怎么会这样呢?

使用特权

评论回复
7
guangbiao| | 2014-6-11 22:22 | 只看该作者
1、RX引脚如果没有外部上拉,就先把RX引脚设置为内部上拉,看看结果如何。。。
2、在串口接收中断中,除了清标志外,把数据也读出来。。。
3、以上都不行,用示波器看看RX线上的电平,正常情况下是高电平的,如果不是,检查一下电路,拆换一些元器件看看。。。

使用特权

评论回复
8
tianli1980| | 2014-6-12 10:38 | 只看该作者
不要用串口中断发送,串口只做接收中断。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

63

主题

614

帖子

0

粉丝