STM32F103VET6 火牛开发板串口1收发数据出错

[复制链接]
4814|8
 楼主| zys230719 发表于 2012-7-23 14:19 | 显示全部楼层 |阅读模式
问题现象描述:在使用STM32F103VET6串口1,要求中断接收到数据后立即返回接收到的数据。用上位机串口
调试助手发送数据,一个字节一个字节(例如一次只发0x55)发送,上位机可以正确接收
数据(0x55)。但是如果一次发多个数据(例如发送0x55 0x66 0x77),上位机收到的数据
是乱码。请高手指教问题可能原因。
下面是相关代码:
void USART1_Init(u16 Baudrate)
{
  USART_InitTypeDef USART_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;              //定义一个结构体
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA , ENABLE);  
//******************************************************************************
//串口1所使用管脚输出输入定义
//******************************************************************************
//定义UART1 TX (PA.09)脚为复用推挽输出
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;         //IO口的第九脚
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //IO口复用推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);            //初始化串口1输出IO口
  // 定义 USART1 Rx (PA.10)为悬空输入
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;           //IO口的第十脚
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//IO口悬空输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);               //初始化串口1输入IO口
   
//******************************************************************************
    //串口1参数初始化定义部分,串口1参数为00 , 8 ,1 ,N  接收中断方式
//*****************************************************************************  
  USART_InitStructure.USART_BaudRate = Baudrate; //设定传输速率
  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);  //初始化串口1
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  //使能串口1接收中断
  USART_Cmd(USART1, ENABLE);  //使能串口1
  
   //使能串口1中断,
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);   
}

/************************************************************
//------------------------USART1接收中断函数------------------------
**************************************************************/
void USART1_IRQHandler(void)
{     
    if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)
    {               
  SciReceive1_Buffer[SciReceiveBuffer1_id] = USART_ReceiveData(USART1);
  Usart1_PutChar(USART_ReceiveData(USART1)); //收到的值返回
  if(++SciReceiveBuffer1_id>=100) {SciReceiveBuffer1_id = 0 ;}
}
}
同样的程序,将USART1更改为USART2后一切正常。但USART1就是不行。
硬件环境为火牛开发板STM32F103VET6。软件设置波特率9600。
请高手指点可能原因。
伐多2011 发表于 2012-7-23 14:29 | 显示全部楼层
楼主,你的发送函数呢?发送的时候有没有等待数据发送完成哦?
figo20042005 发表于 2012-7-23 14:30 | 显示全部楼层
定义 USART1 Rx (PA.10)为上拉输入
试试看
伐多2011 发表于 2012-7-23 14:43 | 显示全部楼层
楼主,你可以参考一些我写的,
  1. /***********************************
  2. 该初始化为串口2的初始化(包括管脚跟时钟),初始化只含发送,接受的
  3. 未弄,USART2_TX(PA2),USART2_RX(PA3)
  4. ************************************/
  5. void USART2_Init(u32 Buand)
  6. {
  7.          RCC->APB1ENR |= BIT(17);//开启USART2时钟
  8.          RCC->APB2ENR |= BIT(2); //使能GPIOA时钟

  9.          //此IO口初始化只针对USART2
  10.          /****************************************************************
  11.          模拟输入模式              0               浮空输入模式                     4
  12.          上拉/下拉输入模式               8              保留                       C
  13.          通用推挽输出模式(50M)   3                  通用开漏输出模式(50M)         7
  14.          复用推挽输出模式(50M)   B                  复用开漏输出模式(50M)         F
  15.           ****************************************************************/
  16.          GPIOA->CRL   &= 0XFFFF00FF;
  17.          GPIOA->CRL   |= 0x00000B00;//复用推挽输出,50M,USART2_TX(PA2)
  18.          GPIOA->CRL   |= 0X00008000;//上拉输入USART2_RX(PA3)
  19.          
  20.          //设置波特率
  21.          switch(Buand)
  22.          {
  23.             case 2400:     USART2->BRR =0x3A98;break;
  24.                  case 9600:     USART2->BRR =0xEA6; break;
  25.                  case 19200:    USART2->BRR =0x753; break;
  26.                 case 57600:    USART2->BRR =0x271; break;
  27.                 case 115200:   USART2->BRR =0x138; break;
  28.                 case 230400:   USART2->BRR =0x9C;  break;
  29.          }

  30.          USART2->CR1  &=~BIT(12);//一个起始位,8位数据位
  31.          USART2->CR1  &=~BIT(10);//禁止校验
  32.          USART2->CR2  &=~(BIT(13)|BIT(12));//一个停止位
  33.          USART2->CR3  &=~BIT(3);//全双工模式

  34.          USART2->CR1  |= BIT(3)|BIT(2);//发送使能,接收使能
  35.          USART2->CR1  |= BIT(13);//USART使能
  36. },void USART2_SendData(u8 data)
  37. {
  38.         while(!(USART2->SR &0x40));//等待数据发送完成
  39.         USART2->DR = data;
  40. }
捡漏王子 发表于 2012-7-23 16:27 | 显示全部楼层
 楼主| zys230719 发表于 2012-7-27 15:40 | 显示全部楼层
故障已经排除。
排除过程:更换自己设计的电路板,程序不动。数据收发正常。
结论:程序本身问题不大。估计开发板某处没设置正确或者开发板本身有问题。
 楼主| zys230719 发表于 2012-7-27 15:41 | 显示全部楼层
2# 伐多2011
 楼主| zys230719 发表于 2012-7-27 15:42 | 显示全部楼层
程序本身没问题。应该是开发板硬件存在问题,或者我没用好。
更换到自己设计的电路板上,数据收发正常。
lwyjw 发表于 2012-7-30 21:37 | 显示全部楼层
谢谢楼主
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

11

帖子

0

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