版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、stm32 開發(fā)入門教程 (一) 開發(fā)環(huán)境建立及其應(yīng)用入門準(zhǔn)備: 我們常用的 stm32 開發(fā)編譯環(huán)境為 keil 公司的 mdk (microcontroller development kit) 和 iar 公司的 ewarm.在這里我們提供了比較穩(wěn)定的新版本編譯軟件下載: mdk4.10限于篇幅, 在我們的教程里面將先以 mdk 下的一個例子來介紹如何使用 mdk 進(jìn)行嵌入式應(yīng)用開發(fā).mdk 安裝與配置:基于 mdk 下的開發(fā)中基本的過程:(1) 創(chuàng)建工程;(2) 配置工程;(3) 用 c/c+ 或者 匯編語言編寫源文件;(4) 編譯目標(biāo)應(yīng)用程序(5) 修改源程序中的錯誤(6) 測試鏈接
2、應(yīng)用程序-(1) 創(chuàng)建一個工程:在 uvision 3 主界面中選擇 project - new uvision project 菜單項, 打開一個標(biāo)準(zhǔn)對話框選擇好你電腦中的保存目錄后, 輸入一個你的工程名字后點(diǎn)確認(rèn).我們的工程中建了一個名字叫 newproject 的工程. 從設(shè)備庫中選擇目標(biāo)芯片, 我們的 mini-stm32 開發(fā)板使用的是 stm32f103v8t6, 因此選中 stmicrocontroller 下對應(yīng)的芯片:arm 32-bit cortex-m3 microcontroller, 72mhz, 64kb flash, 20kb sram,pll, embedded
3、 internal rc 8mhz and 32khz, real-time clock,nested interrupt controller, power saving modes, jtag and swd,3 synch. 16-bit timers with input capture, output compare and pwm,16-bit 6-ch advanced timer, 2 16-bit watchdog timers, systick timer,2 spi, 2 i2c, 3 usart, usb 2.0 full speed interface, can 2.
4、0b active,2 12-bit 16-ch a/d converter, fast i/o ports選擇完芯片型號后會提示是否在目標(biāo)工程中加入 cpu 的相關(guān)的啟動代碼, 如下圖所示. 啟動代碼是用來初始化目標(biāo)設(shè)備的配置, 完成運(yùn)行的系統(tǒng)初始化工作, 因此我們選擇 是 , 這會使系統(tǒng)的啟動代碼編寫工作量大大減少.-(2) 配置工程:選擇菜單中 project - option for target 或者 選擇快捷菜單中的圖標(biāo):因為 mini-stm32 開發(fā)板上使用的就是 8m 的晶振且是使用的片內(nèi)的 ram 和 rom 因此 taget 下我們都可以使用默認(rèn)的配置;在output菜單
5、下我們需要選中 creat hex file 來生成編譯好的工程代碼, 此工程可以通過仿真器或者串口 isp 燒錄進(jìn)開發(fā)板中.注: isp 燒錄過程我們將在入門教程二中給大家介紹.listing user 菜單中我們保持默認(rèn)即可.c/c+ 菜單為我們常用的菜單, 這里簡單的介紹下他們的具體功能:preprocesser symbols 中的 define, undefine 菜單表示是工程的宏定義中的變量, 我們將在今后的教程中詳細(xì)介紹這個功能.optimization 為優(yōu)化選項, level0 為不優(yōu)化, 這種模式最適合調(diào)試, 因為不會優(yōu)化掉代碼, 基本每個用到的變量都可以打斷點(diǎn). lev
6、el3 為優(yōu)化等級最高, 最適合生產(chǎn)過程中下載到芯片中的代碼. include path 為工程中的包含路徑, 一般需將 .h 文件或者庫文件的地址配置進(jìn)去.asm 和 link 將在今后的高級教程中介紹.debug 為我們調(diào)試使用的配置選項, use simulator 為使用軟件仿真. 這里根據(jù)大家手里的仿真器來選擇配置環(huán)境.如果你使用的是 ulink, 那么就選擇 ulink cotex debug, 如果你選擇的是 jlink, 那么就選擇 cotex m3 jlink, 如果你使用的是 st 公司出的簡易仿真器 st-link , 那么你就選擇 st-link debug.注意: 右
7、邊當(dāng)中的選項 run to main 選項如果勾上就表示仿真時進(jìn)入了就會進(jìn)入到 main 函數(shù), 如果沒有選上就會進(jìn)入初始地址, 你需要自己打斷點(diǎn)運(yùn)行到你的主程序 main 處.當(dāng)插上仿真器后選擇上面右圖中的 setting 后會跳出一個仿真器的配置菜單. 左邊會自動識別出你的仿真器的信息.如下圖為 ulink2 的信息:對于 swj 選項為三線制調(diào)試, 將在后面的高級教程中介紹.右下方有兩個選項:verify code download : 表示下載后校驗數(shù)據(jù)download to flash: 表示當(dāng)仿真的時候先將目標(biāo)代碼下載到 flash 中.trace 菜單為跟蹤配置, 可以實(shí)時的將一
8、些變量使用曲線的形式實(shí)時表示出來, 我們將在今后的高級教程中介紹這一項功能.注意: 市面上目前的盜版 ulink2 不支持這項功能, 正版的支持, jlink 也不支持這項功能.flash download 菜單用來配置使用仿真器程序下載的配置選項, 大家務(wù)必選擇好和你芯片配套的選項. 如果你是使用的別人模板下修改為你的工程, 這個選項請注意一下, 如果不正確將不能將你的代碼下載到芯片中.配置好 debug 后, 那么 utilities 可以不用配置.如果你使用的是仿真器仿真, 在你已經(jīng)正確得將目標(biāo)板和仿真器建立了物理連接后, 請選擇正確的仿真器進(jìn)行配置.(二) isp 在線下載程序isp:
9、in system programming簡介: isp: 用寫入器將code燒入,不過,芯片可以在目標(biāo)板上,不用取出來,在設(shè)計目標(biāo)板的時候就將接口設(shè)計在上面,所以叫在系統(tǒng)編程,即不用脫離系統(tǒng); 應(yīng)用場合: 1,isp 程序升級需要到現(xiàn)場解決,不過好一點(diǎn)的是不必拆機(jī)器了; isp的實(shí)現(xiàn)一般需要很少的外部電路輔助實(shí)現(xiàn),通??衫脝纹瑱C(jī)的串行口接到計算機(jī)的rs232口,通過專門設(shè)計的固件程序來編程內(nèi)部存儲器。 主要是指代芯片的燒寫方式,以往寫片子需要把片子拿下來,離開電路,用 編程器燒,換句話說,芯片不能不脫離應(yīng)用系統(tǒng)進(jìn)行寫入。 isp 主要針對這個問題,使用jtag或者串行口(mcu 內(nèi)部有bo
10、ot loader,通過指定的方式激活之,它可以和pc或其它上位機(jī)通過串口聯(lián)系,不用使單片機(jī)離開應(yīng)用系統(tǒng)而更新內(nèi)部的程序/設(shè)置)進(jìn)行程序的燒寫操作。 因此,具有isp 功能的mcu 可以不使用編程器進(jìn)行編程。當(dāng)然,實(shí)現(xiàn)isp 可能需要一些硬件電路支持,具體的在數(shù)據(jù)手冊中有說明。 一般具備isp 功能后,就不要編程器了,而是使用下載線進(jìn)行編程工作。但是不是說他們就一定不支持編程器了,具體型號具體分析。是否需要仿真器進(jìn)行仿真和是否具備isp和iap沒有必然的聯(lián)系。只不過具備了iap功能,可以在mcu內(nèi)寫入監(jiān)控程序,模擬一個仿真器,當(dāng)然,這個監(jiān)控程序是要消耗資源的,和使用硬件的仿真器還有一定的差異。
11、-以上就是 isp 的一些概念上的描述, 現(xiàn)在通俗點(diǎn)說就是怎么利用工具把程序下載到芯片當(dāng)中去.第一步: 配置工程, 輸出編譯后的代碼 .hex 文件:我們打開第一個我們的教程例子, gpio_test 這個例子工程. 先按照下面的步驟來配置一下工程:點(diǎn)擊下圖中的 option 選項;選中 output 菜單下的 create hex file , 并且在右邊的 name of executable 中填寫我們生成編譯代碼的文件名稱.配置完選項后, 點(diǎn)擊工程編譯按鈕, 然后我們就可以在 example2-gpiogpio_testoutput 目錄下面得到 gpio_test.hex 文件了.第
12、二步: 準(zhǔn)備串口物理連接和 設(shè)置 boot 跳線選擇芯片啟動類型先需要準(zhǔn)備一根串口延長線, 一頭為公頭,一頭為母頭的串口連接線 (非交叉線), 和一臺有串口的電腦. (注意:如果您的電腦沒有串口,請購買 usb 轉(zhuǎn) rs232 的硬件設(shè)備來擴(kuò)充你電腦的串口.) 將 mini-stm32 的 j1 跳線帽跳至 2,3 兩腳上選擇芯片從內(nèi)部的 boot 區(qū)啟動, 上電后會先進(jìn)入 isp 狀態(tài).連接串口線至你的電腦上的串口將 usb 延長線連接至你的電腦上給 mini-stm32 開發(fā)板供上 5v 電源. 當(dāng)開發(fā)板上的電源指示燈點(diǎn)亮后一切準(zhǔn)備就緒. 第三步: 配置 isp 下載軟件 mcuisp.e
13、xe:您可以點(diǎn)擊下載穩(wěn)定版的 mcuisp v0.975 版本的軟件: (576.58 kb) 打開 mcuisp.exe 綠色軟件,選擇好您連接至開發(fā)板使用的電腦上的串口, 可以通過搜索串口菜單來自動搜索出你電腦上的串口信息.在左上方的程序文件選擇你準(zhǔn)備燒入芯片中的代碼, 就是前面我們生成的gpio_test.hex. 然后在菜單選項欄上選擇 stmisp 菜單, 點(diǎn)擊 讀stm32器件信息 命令按鈕.我們會在右邊的信息框中顯示出連接成功的信息: 如圖所示:選擇上校驗和編程后運(yùn)行兩個選項后點(diǎn)擊開始編程. 會報出程序成功燒入芯片的一些信息, 如下:-dtr電平置高(+3-+12v),復(fù)位rts
14、置高(+3-+12v),選擇進(jìn)入bootloader.延時100毫秒dtr電平變低(-3-12v)釋放復(fù)位rts維持高開始連接.3, 接收到:1f 在串口com4連接成功115200bps,耗時343毫秒芯片內(nèi)bootloader版本號:2.1芯片pid:00000410芯片flash容量為128kb芯片sram容量為65535kb(此信息僅供參考,新版本芯片已不包含此信息)96位的芯片唯一序列號:33006c065839353235581943讀出的選項字節(jié):a55aff00ff00ff00ff00ff00ff00ff00全片擦除成功第547毫秒,已準(zhǔn)備好共寫入2kb,進(jìn)度100%,耗時43
15、43毫秒成功從08000000開始運(yùn)行向您報告,命令執(zhí)行完畢,一切正常-這個時候您可以看到您手中的 mini-stm32 開發(fā)板上的兩個紅色 led 有規(guī)律的輪流點(diǎn)亮, 說明程序已經(jīng)成功的燒入芯片了.最后您在斷電后將 mini-stm32 上 j1 的跳線帽跳至 1,2 引腳上, 重新上電后, 程序就可以正常運(yùn)行了.(三) 系統(tǒng)時鐘 systick(一) 背景介紹 在傳統(tǒng)的嵌入式系統(tǒng)軟件按中通常實(shí)現(xiàn) delay(n) 函數(shù)的方法為:for(i = 0; i = x; i +); x - 對應(yīng)于 對應(yīng)于 n 毫秒的循環(huán)值對于stm32系列微處理器來說,執(zhí)行一條指令只有幾十個 ns,進(jìn)行 for
16、循環(huán)時,要實(shí)現(xiàn) n 毫秒的 x 值非常大,而且由于系統(tǒng)頻率的寬廣,很難計算出延時 n 毫秒的精確值。針對 stm32 微處理器,需要重新設(shè)計一個新的方法去實(shí)現(xiàn)該功能,以實(shí)現(xiàn)在程序中使用 delay(n)。(二) stm32 systick 介紹 cortex-m3 的內(nèi)核中包含一個 systick 時鐘。systick 為一個 24 位遞減計數(shù)器,systick 設(shè)定初值并使能后,每經(jīng)過 1 個系統(tǒng)時鐘周期,計數(shù)值就減 1。計數(shù)到 0 時,systick 計數(shù)器自動重裝初值并繼續(xù)計數(shù),同時內(nèi)部的 countflag 標(biāo)志會置位,觸發(fā)中斷 (如果中斷使能情況下)。在 stm32 的應(yīng)用中,使用
17、cortex-m3 內(nèi)核的 systick 作為定時時鐘,設(shè)定每一毫秒產(chǎn)生一次中斷,在中斷處理函數(shù)里對 n 減一,在delay(n) 函數(shù)中循環(huán)檢測 n 是否為 0,不為 0 則進(jìn)行循環(huán)等待;若為 0 則關(guān)閉 systick 時鐘,退出函數(shù)。注: 全局變量 timingdelay , 必須定義為 volatile 類型 , 延遲時間將不隨系統(tǒng)時鐘頻率改變。(三) st systick 庫文件使用st的函數(shù)庫使用systick的方法1、調(diào)用systick_countercmd() - 失能systick計數(shù)器2、調(diào)用systick_itconfig () - 失能systick中斷 3、調(diào)用sy
18、stick_clksourceconfig() - 設(shè)置systick時鐘源。4、調(diào)用systick_setreload() - 設(shè)置systick重裝載值。5、調(diào)用systick_itconfig () - 使能systick中斷6、調(diào)用systick_countercmd() - 開啟systick計數(shù)器(四) systemtick 工程實(shí)戰(zhàn)外部晶振為 8 mhz,9 倍頻,系統(tǒng)時鐘為 72mhz,systick 的最高頻率為9mhz(最大為hclk / 8),在這個條件下,把 systick 效驗值設(shè)置成9000,將 systick 時鐘設(shè)置為 9 mhz, 就能夠產(chǎn)生 1ms 的時間基
19、值,即 systick 產(chǎn)生 1ms 的中斷。 /* configure the system clocks */ rcc_configuration(); systick_configuration();第一步: 配置 rcc 寄存器 和 systick 寄存器rcc_configuration: 配置 rcc 寄存器void rcc_configuration(void) /* rcc system reset(for debug purpose) */ rcc_deinit(); /* enable hse */ rcc_hseconfig(rcc_hse_on); /* wait ti
20、ll hse is ready */ hsestartupstatus = rcc_waitforhsestartup(); if(hsestartupstatus = success) /* hclk = sysclk */ rcc_hclkconfig(rcc_sysclk_div1); /* pclk2 = hclk */ rcc_pclk2config(rcc_hclk_div1); /* pclk1 = hclk/2 */ rcc_pclk1config(rcc_hclk_div2); /* flash 2 wait state */ flash_setlatency(flash_l
21、atency_2); /* enable prefetch buffer */ flash_prefetchbuffercmd(flash_prefetchbuffer_enable); /* pllclk = 8mhz * 9 = 72 mhz */ rcc_pllconfig(rcc_pllsource_hse_div1, rcc_pllmul_9); /* enable pll */ rcc_pllcmd(enable); /* wait till pll is ready */ while(rcc_getflagstatus(rcc_flag_pllrdy) = reset) /* s
22、elect pll as system clock source */ rcc_sysclkconfig(rcc_sysclksource_pllclk); /* wait till pll is used as system clock source */ while(rcc_getsysclksource() != 0x08) /* enable gpioa and afio clocks */ rcc_apb2periphclockcmd(rcc_apb2periph_gpioa | rcc_apb2periph_afio, enable);systick_configuration:
23、配置 systick void systick_configuration(void) /* select ahb clock(hclk) as systick clock source */ systick_clksourceconfig(systick_clksource_hclk); /* set systick priority to 3 */ nvic_systemhandlerpriorityconfig(systemhandler_systick, 3, 0); /* systick interrupt each 1ms with hclk equal to 72mhz */ s
24、ystick_setreload(72000); /* enable the systick interrupt */ systick_itconfig(enable);第二步: 配置 systick 中斷函數(shù)這里我們定義了一個 testsig 全局變量, 用于我們使用 keil 軟件自帶的邏輯分析儀來分析.volatile vu32 timingdelay = 0;vu8 testsig = 0;void systickhandler(void) timingdelay-; if(timingdelay % 2) testsig = 1; else testsig = 0; 第三步: 編寫
25、delay 延時函數(shù)delay: 系統(tǒng)延時函數(shù), 使用系統(tǒng)時鐘操作.void delay(u32 ntime) /* enable the systick counter */ systick_countercmd(systick_counter_enable); timingdelay = ntime; while(timingdelay != 0); /* disable the systick counter */ systick_countercmd(systick_counter_disable); /* clear the systick counter */ systick_co
26、untercmd(systick_counter_clear);第四步: 主函數(shù)中調(diào)用 delay在 mini-stm32 開發(fā)板上有兩個 led 燈, 分別是 pa0, pa1. 我們做個流水燈程序, 讓他們循環(huán)點(diǎn)亮. while(1) gpio_setbits(gpioa,gpio_pin_0); delay(100); gpio_resetbits(gpioa,gpio_pin_0); delay(100); gpio_setbits(gpioa,gpio_pin_1); delay(100); gpio_resetbits(gpioa,gpio_pin_1); delay(100);
27、(五) 仿真調(diào)試把工程便宜通過后, 進(jìn)入軟件仿真如下圖所示:點(diǎn)擊工程快捷菜單的邏輯分析儀在邏輯分析儀中我們點(diǎn)擊 setup 按鍵會彈出安裝對話框.點(diǎn)右上方的 新建 圖標(biāo), 在菜單中輸入 testsig 這個全局變量.添加完之后就可以點(diǎn) close 了. 如果您仿真完可以點(diǎn)擊 左下方的 kill all 刪除所有監(jiān)視變量.全速運(yùn)行后就可以看到下面的波形了哦如果你使用仿真器在 mini-stm32 上調(diào)試的話你還可以看到兩個 led 在跑跑馬燈程序了.到此我們這章節(jié)的教程就結(jié)束了, 相信大家也掌握了 system tick 的用法了.(四) gpio簡單應(yīng)用和外部中斷這個章節(jié)我們將學(xué)習(xí)最基本的 s
28、tm32 的 gpio 的應(yīng)用. 我們將分為兩個章節(jié)來學(xué)習(xí).第一部份: gpio 的基本應(yīng)用和 io 口的配置第二部份: 外部中斷的使用-1: 設(shè)計要求: 開發(fā)板上有 2 個 led, 我們的目的為有規(guī)律的點(diǎn)亮 led1 和 led2. 當(dāng)按鍵按下去的時候所有的燈滅, 等待 2 秒鐘后恢復(fù)有規(guī)律的點(diǎn)亮.2: 硬件電路:3: 軟件程序設(shè)計:(1) 根據(jù)要求配置 gpioa 中的 pa0,pa1 為輸出, pa3, pa8 為輸入 對于下面程序中的 gpio_initstructure.gpio_speed 和 gpio_initstructure.gpio_mode 推薦大家看下面兩篇文章. 備
29、注: 當(dāng)stm32的gpio端口設(shè)置為輸出模式時,有三種速度可以選擇:2mhz、10mhz和50mhz,這個速度是指i/o口驅(qū)動電路的速度,是用來選擇不同的輸出驅(qū)動模塊,達(dá)到最佳的噪聲控制和降低功耗的目的。備注: 共有8種模式,可以通過編程選擇: 1. 浮空輸入 2. 帶上拉輸入 3. 帶下拉輸入 4. 模擬輸入 5. 開漏輸出(此模式可實(shí)現(xiàn)hotpower說的真雙向io) 6. 推挽輸出 7. 復(fù)用功能的推挽輸出 8. 復(fù)用功能的開漏輸出模式7和模式8需根據(jù)具體的復(fù)用功能決定。void gpio_configuration(void) gpio_inittypedef gpio_initst
30、ructure; /* configure pa. as output push-pull */ gpio_initstructure.gpio_pin = gpio_pin_0|gpio_pin_1; gpio_initstructure.gpio_speed = gpio_speed_50mhz; gpio_initstructure.gpio_mode = gpio_mode_out_pp; gpio_init(gpioa, gpio_initstructure); /* configure pa3,pa8 as input floating (exti line3 , exti lin
31、e8) */ gpio_initstructure.gpio_pin = gpio_pin_3 | gpio_pin_8; gpio_initstructure.gpio_mode = gpio_mode_in_floating; gpio_init(gpioa, gpio_initstructure);(2) 打開 gpioa 的時鐘, 因為 stm32 是一個低功耗的 mcu , 每一個你使用的外圍設(shè)備都需要單獨(dú)開啟時鐘, 如果不開啟將不能使用, 這個也是對于 stm32 初學(xué)者容易疏忽的地方 /* enable gpioa and afio clocks */ rcc_apb2perip
32、hclockcmd(rcc_apb2periph_gpioa | rcc_apb2periph_afio, enable);stm32共有5種時鐘源,其中三種不同的時鐘源可用作為驅(qū)動系統(tǒng)時鐘(sysclk);1、hsi 由內(nèi)部8mhz rc振蕩器產(chǎn)生,它是可以直接用來作為系統(tǒng)時鐘或經(jīng)2分頻后作為pllsrc輸入。his時鐘頻率在出廠時被校準(zhǔn)在1%(25c),在系統(tǒng)復(fù)位時,工廠校準(zhǔn)值會被裝載到時鐘控制寄存器的hiscal7.0 位。用戶可以通過更改hiscal4.0來調(diào)整hsi頻率。另外時鐘寄存器中有一個hsirdy位用來指示hsi rc是不穩(wěn)定工作,在時鐘啟過后,直到這個標(biāo)志位置被硬件置1后,
33、hsi rc時鐘才被輸出。hsi rc時鐘還可以用時鐘寄存器中的hsion位來啟動和關(guān)閉。hsi時鐘同時也是hse晶體蕩振器的備用時鐘源。使用hse時鐘,程序設(shè)置時鐘參數(shù)流程:1、將rcc寄存器重新設(shè)置為默認(rèn)值 rcc_deinit;2、打開外部高速時鐘晶振hse rcc_hseconfig(rcc_hse_on);3、等待外部高速時鐘晶振工作 hsestartupstatus = rcc_waitforhsestartup();4、設(shè)置ahb時鐘 rcc_hclkconfig;5、設(shè)置高速ahb時鐘 rcc_pclk2config;6、設(shè)置低速速ahb時鐘 rcc_pclk1config;7
34、、設(shè)置pll rcc_pllconfig;8、打開pll rcc_pllcmd(enable);9、等待pll工作 while(rcc_getflagstatus(rcc_flag_pllrdy) = reset) 10、設(shè)置系統(tǒng)時鐘 rcc_sysclkconfig;11、判斷是否pll是系統(tǒng)時鐘 while(rcc_getsysclksource() != 0x08)12、打開要使用的外設(shè)時鐘 rcc_apb2periphclockcmd()/rcc_apb1periphclockcmd()具體設(shè)置請參考下面的文章(3) 設(shè)置外部中斷, 所有的 gpio 口都可以作為外部中斷源. 具體可以
35、參考下面這篇文章. /* connect exti line3 to pa.3 */ gpio_extilineconfig(gpio_portsourcegpioa, gpio_pinsource3); /* configure exti line3 to generate an interrupt on falling edge */ exti_initstructure.exti_line = exti_line3; exti_initstructure.exti_mode = exti_mode_interrupt; exti_initstructure.exti_trigger =
36、exti_trigger_falling; exti_initstructure.exti_linecmd = enable; exti_init(exti_initstructure);同樣不要忘記打開時鐘, 我們在打開 pa 口的時候已經(jīng)加上了 rcc_apb2periph_afio, 這里再提醒大家一下. /* enable gpioa and afio clocks */ rcc_apb2periphclockcmd(rcc_apb2periph_gpioa | rcc_apb2periph_afio, enable);最后就是編寫外部中斷入口函數(shù).void exti3_irqhand
37、ler(void) int i; if(exti_getitstatus(exti_line9) != reset) gpio_setbits(gpioa,gpio_pin_0); gpio_setbits(gpioa,gpio_pin_1); for(i=0;i=8000000;i+); gpio_resetbits(gpioa,gpio_pin_0); gpio_resetbits(gpioa,gpio_pin_1); for(i=0;i=1000000;i+) /* clear the exti line 3 pending bit */ exti_clearitpendingbit(e
38、xti_line3); 不要忘記在中斷函數(shù)處理完成后清掉標(biāo)志位,不然會不停的進(jìn)入中斷.(4) 編譯與調(diào)試 我們已經(jīng)完成所有程序編寫部份, 接下來就是將工程編譯成功后下載到我們的 mini-stm32 開發(fā)板中進(jìn)行調(diào)試和仿真. 如果看到 led 有規(guī)律的點(diǎn)亮和熄滅, 按下按鈕后 led 先是一起熄滅, 在一起點(diǎn)亮, 然后恢復(fù)有規(guī)律的點(diǎn)亮這個過程, 說明我們已經(jīng)達(dá)到我們的設(shè)計目標(biāo). -總結(jié): 我們學(xué)習(xí)完了這篇教程之后, 相信大家對下面幾個方面的內(nèi)容已經(jīng)掌握了.* gpio 的設(shè)置* stm32 gpio 的優(yōu)勢* stm32 的時鐘結(jié)構(gòu)* 外部中斷的配置* 外部中斷和外部事件的區(qū)別(五) 異步串口
39、雙工通訊(一) stm32 的 usart 模擬介紹通用同步異步收發(fā)器(usart)提供了一種靈活的方法來與使用工業(yè)標(biāo)準(zhǔn)nr 異步串行數(shù)據(jù)格式的外部設(shè)備之間進(jìn)行全雙工數(shù)據(jù)交換。 usart利用分?jǐn)?shù)波特率發(fā)生器提供寬范圍的波特率選擇。 它支持同步單向通信和半雙工單線通信。它也支持lin(局部互連網(wǎng)),智能卡協(xié)議和irda(紅外數(shù)據(jù)組織)sir endec規(guī)范,以及調(diào)制解調(diào)器(cts/rts)操作。它還允許多處理器通信。用于多緩沖器配置的dma方式,可以實(shí)現(xiàn)高速數(shù)據(jù)通信。 主要特性: 全雙工的,異步通信 nr 標(biāo)準(zhǔn)格式 分?jǐn)?shù)波特率發(fā)生器系統(tǒng) -發(fā)送和接收共用的可編程波特率,最高到4.5mbits/
40、s 可編程數(shù)據(jù)字長度(8位或9位) 可配置的停止位 -支持1或2個停止位 lin主發(fā)送同步斷開符的能力以及l(fā)in從檢測斷開符的能力 - 當(dāng)usart硬件配置成lin時,生成13位斷開符;檢測10/11位斷開符 發(fā)送方為同步傳輸提供時鐘 irda sir 編碼器解碼器 - 在正常模式下支持3/16位的持續(xù)時間 智能卡模擬功能 - 智能卡接口支持iso7816 -3標(biāo)準(zhǔn)里定義的異步協(xié)議智能卡 - 智能卡用到的0.5和1.5個停止位 單線半雙工通信 使用dma的可配置的多緩沖器通信 - 在保留的sram里利用集中式dma緩沖接收/發(fā)送字節(jié) 單獨(dú)的發(fā)送器和接收器使能位 檢測標(biāo)志 - 接收緩沖器滿 -
41、發(fā)送緩沖器空 - 傳輸結(jié)束標(biāo)志 校驗控制 - 發(fā)送校驗位 - 對接收數(shù)據(jù)進(jìn)行校驗 四個錯誤檢測標(biāo)志 - 溢出錯誤 - 噪音錯誤 - 幀錯誤 - 校驗錯誤 10個帶標(biāo)志的中斷源 - cts改變 - lin斷開符檢測 - 發(fā)送數(shù)據(jù)寄存器 - 發(fā)送完成 - 接收數(shù)據(jù)寄存器 - 檢測到總線為空 - 溢出錯誤 - 幀錯誤 - 噪音錯誤 - 校驗錯誤 多處理器通信 - - 如果地址不匹配,則進(jìn)入靜默模式 從靜默模式中喚醒(通過空閑總線檢測或地址標(biāo)志檢測) 兩種喚醒接收器的方式 - 地址位(msb) - 空閑總線(二) 程序編寫(1) 在 rcc_configuration 函數(shù)中, 打開串口時鐘 /* e
42、nable usart1, gpioa, gpiox and afio clocks */ rcc_apb2periphclockcmd(rcc_apb2periph_usart1 | rcc_apb2periph_gpioa | rcc_apb2periph_gpiox | rcc_apb2periph_afio, enable);(2) 設(shè)置串口的 rtx, tdx io 口的屬性void gpio_configuration(void) gpio_inittypedef gpio_initstructure; /* configure usart1 rx (pa.10) as input
43、 floating */ gpio_initstructure.gpio_pin = gpio_pin_10; gpio_initstructure.gpio_mode = gpio_mode_in_floating; gpio_init(gpioa, gpio_initstructure); /* configure usart1 tx (pa.09) as alternate function push-pull */ gpio_initstructure.gpio_pin = gpio_pin_9; gpio_initstructure.gpio_speed = gpio_speed_5
44、0mhz; gpio_initstructure.gpio_mode = gpio_mode_af_pp; gpio_init(gpioa, gpio_initstructure);(3) 移植 fputc 函數(shù)int fputc(int ch, file *f) /* place your implementation of fputc here */ /* e.g. write a character to the usart */ usart_senddata(usart1, (u8) ch); /* loop until the end of transmission */ while
45、(usart_getflagstatus(usart1, usart_flag_tc) = reset) return ch;(4) 主函數(shù)中初始化串口設(shè)置 usart_clockinitstructure.usart_clock = usart_clock_disable; usart_clockinitstructure.usart_cpol = usart_cpol_low; usart_clockinitstructure.usart_cpha = usart_cpha_2edge; usart_clockinitstructure.usart_lastbit = usart_last
46、bit_disable; /* configure the usart1 synchronous paramters */ usart_clockinit(usart1, usart_clockinitstructure); usart_initstructure.usart_baudrate = 115200; usart_initstructure.usart_wordlength = usart_wordlength_8b; usart_initstructure.usart_stopbits = usart_stopbits_1; usart_initstructure.usart_p
47、arity = usart_parity_no ; usart_initstructure.usart_hardwareflowcontrol = usart_hardwareflowcontrol_none; usart_initstructure.usart_mode = usart_mode_rx | usart_mode_tx; /* configure usart1 basic and asynchronous paramters */ usart_init(usart1, usart_initstructure); /* enable usart1 */ usart_cmd(usa
48、rt1, enable);(5) 編寫應(yīng)用程序 printf(rn 歡迎來到麥思網(wǎng)論壇 rn); printf(rn rn); printf(rn please input character from keyboard rn); while(1 ) if(usart_getflagstatus(usart1,usart_it_rxne)=set) i = usart_receivedata(usart1); printf( %c,i0xff); /* print the input char */ (三) 調(diào)試仿真程序(1) 使用keil uvision3 通過ulink 2仿真器連接實(shí)驗板,打開實(shí)驗例程目錄usart_test子目錄下的usart.uv2例程,編譯鏈接工程;(2) 使用mini-stm32開發(fā)板附帶的串口線,連接開發(fā)板上的com和pc機(jī)的串口;(3) 在pc機(jī)上運(yùn)行windows自帶的超級終端串口通信程序(波特率115200、1位停止位、無校驗位、無硬件流控制);或者使用其它串口通信程序;(4) 選擇硬件調(diào)試模式,點(diǎn)擊mdk 的debug菜單,選擇start/stop debug session項或ctrl+f5鍵,遠(yuǎn)程連接目
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 超市生鮮采購管理流程制度
- 水廠日常運(yùn)行與維護(hù)管理方案
- 2026年建設(shè)工程招投標(biāo)的關(guān)鍵點(diǎn)分析
- 2026年電氣設(shè)備運(yùn)維技術(shù)的變革
- 建筑工程分包招標(biāo)流程操作手冊
- 2026年城市地下綜合管廊的結(jié)構(gòu)設(shè)計
- 2026年招投標(biāo)案例分析與經(jīng)驗分享
- 2026年在線支付系統(tǒng)對房地產(chǎn)交易的影響
- 電力監(jiān)理安全培訓(xùn)題庫課件
- 人機(jī)交互界面優(yōu)化-第1篇
- 影視產(chǎn)業(yè)國際化發(fā)展路徑-洞察及研究
- 2025年電氣工程師專業(yè)基礎(chǔ)《供配電》真題及答案
- 國開2025年《行政領(lǐng)導(dǎo)學(xué)》形考作業(yè)1-4答案
- 2025年物理天津會考試題及答案
- 2025年國家開放大學(xué)《數(shù)據(jù)分析與統(tǒng)計學(xué)基礎(chǔ)》期末考試備考試題及答案解析
- 吊水魚專業(yè)知識培訓(xùn)內(nèi)容課件
- 汽車產(chǎn)業(yè)自動駕駛政策法規(guī)2025年研究報告
- 口岸安全聯(lián)合防控工作制度
- 水處理設(shè)備維護(hù)課件
- 架梁人員安全教育培訓(xùn)課件
- 槐鄉(xiāng)五月課件教學(xué)
評論
0/150
提交評論