新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于STM32神舟系列開發(fā)板的串口通信源碼

基于STM32神舟系列開發(fā)板的串口通信源碼

作者: 時(shí)間:2016-11-27 來源:網(wǎng)絡(luò) 收藏
#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();//配置時(shí)鐘
GPIO_Config();//配置輸入輸出
USART_Config();//配置發(fā)送接收
//GPIO.Pin選擇待設(shè)置的 GPIO 管腳,使用操作符“| ”可以一次選中多個(gè)管腳。
Put_String("請(qǐng)發(fā)送數(shù)據(jù)_");
while(1)
{
while(1)
{
Put_String("請(qǐng)發(fā)送數(shù)據(jù)_");
if(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)==SET)
{
USART_SendData(USART2,USART_ReceiveData(USART2));
}
}
}
}
void RCC_Config(void)
{
ErrorStatus HSEStartUpStatus;//枚舉,失敗是0,成功1
RCC_DeInit();//寄存器設(shè)置為默認(rèn)值
RCC_HSEConfig(RCC_HSE_ON);//設(shè)置外部高速晶振 產(chǎn)生振蕩頻率
HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等它起振
if(HSEStartUpStatus == SUCCESS)
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);//RCC_SYSCLK_Div1——AHB時(shí)鐘=系統(tǒng)時(shí)鐘
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//設(shè)置時(shí)鐘源和頻率倍數(shù)
RCC_PLLCmd(ENABLE);//使能PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)//標(biāo)志位被重置?
{}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//把pll時(shí)鐘作為系統(tǒng)時(shí)鐘源
while(RCC_GetSYSCLKSource()!=0x08)//當(dāng)pll時(shí)鐘源!=8
{}
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);//使能這兩個(gè)外設(shè)時(shí)鐘(外圍總線
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; //復(fù)用推挽輸出
GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化外設(shè) 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; //波特率設(shè)置
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_InitStructure.USART_StopBits=USART_StopBits_1;//定義在幀的結(jié)尾傳輸一個(gè)停止位
USART_InitStructure.USART_Parity=USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //設(shè)置硬件控制流失能 因?yàn)橐呀?jīng)停止了
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;//數(shù)據(jù)低電平有效
//USART_InitStructure.USART_CPHA=USART_CPHA_2Edge;
USART_ClockInitStructure.USART_CPHA=USART_CPHA_2Edge;//時(shí)鐘相位
//USART_InitStructure.USART_LasrBit=USART_LastBit_Disable;
USART_ClockInitStructure.USART_LastBit=USART_LastBit_Disable; //在SCLK引腳上輸出最后發(fā)送的那個(gè)數(shù)據(jù)字的脈沖不從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)
{}
}
}


評(píng)論


技術(shù)專區(qū)

關(guān)閉