STM32F407ZGT6串口


1、RS485:半雙工通信方式。

2、RS232C:對應DB25接口,要注意RS232才對應DB9接口(采用負邏輯:普遍記為“高電平-3~-15”、“低電平+3~+15”;但是根據我的實踐來看,采用以上范圍記憶的辦法,到你真正需要使用然后回憶起來的時候往往會記混,所以只需要記為:負邏輯、高-9、低+9)。電腦上位機使用RS232電平時需要通過max3232芯片轉換成TTL電平接入單片機中。

  另外,原本只是知道網線有分直連線和交叉線,原來RS232也有。。。RS232通信線兩端分別為:一公一母(直連線:電腦主機和單片機通信(也就是不同類型機器之間通信))、兩頭相同(交叉線:兩台電腦主機間通信(也就是同類型機器之間通信));

  說到這里還想起了一開始認VGA接口的時候頭腦里沒有印象,實際上可以看看電腦主機背后三排針腳的那個接口就是(實際對應連接電腦屏幕線)。

3、串口通信只使用TX、RX、GND的情況下,一般就是異步串行通信了,因為沒有使用時鍾線將通信雙方進行連接,構不成同步通信,這也就是為什么異步情況下必須規定好兩端波特率要一致的緣故了。

4、串口通信配置步驟:

1)使能端口和串口時鍾:

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

2)設置引腳復用映射:GPIO_PinAFConfig();

3)初始化端口和串口參數:GPIO_Init();  USART_Init();

4)使能串口和串口中斷:USART_Cmd();  USART_ITConfig();

備注:初始化過程中一般還會對串口中斷標志清除一下,避免以前使用過程產生串口中斷將標志位置位帶來的影響

使用USART_ClearFlag()或者USART_ClearITPendingBit(),前者用在開啟中斷之前進行標志位清除,后者則是在開啟了中斷使能以后進行清除

5)設置串口中斷優先級:NVIC_Init();

6)編寫串口中斷服務程序:

5、串口通信編程步驟:

1)添加庫函數底層串口驅動源文件stm32f4xx_usart.c,點擊編譯,使頭文件自動添至工程中(這一步工作能有效避免編寫過程中想要右鍵go to definition了但跳轉不過去的問題):

 

 

2)新建用戶串口驅動源文件usart.c和頭文件usart.h,保存至公用文件夾Public(因為封裝好的GPIO位帶操作system.c、封裝好的延時函數SysTick.c、還有目前的串口,是不同項目、不同工程都需要使用到的東西,所以不放到用戶驅動文件夾App中),這里為了操作方便就沒有再建子文件夾:

 

 

3)點擊左上角品字圖標,將usart.c添加到工程中:

 

 

4)點擊左上角魔術棒,將usart.h包含到工程頭文件路徑中:

 

 

5)在usart.h中編寫防止重復包含格式(格式來源參考任意一個庫函數底層驅動文件,譬如stm32f4xx_gpio.h),因為stm32f4xx.h基本都會用到,所以也要包含進來:

 

 

 

 

6)在usart.c中包含usart.h:

 

 

7)在main.c中將usart.h包含進來,到這里完成工程框架搭建,然后點擊編譯:

 

 

8)按“4、串口通信配置步驟:”中的內容執行,以下提示關鍵要點:

8-1)將配置步驟記住、背下來,這一步很重要。

8-2)使用函數需要知道參數,但不知道有什么可選項,右鍵該函數點擊go to definition,然后查看斷言內容,譬如:assert_param(IS_RCC_AHB1_CLOCK_PERIPH(RCC_AHB1Periph)); 

  其中assert_param()就是斷言機制,主要用來檢查傳入參數的合法性。但我們編程主要是使用IS_RCC_AHB1_CLOCK_PERIPH()這一項,一般規律是:在IS_XXX_XXX()上右鍵繼續go to definition,然后就能看到對應參數的可選項了,這個技巧是經常使用到的。

   學到以上基本操作之后,你會發現有時候函數的確有這個參數,但是當你跳到函數里頭去會發現沒有參數的斷言,如此一來不就沒有參數可選項入口了嗎?所以你需要做的就是,在往后的編程過程中積累這種不常見例子,然后把你最終是如何找到參數可選項的步驟背下來,下面我也舉一些示例:

示例一:GPIO_Init()函數的結構體GPIO_InitStruct中,你會發現其它成員GPIO_Pin、GPIO_Mode、GPIO_PuPd的斷言內容都排列在函數一開始的地方,而GPIO_Speed、GPIO_OType兩個成員均分布在程序內部(一個在228行,另一個在235行),所以你要做的就是:總結這種異常規律然后記下來背住。

 

 示例二:再來一個更極端一些的規律,像下面的NVIC_Init()函數,你追進去看它的NVIC_InitTypeDef,發現其實有四個成員,但是在函數斷言內容中,只交待了三個成員的參數入口,剩下的一個NVIC_IRQChannel成員看遍整個函數也找不到斷言內容,那這時候怎么辦?我找到的規律是:在這種情況下啊,你就要去看注釋,譬如下面第二張圖,它在這個NVIC_IRQChannel成員旁邊的注釋着這個參數的可選項需要你去stm32f4xx.h頭文件中去找。

 

 

8-3)定義結構體變量問題:一般的做法都是先在第一行將GPIO_InitTypeDef GPIO_InitStructure寫出來,但問題是,像GPIO端口這種我們比較熟悉的就知道應該寫GPIO_InitTypeDef類型的,但在遇到使用其它陌生的新函數時,我們根本不知道這個結構體類型怎么寫,那怎么辦?按我的實踐來說,首先要做的往往不是在開頭部分寫結構體變量定義,而是先將需要用到的函數搬出來,譬如GPIO_Init(),暫時不填沒關系,我們拿它出來放這,然后右鍵go to definition,查看到傳進函數的結構體類型是什么了,我們再返回需要編程的第一行把結構體變量定義出來,如果需要查看這個結構體變量內部都有什么成員,我們再使用上面“8-2)”的辦法通過go to definition繼續追進去。將這個基本過程描述出來,一是為了減少編程的突兀感,二是增強編程時的應變能力(特別是視頻教程,別人就知道應該這么寫、第一句話應該寫這個,但是原因他們很少會交待出來,因為他們都用慣了已經習以為常了,所以這一次你記住了他教你第一行應該首先寫這個,但是別的地方需要換一個函數了,你就不知道應該怎么辦了)。

 8-4)關於引腳復用,判斷的標准就是:當你不再使用該引腳作為普通IO口了,而是需要使用它的第二/第三/第四/.../第N功能定義就應該配置成引腳復用(能夠被復用成什么功能需要按上述形式查看原理圖引腳內容)。和普通的IO口初始化過程的區別在於,需要調用GPIO_PinAFConfig()將引腳設置成你想要的第N功能,並且在初始化端口結構體時,需要選擇為復用引腳而不是普通引腳。

 8-5)總線掛接以及時鍾使能問題:一開始上手幾乎都是記不清楚你即將要使用的外設掛接在哪個總線上的,那這個怎么辦?記不住時最好的辦法是,把stm32f4xx_rcc.h打開,直接在宏定義RCC_AHB1Periph_xxx、RCC_AHB2Periph_xxx、RCC_APB1Periph_xxx、RCC_APB2Periph_xxx中去找你外設xxx對應的總線,對應的總線知道了,后面該調用哪個時鍾使能函數也就跟着出來了。

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM