welcom ! Handel home

2014年6月17日 星期二

STM32 之 UART Demo


                                                STM32
學習筆記之 UART 


//主要功能是把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)
        {
   
        }
    }
}

沒有留言: