新手学习之路----使用STM32的USART与PC进行数据通信

2019-07-14 21:20发布

//题目:使用STM32的USART与PC进行数据通信,使用PC向STM32的USART发送一个字节,而后STM32将此数据传回给PC端,本程序算是成功了,但是有瑕疵
//问题1:..usermain.c(95): warning:  #177-D: variable "USART_ClockInitStructure" was declared but never referenced
//问题2:调试助手发送数据,但是调试助手窗口收不到数据,要关电源,再开启,调试助手窗口才收到数据
//问题3:..usermain.c(107): warning:  #1-D: last line of file ends without a newline


#include"stm32f10x_lib.h"               
/*自定义同义关键字                               
  自定义参数宏                                       
  自定义函数宏                                    
  自定义变量
  自定义函数声明*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(void);

/***********************
*函数名     :main       *输出参数:无
*函数描述   ;主函数     *返回值  ;无
输入参数    ;无
*************************/

int main(void)
{
  vu16 i=0;
  RCC_Configuration();//设置系统时钟
  GPIO_Configuration();//设置GPIO端口
  USART_Configuration();//设置USART
  while(1)
  {
    /*等待USART1接收数据完毕*/
        if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)
        {
          /*向串口发送接收到的数据*/
          USART_SendData(USART1,USART_ReceiveData(USART1));
          /*短暂延迟,保证首发稳定*/
          for(i=0;i<500;i++);
        }
  }
}

/***********************************
*函数名      ;RCC_Configuration         *输出结果;无
*函数描述    ;设置系统各部分时钟        *返回值  ;无
*输入参数    ;无
*********************************************/
void RCC_Configuration(void)
{
  ErrorStatus HSEStartUpStatus;                           //定义枚举类型变量HSEStartUpStatus
  RCC_DeInit();                                                           //复位系统时钟设置
  RCC_HSEConfig(RCC_HSE_ON);                                //开启HSE
  HSEStartUpStatus = RCC_WaitForHSEStartUp();        //等待HSE起振并稳定
  /*判断HSE起振是否成功,是则进入if()内部*/
  if(HSEStartUpStatus==SUCCESS)
  {
    RCC_HCLKConfig(RCC_SYSCLK_Div1);  //选择HCLK(AHB)时钟源为SYSCLK 1分频
        RCC_PCLK2Config(RCC_HCLK_Div1);           //选择PCLK2时钟源为HCLK(AHB)1分频
        RCC_PCLK1Config(RCC_HCLK_Div2);           //选择PCLK1时钟源为HCLK(AHB)2分频
        FLASH_SetLatency(FLASH_Latency_2);         //设置FLASH延时周期数为2
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//        使能Flash预取缓存
        //选择PLL时钟源为HSE 1分频,倍频数为9,则PLL=8MHZ*9=72MHZ
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
        RCC_PLLCmd(ENABLE);/*使能PLL*/
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//等待PLL输出稳定
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);                        //选着SYSCLK时钟为PLL
        while(RCC_GetSYSCLKSource()!=0x08);       
        }
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);
}

/***************************************
*函数名     ;GPIO_C onfiguration           *输出结果;无
*函数描述   ;设置各GPIO端口功能       *返回值   ;无
*输入参数   ;无
********************/

void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  /*设置USART的TX脚(PA.9)为第二功能推挽输出模式*/
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA,&GPIO_InitStructure);
  /*设置USART1的RX脚PA.10为浮空输入脚*/
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA,&GPIO_InitStructure);
}

/**********************************
*函数名     ;USART_Configuration      *输出结果;无
*函数描述   ;设置 USART1              *返回值  ;无
输入参数    ;无
*******************************/
void USART_Configuration(void)
{
  /*定义USART初始化结构体 USART_ InitStructure*/
  USART_InitTypeDef USART_InitStructure;
  /*定义USART初始化结构体USART_ClockInitStructure*/
  USART_ClockInitTypeDef USART_ClockInitStructure;
  /*波特率为9600,8位数据长度,1个停止位,无校验禁用硬件流控制,禁止USART时钟*/
  /*时钟极性低,在第二个边沿捕获数据,最后一位数据的时钟脉冲不重SCLK输出*/
  USART_InitStructure.USART_BaudRate=9600;
  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_Cmd(USART1,ENABLE);
  /*使能USART1*/
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。