您的位置:控制工程论坛网论坛 » 嵌入式系统 » STM32学习笔记之 串口通讯

xilinxue

xilinxue   |   当前状态:在线

总积分:16186  2024年可用积分:0

注册时间: 2008-06-26

最后登录时间: 2020-03-22

空间 发短消息加为好友

STM32学习笔记之 串口通讯

xilinxue  发表于 2009/1/12 13:01:38      2100 查看 0 回复  [上一主题]  [下一主题]

手机阅读

参考开发板例子写的串口通讯的小程序。主要功能是把PC机发送的数据接收后再返回给PC机参数9600,8,1,N。

/************************************************************************
     Copyright (c) 2008 wormchen             
     All rights reserved            
文 件 名: main.c             
说    明: 串口发送接收数据 将PC端发来的数据返回给PC         
主要硬件: EMSTM32V1+miniSTMV100(外部8MRC)        
编译环境: MDK3.10             
当前版本: 1.0                     
************************************************************************/
#include

 

void RCC_Config(void);
void GPIO_Config(void);
void USART_Config(void);
void Put_String(u8 *p);

int main(void)
{
 RCC_Config();
 GPIO_Config();
 USART_Config();
 Put_String("\r\n请发送数据_\r\n");
 while(1)
 { 
  while(1)  
  {
   if(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == SET)
   {
     
      USART_SendData(USART2, USART_ReceiveData(USART2));
   }
  }   
 }
}
/*************************************************
函数: void RCC_Config(void)
功能: 配置系统时钟
参数: 无
返回: 无
**************************************************/
void RCC_Config(void)
{
 ErrorStatus HSEStartUpStatus;//定义外部高速晶体启动状态枚举变量
 RCC_DeInit();//复位RCC外部设备寄存器到默认值
 RCC_HSEConfig(RCC_HSE_ON); //打开外部高速晶振
 HSEStartUpStatus = RCC_WaitForHSEStartUp();//等待外部高速时钟准备好
 if(HSEStartUpStatus == SUCCESS)//外部高速时钟已经准别好
    {

   RCC_HCLKConfig(RCC_SYSCLK_Div1);//配置AHB(HCLK)时钟等于==SYSCLK
   RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(PCLK2)钟==AHB时钟
   RCC_PCLK1Config(RCC_HCLK_Div2);//配置APB1(PCLK1)钟==AHB1/2时钟
    
     
   RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
   //配置PLL时钟 == 外部高速晶体时钟*9

      RCC_PLLCmd(ENABLE);//使能PLL时钟
   while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) //等待PLL时钟就绪
       {
       }
      RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//配置系统时钟 = PLL时钟
  
      while(RCC_GetSYSCLKSource() != 0x08) //检查PLL时钟是否作为系统时钟
       {
       }
  }
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);
  //打开GPIOD和AFIO时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);//使能串口2时钟
}
/*************************************************
函数: void GPIO_Config(void)
功能: GPIO配置
参数: 无
返回: 无
**************************************************/
void GPIO_Config(void)
{
 //设置RTS(PD.04),Tx(PD.05)为推拉输出模式
 GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO初始化结构体
 GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);//使能GPIO端口映射USART2
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;//选择PIN4 PIN5
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //引脚频率50M
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//引脚设置推拉输出
 GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化GPIOD

 //配置CTS (PD.03),USART2 Rx (PD.06)为浮点输入模式
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_6;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
 GPIO_Init(GPIOD, &GPIO_InitStructure);
}
/*************************************************
函数: void USART_Config(void)
功能: USART配置
参数: 无
返回: 无
**************************************************/
void USART_Config(void)
{
 USART_InitTypeDef USART_InitStructure; //定义串口初始化结构体
 USART_InitStructure.USART_BaudRate = 9600;//波特率9600
 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;
 //禁用RTSCTS硬件流控制
 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//使能发送接收
 USART_InitStructure.USART_Clock = USART_Clock_Disable; //串口时钟禁止
 USART_InitStructure.USART_CPOL = USART_CPOL_Low; //时钟下降沿有效
 USART_InitStructure.USART_CPHA = USART_CPHA_2Edge;//数据在第二个时钟沿捕捉
 USART_InitStructure.USART_LastBit = USART_LastBit_Disable;
 //最后数据位的时钟脉冲不输出到SCLK引脚
 USART_Init(USART2, &USART_InitStructure);//初始化串口2
 USART_Cmd(USART2, ENABLE);//串口2使能
}
/*************************************************
函数: void Put_String(void)
功能: 向串口输出字符串
参数: 无
返回: 无
**************************************************/
void Put_String(u8 *p)
{
 while(*p)
 {
  USART_SendData(USART2, *p++);
  while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)
  {
   
  }
 }
}

1楼 0 0 回复