基於STM32神舟系列開發板的串口通…

#include "stm32f10x.h"
#include "stm32f10x_usart.h"

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

int main()
{
 RCC_Config();//配置時鐘
 GPIO_Config();//配置輸入輸出
 USART_Config();//配置發送接收
//GPIO.Pin選擇待設置的 GPIO 管腳,使用操作符“| ”可以一次選中多個管腳。
 Put_String("\r\n請發送數據_\r\n");
 while(1)
 {
  while(1)
  {
   Put_String("\r\n請發送數據_\r\n");
   if(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)==SET)
   {
    USART_SendData(USART2,USART_ReceiveData(USART2));
   }
  }
 }
}

void RCC_Config(void)
{
 ErrorStatus HSEStartUpStatus;//枚舉,失敗是0,成功1
 RCC_DeInit();//寄存器設置爲默認值
 RCC_HSEConfig(RCC_HSE_ON);//設置外部高速晶振  產生振盪頻率
 HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等它起振
 if(HSEStartUpStatus == SUCCESS)
 {
  RCC_HCLKConfig(RCC_SYSCLK_Div1);//RCC_SYSCLK_Div1——AHB時鐘=系統時鐘
  RCC_PCLK2Config(RCC_HCLK_Div1);
  RCC_PCLK1Config(RCC_HCLK_Div2);
  RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//設置時鐘源和頻率倍數
  RCC_PLLCmd(ENABLE);//使能PLL
  while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)//標誌位被重置?
  {}
  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//把pll時鐘作爲系統時鐘源
  while(RCC_GetSYSCLKSource()!=0x08)//當pll時鐘源!=8
  {}
 }
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);//使能這兩個外設時鐘(外圍總線)
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
}

void GPIO_Config(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;
 //GPIO_PinRemapConfig(GPIO_Remap_USART2,ENABLE);
 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_5;//選中2,5引腳
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //複用推輓輸出
 GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化外設 GPIOx 寄存器
 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_6;
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;/////////
 GPIO_Init(GPIOA,&GPIO_InitStructure);//再初始化寄存器
}

void USART_Config(void)
{
 USART_InitTypeDef USART_InitStructure;
 
 USART_ClockInitTypeDef USART_ClockInitStructure;
 USART_InitStructure.USART_BaudRate = 115200; //波特率設置
 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_InitStructure.USART_Clock=USART_Clock_Disable;
 USART_ClockInitStructure.USART_Clock=USART_Clock_Disable;
 //USART_InitStructure.USART_CPOL=USART_CPOL_Low;
 USART_ClockInitStructure.USART_CPOL=USART_CPOL_Low;//數據低電平有效
 //USART_InitStructure.USART_CPHA=USART_CPHA_2Edge;
 USART_ClockInitStructure.USART_CPHA=USART_CPHA_2Edge;//時鐘相位 
 
 //USART_InitStructure.USART_LasrBit=USART_LastBit_Disable;
 USART_ClockInitStructure.USART_LastBit=USART_LastBit_Disable; //在SCLK引腳上輸出最後發送的那個數據字的脈衝不從SCLK輸出
 USART_Init(USART2,&USART_InitStructure);
 USART_Cmd(USART2,ENABLE);
}

void Put_String(u8 *p)
{
 while(*p)
 {
  USART_SendData(USART2,*p++);
  while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET)
  {}
 }
}

發佈了36 篇原創文章 · 獲贊 65 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章