注意是uart4,不是usart4
在stm32中uart和usart是不相同的
usart是通用同步/非同步序列接收/傳送器
uart是通用非同步收發傳輸器
簡單區分同步和非同步就是看通訊時需不需要對外提供時鐘輸出,我們平時用的串列埠通訊基本都是 uart。
usart支援同步模式,因此usart 需要同步時鐘訊號usart_ck(如stm32 微控制器),通常情況同步訊號很少使用,因此一般的微控制器uart和usart使用方式是一樣的,都使用非同步模式。
uart需要固定的波特率,就是說兩位資料的間隔要相等。 uart匯流排是非同步串列埠,一般由波特率產生器(產生的波特率等於傳輸波特率的16倍)、uart接收器、uart傳送器組成,硬體上有兩根線,一根用於傳送,一根用於接收。 顯然,如果用通用io口模擬uart匯流排,則需乙個輸入口,乙個輸出口。
uart是乙個並行輸入成為序列輸出的晶元,通常整合在主機板上,多數是16550afn晶元。因為計算機內部採用並行資料,不能直接把資料發到modem,必須經過uart整理才能進行非同步傳輸,其過程為:cpu先把準備寫入序列裝置的資料放到uart的暫存器(臨時記憶體塊)中,再通過fifo(first input first output,先入先出佇列)傳送到序列裝置,若是沒有fifo,資訊將變得雜亂無章,不可能傳送到modem。
作為介面的一部分,uart還提供以下功能:將由計算機內部傳送過來的並行資料轉換為輸出的序列資料流。將計算機外部來的序列資料轉換為位元組,供計算機內部使用並行資料的器件使用。在輸出的序列資料流中加入奇偶校驗位,並對從外部接收的資料流進行奇偶校驗。在輸出資料流中加入啟停標記,並從接收資料流中刪除啟停標記。處理由鍵盤或滑鼠發出的中斷訊號(鍵盤和滑鼠也是序列裝置)。可以處理計算機與外部序列裝置的同步管理問題。
usart收發模組一般分為三大部分:時鐘發生器、資料傳送器和接收器。控制暫存器為所有的模組共享。時鐘發生器由同步邏輯電路(在同步從模式下由外部時鐘輸入驅動)和波特率發生器組成。傳送時鐘引腳xck僅用於同步傳送模式下,傳送器部分由乙個單獨的寫入緩衝器(傳送udr)、乙個序列移位暫存器、校驗位發生器和用於處理不同湞結構的控制邏輯電路構成。使用寫入緩衝器,實現了連續傳送多湞資料無延時的通訊。接收器是usart模組最複雜的部分,最主要的是時鐘和資料接收單元。資料接收單元用作非同步資料的接收。除了接收單元,接收器還包括校驗位校驗器、控制邏輯、移位暫存器和兩級接收緩衝器(接收udr)。接收器支援與傳送器相同的幀結構,同時支援楨錯誤、資料溢位和校驗錯誤的檢測。usart是乙個全雙工通用同步/非同步序列收發模組,該介面是乙個高度靈活的序列通訊裝置。
綜上可以看出,usart相對uart來說是在非同步通訊的基礎上還有同步的功能,usart能夠提供主動時鐘。
uast4的配置
注意:在使用uart4之前,首先要確保你的微控制器是支援uart4的(我用到的微控制器是stm32f103vet6),具體是否支援uart4,可以參考資料手冊。同時要注意,uart4是掛載到apb1匯流排上的!
初始化程式:
為了方便除錯輸出,我將usart1也進行了初始化,對比一下不難發現uasrt1的初始化和uart4的初始化幾乎相同
gpio_inittypedef gpio_initstructure;
usart_inittypedef usart_initstructure;
/* config usart1 clock */
rcc_apb2periphclockcmd(rcc_apb2periph_usart1 | rcc_apb2periph_gpioa, enable);
rcc_apb2periphclockcmd(rcc_apb2periph_gpioc,enable);
rcc_apb2periphclockcmd(rcc_apb2periph_afio,enable);
rcc_apb1periphclockcmd(rcc_apb1periph_uart4,enable); //注意uart4是掛載在apb1匯流排上的,用rcc_apb1periphclockcmd()函式初始化!
/* usart1 gpio config */
/* configure usart1 tx (pa.09) as alternate function push-pull */
gpio_initstructure.gpio_pin = gpio_pin_9;
gpio_initstructure.gpio_mode = gpio_mode_af_pp;
gpio_initstructure.gpio_speed = gpio_speed_50mhz;
gpio_init(gpioa, &gpio_initstructure);
/* configure usart1 rx (pa.10) as input floating */
gpio_initstructure.gpio_pin = gpio_pin_10;
gpio_initstructure.gpio_mode = gpio_mode_ipu;
gpio_init(gpioa, &gpio_initstructure);
/* usart1 mode config */
usart_initstructure.usart_baudrate = 115200;
usart_initstructure.usart_wordlength = usart_wordlength_8b;
usart_initstructure.usart_stopbits = usart_stopbits_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;
usart_init(usart1, &usart_initstructure);
usart_cmd(usart1, enable);
//³õê¼»¯uart4-tx-pc10
gpio_initstructure.gpio_pin = gpio_pin_10;
gpio_initstructure.gpio_mode = gpio_mode_af_pp;
gpio_initstructure.gpio_speed = gpio_speed_50mhz;
gpio_init(gpioc, &gpio_initstructure);
// //uart-rx-pc11
gpio_initstructure.gpio_pin=gpio_pin_11;
gpio_initstructure.gpio_mode = gpio_mode_ipu;
usart_initstructure.usart_baudrate = 9600;
usart_initstructure.usart_wordlength = usart_wordlength_8b;
usart_initstructure.usart_stopbits = usart_stopbits_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;
usart_init(uart4, &usart_initstructure);
usart_cmd(uart4, enable);
usart_clearflag(uart4,usart_flag_tc);
STM32F1開發指南筆記10 串列埠通訊
串列埠設定的一般步驟可以總結為如下幾個步驟 串列埠時鐘使能,gpio 時鐘使能 串列埠復位 gpio 埠模式設定 串列埠引數初始化 開啟中斷並且初始化 nvic 如果需要開啟中斷才需要這個步驟 使能串列埠 編寫中斷處理函式 插入換行 usart rx sta 0 else if times 200 ...
STM32F4與STM32F1的區別
作為cortex m3市場的最大佔有者,st公司在2011年又推出基於cortex m4核心的stm32f4系列產品,相對與stm32f1 f2等cortex m3產品,stm32f4最大的優勢,就是新增了硬體fpu單元以及dsp指令,同時,stm32f4的主頻也提高了很多,達到168mhz 可獲得...
STM32F1和F4的區別
stm32f1和f4的區別 第一點區別 核心不一樣 stm32f1是cortex m3的核心。stm32f4是cortex m4的核心。晶元工藝不一樣。因為stm32最早2010年左右就出來的mcu,而f4比f1晚幾年研發出來,在設計製成上要優良一些 系統構架也不一致,f4的主系統有多層ahb匯流排...