新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32 UART5 中斷接收程序

        STM32 UART5 中斷接收程序

        作者: 時間:2016-12-03 來源:網絡 收藏
        /*
        此函數是根據網上程序改寫,串口5采用中斷接收 收夠20個字符 就向PC 返回20個數字 詳見main函數和中斷函數
        */
        #include "stm32f10x_lib.h"
        unsigned char TxBuffer5[100] ;
        unsigned int i;
        unsigned int flag;
        /***************************************************
        * 函數名稱 :void RCC_Configuration()
        * 功能描述 : 復位和時鐘控制 配置
        * 參數 : 無
        * 返回值 : 無
        * 全局變量 : 無
        * 全局靜態變量: 無
        * 局部靜態變量: 無
        ***********************************************************/
        void RCC_Configuration()
        {
        ErrorStatus HSEStartUpStatus; //定義外部高速晶振啟動狀態枚舉變量
        RCC_DeInit(); //復位RCC外部寄存器到默認值
        RCC_HSEConfig(RCC_HSE_ON); //打開外部高速晶振
        HSEStartUpStatus=RCC_WaitForHSEStartUp(); //等待外部高速時鐘準備好
        if(HSEStartUpStatus==SUCCESS){ //外部高速時鐘已經準備好
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /*開啟FLASH預讀緩沖功能,加速FLASH的讀取。
        所有程序中必須的用法,位置:RCC初始化子函數里面,時鐘起振之后 */
        FLASH_SetLatency(FLASH_Latency_2); //FLASH時序延遲幾個周期,等待總線同步操作。推薦按照單片機系統運行頻率,0—24MHz時,取 //Latency=0;24—48MHz時,取Latency=1;48~72MHz時,取Latency=2。
        RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置AHB(HCLK)==系統時鐘/1
        RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(高速)(PCLK2)==系統時鐘/1
        RCC_PCLK1Config(RCC_HCLK_Div2); //配置APB1(低速)(PCLK1)==系統時鐘/2
        //注:AHB主要負責外部存儲器時鐘。APB2負責AD,I/O,高級TIM,串口1。APB1負責DA,USB,SPI,I2C,CAN,串口2345,普通TIM。
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //配置PLL時鐘==(外部高速晶體時鐘/1)* 9 ==72MHz
        RCC_PLLCmd(ENABLE); //使能PLL時鐘
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET); //等待PLL時鐘就緒
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //配置系統時鐘==PLL時鐘
        while(RCC_GetSYSCLKSource()!=0x08); //等待系統時鐘源的啟動
        }
        //------------------------以下為開啟外設時鐘的操作-----------------------//
        // RCC_AHBPeriphClockCmd (ABP2設備1 | ABP2設備2 , ENABLE); //啟動AHB設備
        // RCC_APB2PeriphClockCmd(ABP2設備1 | ABP2設備2 , ENABLE); //啟動ABP2設備
        // RCC_APB1PeriphClockCmd(ABP2設備1 | ABP2設備2 , ENABLE); //啟動ABP1設備
        // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1 , ENABLE); //打開APB2外設
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO
        |RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5,ENABLE);
        }
        /*********************************************
        * 函數名稱 : NVIC_Configuration(void)
        * 功能描述 : NVIC(嵌套中斷控制器)配置
        * 參數 : 無
        * 返回值 : 無
        * 全局變量 : 無
        * 全局靜態變量: 無
        * 局部靜態變量: 無
        ***********************************************/
        void NVIC_Configuration( )
        {
        NVIC_InitTypeDef NVIC_InitStructure; //定義一個中斷結構體
        // NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); //設置中斷向量表的起始地址為0x08000000
        // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //設置NVIC優先級分組,方式。
        //注:一共16個優先級,分為搶占式和響應式。兩種優先級所占的數量由此代碼確定,NVIC_PriorityGroup_x可以是0、1、2、3、4,
        //分別代表搶占優先級有1、2、4、8、16個和響應優先級有16、8、4、2、1個。規定兩種優先級的數量后,所有的中斷級別必須在其中選擇,
        //搶占級別高的會打斷其他中斷優先執行,而響應級別高的會在其他中斷執行完優先執行。
        NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQChannel; //通道設置為串口1中斷
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //中斷響應優先級0
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //打開中斷
        NVIC_Init(&NVIC_InitStructure); //初始化
        /* Enable the USART1 Interrupt
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);*/
        }
        /****************************************
        * 函數名稱 :GPIO_Configuration()
        * 功能描述 : GPIO配置
        * 參數 : 無
        * 返回值 : 無
        * 全局變量 : 無
        * 全局靜態變量: 無
        * 局部靜態變量: 無
        ****************************************/
        void GPIO_Configuration()
        {
        GPIO_InitTypeDef GPIO_InitStructure; //定義GPIO初始化結構體
        //--------將UART5 的TX 配置為復用推挽輸出 AF_PP---------------------//
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12; //管腳位置定義,標號可以是NONE、ALL、0至15。
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //輸出速度50MHz
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //推挽輸出模式 Out_PP
        GPIO_Init(GPIOC,&GPIO_InitStructure); //E組GPIO初始化
        //--------將USART1 的TX 配置為復用推挽輸出 AF_PP---------------------//
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        //--------將UART5 的RX 配置為復用浮空輸入 IN_FLOATING---------------------//
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2; //管腳位置定義
        //輸入模式下配置輸出速度無意義
        //GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz; //輸出速度2MHz
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空輸入 IN_FLOATING
        GPIO_Init(GPIOD,&GPIO_InitStructure); //C組GPIO初始化
        //--------將USART1 的RX 配置為復用浮空輸入 IN_FLOATING---------------------//
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        }
        /****************************************************
        * 函數名稱 :USART1_Configuration( )
        * 功能描述 : 配置USART1數據格式、波特率等參數
        * 參數 : 無
        * 返回值 : 無
        * 全局變量 : 無
        * 全局靜態變量: 無
        * 局部靜態變量: 無
        *******************************************************/
        void UART5_Configuration( )
        {
        USART_InitTypeDef USART_InitStructure; //串口設置恢復默認參數
        USART_InitStructure.USART_BaudRate = 115200; //波特率115200
        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; //無流控制
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //打開Rx接收和Tx發送功能
        /* Configure USART1 */
        //USART_Init(USART1, &USART_InitStructure);
        /* Configure UART5 */
        USART_Init(UART5, &USART_InitStructure); //初始化
        /* Enable USART1 Receive and Transmit interrupts */
        // USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
        // USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
        /* Enable UART5 Receive and Transmit interrupts */
        USART_ITConfig(UART5, USART_IT_RXNE, ENABLE); // 若接收數據寄存器滿,則產生中斷
        // USART_ITConfig(UART5, USART_IT_TXE, ENABLE);
        /* Enable the USART1 */
        // USART_Cmd(USART1, ENABLE);
        /* Enable the UART5 */
        USART_Cmd(UART5, ENABLE); //啟動串口
        //-----如下語句解決第1個字節無法正確發送出去的問題-----//
        USART_ClearFlag(UART5, USART_FLAG_TC); // 清標志
        // USART_ClearFlag(USART1, USART_FLAG_TC);
        }
        /********這是中斷服務子程序,在stm32f10x_it.c中************************ */
        void UART5_IRQHandler(void)
        {
        if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET) //若接收數據寄存器滿
        {
        TxBuffer5[i]=USART_ReceiveData(UART5);
        i++;
        }
        if(i==20)
        { flag=1;
        i=0;}
        // USART_SendData(UART5, USART_ReceiveData(UART5)); //回發給PC
        // while(USART_GetFlagStatus(UART5, USART_IT_TXE)==RESET);//等待發完
        }
        /*
        void delay(void)
        {
        unsigned int a,b;
        for(a=0;a<1000;a++)
        for(b=0;b<200;b++)
        } */
        /**************************************************
        * 函數名稱 :main()
        * 功能描述 : 主函數
        * 參數 : 無
        * 返回值 : 無
        * 全局變量 : 無
        * 全局靜態變量: 無
        * 局部靜態變量: 無
        ****************************************************/
        int main()
        {
        unsigned int j;
        RCC_Configuration();
        GPIO_Configuration();
        NVIC_Configuration( );
        UART5_Configuration();
        while(1){
        if(flag)
        {
        for(j=0;j<20;j++)
        {
        USART_SendData(UART5,j); //回發給PC
        while(USART_GetFlagStatus(UART5, USART_FLAG_TXE)==RESET);//等待發完 USART_IT_TXE
        }
        flag=0;
        }
        }
        }


        關鍵詞: STM32UART5中斷接

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 镇安县| 邵武市| 修水县| 普定县| 阳朔县| 吉林市| 毕节市| 徐州市| 扎赉特旗| 承德市| 西丰县| 高青县| 昭觉县| 普安县| 屏东市| 堆龙德庆县| 湘阴县| 东乡县| 凉城县| 甘肃省| 祁阳县| 郯城县| 临漳县| 嘉禾县| 松溪县| 浪卡子县| 咸丰县| 遵化市| 滕州市| 密山市| 祁东县| 社会| 威海市| 阿合奇县| 金坛市| 兴化市| 江永县| 湛江市| 龙门县| 雅江县| 靖远县|