請點選上面 免費關注...
首先總結一下序列槽232,422,485
序列槽232:可雙向傳輸,全雙工,最大速率20Kbps,負邏輯電平,-15V~-3V邏輯“1”, 3V~ 15V邏輯“0”。
序列槽422:可雙向傳輸,4線全雙工,2線單工。
序列槽485:可雙向傳輸,4線全雙工,2線單工,最大速率10Mb/s,差分信号,發送端: 2V~ 6V邏輯“1”,-2V~-6V邏輯“0”,接收端: 200mV邏輯“1”,-200mV邏輯“0”。
對于序列槽的實作有以兩個方案:
方案一,和原子的《例說STM32》一樣,首先接收,然後處理,沒有消息驗證處理,這樣就會出現消息覆寫,消息出錯後當機,無法明确區分指令,無法及時應答握手信号。方案二,借鑒uC/OSII的消息隊列,進入中斷服務函數之後,關閉中斷,接收資料,如果沒有資料接收,等待一段時間(時間和波特率有關)後開中斷,出中斷,然後在對接收到的資料進行處理,下面看代碼:
消息隊列及其初始化函數:
這樣就把資料一次性全部存儲下來了,剩下的就是對消息緩沖器message_buff[]中的消息進行處理了,這樣就解決了消息覆寫,消息出錯無法糾正的問題,至于消息怎麼處理就是依據不同的需求不同的處理,另外注意,握手信号好用定時器中斷。
## STM32的IO口基本操作 ##
1.初始化結構體
先來看下GPIO_InitTypeDef這個結構體,源代碼如下
結構體中包含了GPIO_Pin,GPIO_Speed和GPIO_Mode資訊,
GPIO_Pin在stm32f10x_gpio.h中有宏定義
剛好對應16個端口。
GPIO_Speed是一個枚舉類型的結構體,在stm32f10x_gpio.h中有宏定義:
當STM32的GPIO端口設定為輸出模式時,有三種速度可以選擇:2MHz、10MHz和50MHz,這個速度是指I/O口驅動電路的速度,是用來選擇不同的輸出驅動子產品,達到最佳的噪聲控制和降低功耗的目的。
高頻的驅動電路,噪聲也高,當你不需要高的輸出頻率時,請選用低頻驅動電路,這樣非常有利于提高系統的EMI性能。
當然如果你要輸出較高頻率的信号,但卻選用了較低頻率的驅動子產品,你很可能會得到失真的輸出信号。
關鍵是,GPIO的引腳速度跟應用比對。
比如對于序列槽,假如最大波特率隻需115.2k,那麼用2M的GPIO的引腳速度就夠了,既省電也噪聲小。
對于I2C接口,假如使用400k波特率,若想把餘量留大些,那麼用2M的GPIO的引腳速度或許不夠,這時可以選用10M的GPIO引腳速度。
對于SPI接口,假如使用18M或9M波特率,用10M的GPIO的引腳速度顯然不夠了,需要選用50M的GPIO的引腳速度。
GPIO_Mode也是一個枚舉類型的結構體:
2.設定系統時鐘
在使用端口前必須要開啟外設時鐘,在開啟外設時鐘前我們首先要配置好系統時鐘,系統時鐘的設定主要在庫函數SystemInit()中完成,在啟動檔案startup_stm32f10x_md.s中有如下一段代碼:
在調用main函數之前首先要調用SystemInit()函數,這個函數定義在system_stm32f10x.c中,函數原型為
該函數的主要功能是将配置時鐘相關的寄存器都複位為預設值,并調用
SetSysClock(void)函數,
對于SYSCLK_FREQ的宏定義在system_stm32f10x.c檔案開頭已經給出,預設的系統時鐘為72M,當然前提條件是外接8M晶振。
3.開啟外設時鐘
開啟或者關閉外設時鐘主要由以下函數設定
不同的外設調用不同的函數,如果使用了io的引腳複用功能除了開啟io功能時鐘還需要開啟複用功能時鐘,例如GPIOC的Pin4還可以作為ADC1的輸入引腳,當它作為ADC1來使用時,除了開啟GPIOC的時鐘外,還要開啟ADC1的時鐘
其他操作函數參看庫函數使用手冊。
本文轉自網絡,版權歸原作者,如果您覺得不好,請聯系我們删除!
↓點選下方
“閱讀原文”
檢視更多