新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于STM32神舟系列開發板的串口通信源碼

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

        作者: 時間:2016-11-27 來源:網絡 收藏
        #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("請發送數據_");
        while(1)
        {
        while(1)
        {
        Put_String("請發送數據_");
        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)
        {}
        }
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 铜山县| 灌云县| 武安市| 丰县| 玛曲县| 连城县| 平泉县| 青州市| 萨迦县| 二连浩特市| 云浮市| 边坝县| 双辽市| 汕头市| 峨边| 福海县| 酉阳| 唐海县| 寿光市| 宿松县| 宁武县| 镶黄旗| 鸡西市| 桃园县| 康马县| 苍山县| 新巴尔虎右旗| 封开县| 台中市| 凤台县| 尉犁县| 七台河市| 湘西| 颍上县| 罗江县| 特克斯县| 静安区| 平邑县| 武胜县| 凤山市| 苗栗市|