色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于STM32微處理器的GPRS數(shù)據(jù)傳輸技術(shù)的研究

          基于STM32微處理器的GPRS數(shù)據(jù)傳輸技術(shù)的研究

          作者: 時(shí)間:2012-12-14 來(lái)源:網(wǎng)絡(luò) 收藏

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