新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于STM32微處理器的GPRS數據傳輸技術的研究

        基于STM32微處理器的GPRS數據傳輸技術的研究

        作者: 時間:2012-12-14 來源:網絡 收藏

        是意法半導體(ST)公司推出的ARM Cortex-M3內核的主流產品之一,它是ST公司專門針對要求高性能、低功耗和低成本的嵌入式應用而設計的,目前已在各領域得到廣泛的應用。SIM900A是SIMCom公司主推的一款緊湊型的GSM/雙頻模塊產品,它以性能穩定、外觀精巧及性價比高的優點深受廣大工程師青睞。
         本文通過對底層配置以及,介紹主要的底層配置,并著重介紹的實現。通過關鍵步驟的程序源代碼的介紹,闡述實現的細節以及注意事項。該方法對其他項目或芯片有一定的實現價值和參考價值,且簡單可靠,具有普遍性和通用性。
        1 STM32底層配置
         為了實現STM32單片機與SIM900A模塊之間的數據命令的傳輸,本文以串口為例,先搭建開發平臺,在工程中加入相應的庫函數以及配置文件,然后配置時鐘以及串口相應的輸入輸出GPIO接口。在配置的同時,需要針對自身的原理圖進行編寫,才能保證配置正確無誤。這樣,基本的開發平臺就搭建起來了。
        1.1 串口配置
         在開發平臺搭建起來之后,就可以對串口進行配置了。配置速率為115 200 b/s,字長為8 bit,1 bit停止位,串口模式為輸入與輸出模式,最后,初始化相對應的串口。初始化串口之后,打開串口的中斷響應函數,即USART_ITConfig(USART2,USART_IT_RXNE,ENABLE)(以串口2為例),然后使能相對應的串口,這樣串口函數就基本配置完成了。需要注意一點,有些程序可能在傳輸的時候出現首位丟失。這個問題涉及到USART的機制。硬件復位之后,USART的狀態位是置位的(置1,表示已經發送完畢),而此時數據可以進行正常發送。當一幀數據發送后,由硬件將該位置位。而清除TC位(置0)是由軟件來完成的,通過先讀USART_SR,再寫USART_DR將該位清除。但是程序在發送第一幀數據的時候,并沒有進行讀USART_SR,而是直接進行寫USART_DR,因此TC標志位還是置1,并沒有清除。當發送第一幀數據之后,用USART_GetFlagStatus()檢測狀態返回的是已經發送完畢,程序就會馬上發送下一幀數據,因此第一幀數據就會被第二幀數據覆蓋了,這樣就看不到首位數據。根據這種情況,可以在每次傳輸之前或之后清除傳輸完成標志位,即USART_ClearFlag(USART2,USART_FLAG_TC)。
        1.2 中斷配置
         配置完串口之后,將對NVIC進行配置。首次配置中斷分組,然后選擇串口的中斷,即NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQn(以所使用固件庫的定義為主)。
        再設置搶占式中斷優先級和響應式中斷優先級,然后使能中斷和初始化。以上的配置必須結合自身的情況,設計出最優的中斷分組和優先級,以保證程序響應中斷的速度。中斷后所做的內容在stm32f10x_it.c文件里配置,下文將會詳細闡述。
        2 實現細節
         實現數據傳輸的原理是:STM32解析一串數據或命令,然后通過串口或其他方式一個字符一個字符地發送給SIM900A模塊,SIM900A接收到數據之后再通過SIM卡發送到服務器。當SIM900A接收到數據時,立即響應中斷,按照中斷所設置的方式進行數據處理。此時,就需要通過發送檢驗和接收檢驗來控制數據的傳輸。
        2.1發送檢驗
         由于STM32逐個字符地將數據發送給SIM900A模塊,因此必須保證數據的正確性與連貫性。如果在發送的時候響應中斷或者進行任務調度,則發送將作廢,從而導致程序出錯,所以開發者必須警惕該類的錯誤出現。
         發送數據或者命令的時候,可以將數據通過參數傳給發送函數,由發送函數統一控制,發送完成之后再返回一個發送完成標志位,告知調用函數者發送已完成。源程序如下:
         void USART_Send_Byte(char MyData){ //發送字符函數
         USART_ClearFlag(USART2,USART_FLAG_TC);
         //清除標志位,如上所述
        USART_SendData(USART2,MyData);//發送數據
        while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);//等待發送完成
        }
        void USART_Send_Str(char*s){//發送字符串
         int i;
         int len = strlen(s)-1;//字符串長度
        for(int i=0;ilen;i++)
        USART_Send_Byte(s[i]);//循環將字符串發送出去
        if(s[i]==0x0a){//判斷發送是否結束
        SendCFFlag=TRUE;
        //如果為真,則發送完成標志位置為真
        }else{
        USART_Send_Byte(s[i]);//如果為假,則發送出去
        }
        }
        2.2 接收檢驗
         當SIM900A有數據返回或者有數據通過SIM900A接收到下位機時,STM32會立即響應中斷來接收數據。此時就要在中斷函數中進行一系列處理。以SIM900A為例,SIM900A模塊返回的命令都是以r+n+

        主站蜘蛛池模板: 景东| 阿巴嘎旗| 奈曼旗| 滦平县| 双桥区| 太白县| 五华县| 玛沁县| 江西省| 嘉兴市| 崇州市| 勐海县| 木里| 曲阳县| 汤原县| 河源市| 开平市| 红安县| 宣城市| 黄骅市| 大姚县| 钦州市| 兴和县| 昌都县| 政和县| 无极县| 潢川县| 中卫市| 烟台市| 霍林郭勒市| 凤山市| 栖霞市| 自贡市| 喀什市| 富裕县| 临海市| 阳西县| 成都市| 尼玛县| 县级市| 买车|