OpenEdv-开源电子网

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

STM32的usart2串口发送,串口助手收到的数据有错误的位???

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2013-12-15
在线时间
0 小时
发表于 2013-12-15 17:11:06 | 显示全部楼层 |阅读模式
用的固件库3.5,串口为Polling轮询式发送,为啥串口1可以正确接收到字符,串口2有对的有错的。高手帮忙给指点一下啊,啥原因啊?
程序如下: 
int main(void)
{   
  #ifdef DEBUG
    debug();
  #endif

  RCC_Configuration();
   /* Configure HCLK clock as SysTick clock source */
   SysTick_Config(72000); 
   GPIO_Configuration();   
 !  UARTx_Init(USART1, 9600, USART_Mode_Rx | USART_Mode_Tx);
   UARTx_Init(USART2, 9600, USART_Mode_Rx | USART_Mode_Tx); 
   LedShow_Init();

  /* Add your application code here */
      Delay_ms(5000);  
 
  /* Infinite loop */
  while (1)
  {
for (i=0; i<5; i++ )
{
        Uartx_SendChar(USART2, '5');
        GPIO_WriteBit(GPIOF, GPIO_Pin_6, 
     (BitAction)(1-(GPIO_ReadOutputDataBit(GPIOF, GPIO_Pin_6)))); 
     Delay_ms(1000);
     USARTx_SendString(USART1, "\r\nABCDEF\r\n");//
}  
  }
}

void RCC_Configuration(void)
{   
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/
  /* RCC system reset(for debug purpose)系统复位 */
  RCC_DeInit();

  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);

  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if(HSEStartUpStatus == SUCCESS)
  {
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);
 
    /* HCLK = SYSCLK 系统总线时钟*/
    RCC_HCLKConfig(RCC_SYSCLK_Div1); 
  
    /* PCLK2 = HCLK 高速外围总线时钟*/
    RCC_PCLK2Config(RCC_HCLK_Div1); 

    /* PCLK1 = HCLK/2 低速外围总线时钟*/
    RCC_PCLK1Config(RCC_HCLK_Div2);

    /* PLLCLK = 8MHz * 9 = 72 MHz 配置PLL时钟源和倍频因子*/
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

    /* Enable PLL */ 
    RCC_PLLCmd(ENABLE);

    /* Wait till PLL is ready 检查PLL是否就绪*/
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }

    /* Select PLL as system clock source 选择PLL时钟作为系统时钟源*/
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
                     RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |
                     RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF |
 RCC_APB2Periph_GPIOG | RCC_APB2Periph_AFIO  |
 RCC_APB2Periph_TIM1  | RCC_APB2Periph_USART1, ENABLE);

  /* 打开APB1总线上的USART2时钟 */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
}

void GPIO_Configuration(void)
{
    GPIO_InitTypeDef    GPIO_InitStructure;     //结构体 初始化
    /* Configure USART1 Tx (PA.09) as alternate function push-pull */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //采用的115200波特率,所以10MHz够了,降低功耗
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* Configure USART2 Tx (PA.02) as alternate function push-pull */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);  
  
   /* Configure USART2 Rx (PA.10) as input floating */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

   /* Configure USART2 Rx (PA.03) as input floating */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

   /* Configure LED1, LED2, LED3, LED4(PF.06,07,08,09) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;//GPIO_Pin_All; 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //模拟输入 GPIO_Mode_Out_PP GPIO_Mode_AIN  
GPIO_Init(GPIOF, &GPIO_InitStructure);

}

void  UARTx_Init(USART_TypeDef * USARTx, uint32_t BAUD, uint16_t MODE)
{
USART_InitTypeDef USART_InitStructure;
USART_ClockInitTypeDef  USART_ClockInitStructure;

    /* 将结构体设置为缺省状态Configure the USARTx Default paramters */
    USART_ClockInit(USARTx, &USART_ClockInitStructure); 
    USART_StructInit(&USART_InitStructure); 

/* USARTx mode config */
USART_InitStructure.USART_BaudRate = BAUD;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位
USART_InitStructure.USART_Parity = USART_Parity_No;        //奇偶校验Even
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流控制
USART_InitStructure.USART_Mode = MODE;
USART_Init(USARTx, &USART_InitStructure);

    /* Configure the USARTx synchronous paramters */
    USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
    USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;  //High
    USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
    USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
    USART_ClockInit(USARTx, &USART_ClockInitStructure);
//USART_ITConfig(USARTx, USART_IT_TXE, ENABLE); //TXE发送中断,TC传输完成中断,RXNE接收中断,PE奇偶错误中断,可以是多个
/* 使能USART外设 */ 
    USART_Cmd(USARTx, ENABLE);
}

void LedShow_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* Configure LED1,LED2,LED3 and LED4 (PF.06, PF.07, PF.08, and PF.09 )as Out Push_Pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOF, &GPIO_InitStructure);
}

unsigned char Uartx_SendChar(USART_TypeDef* USARTx, unsigned char ch)
{

    USART_ClearFlag(USARTx,USART_FLAG_TC);//USART_GetFlagStatus(USARTx,USART_FLAG_TC); //清除发送完成标志位
    USART_SendData(USARTx,(unsigned char) ch);
    while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET ); //等待发送完成。   检测 USART_FLAG_TC 是否置1;
    //USART_ClearFlag(USARTx,USART_FLAG_TC);
    return ch;
}
 
void USARTx_SendString(USART_TypeDef* USARTx, unsigned char * str)
{
  //USART_ClearFlag(USARTx,USART_FLAG_TC); //清除发送完成标志位 TC,即Transmission Complete
  while(*str)
  {
    USART_SendData(USARTx,*str++);
while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);
  }



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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165537
金钱
165537
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-15 23:37:19 | 显示全部楼层
波特率多少?
跟踪一下代码看看吧。
串口2的时钟是串口1的一半了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-15 03:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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