找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 25681|回復(fù): 15
打印 上一主題 下一主題
收起左側(cè)

STM8單片機(jī)零基礎(chǔ)學(xué)習(xí)開(kāi)發(fā)基礎(chǔ)篇教程

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:223470 發(fā)表于 2018-3-16 13:13 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本文檔是學(xué)習(xí)板stm8單片機(jī)篇零基礎(chǔ)學(xué)習(xí)開(kāi)發(fā)基礎(chǔ)篇教程;希望給大家的學(xué)習(xí)中帶來(lái)幫助;
stm8單片機(jī)篇
1章 預(yù)備篇
1.1如何在 win7系統(tǒng)下安裝基礎(chǔ)型學(xué)習(xí)板實(shí)驗(yàn)平臺(tái)軟件

1、雙擊鼠標(biāo)左鍵打開(kāi)資料中的“基礎(chǔ)型學(xué)習(xí)板實(shí)驗(yàn)平臺(tái)”,“ 基礎(chǔ)型學(xué)習(xí)板 實(shí)驗(yàn)平臺(tái)”如圖 1.1- 1 所示。

圖 1.1- 1 微云電子出品文件夾
2、打開(kāi)“基礎(chǔ)型學(xué)習(xí)板實(shí)驗(yàn)平臺(tái)”后,出現(xiàn)一名為 Volume 的文件夾,界面 如圖 1.1- 2 所示。

圖 1.1- 2 Volume 文件夾
3、雙擊鼠標(biāo)左鍵打開(kāi)“Volume 文件夾”,出現(xiàn)安裝 setup 所在文件夾,如圖
1.1- 3 所示。

圖 1.1- 3 setup 所在界面
4、右鍵單擊“setup.exe”,選擇以管理員身份運(yùn)行,如圖 1.1- 4 所示。

圖 1.1- 4 以管理員身份運(yùn)行安裝圖標(biāo)
5、安裝程序初始化界面如圖 1.1- 5 所示。

圖 1.1- 5 安裝程序初始化
6、選擇目標(biāo)目錄界面,基礎(chǔ)型學(xué)習(xí)板實(shí)驗(yàn)平臺(tái)目錄的默認(rèn)目錄是 C:\Program

Files\基礎(chǔ)型學(xué)習(xí)板實(shí)驗(yàn)平臺(tái)\,如圖 1.1- 6 所示。

圖 1.1- 6 選擇目錄界面
7、修改保存路徑,單擊瀏覽微云電子出品目錄以及 National lnstuments 產(chǎn)品 目錄,在這里微云電子出品的目錄我選用 D 盤名命為基礎(chǔ)型學(xué)習(xí)板實(shí)驗(yàn)平臺(tái)的 文件夾中,單擊下一步,如圖 1.1- 7 所示。

圖 1.1- 7 修改后的保存路徑
注:讀者可自行選擇目錄,也可不修改路徑,選擇默認(rèn)路徑,直接點(diǎn)擊下一 步,National lnstuments 產(chǎn)品目錄的選擇和下載器的目錄選擇完全一樣,這這里 不再重復(fù)介紹。
8、目錄選擇結(jié)束的開(kāi)始安裝界面如圖 1.1- 8 所示,單擊下一步。

圖 1.1- 8 開(kāi)始安裝
9、安裝進(jìn)度如圖 1.1- 9 所示。


圖 1.1- 9 安裝進(jìn)度
8、單擊完成,安裝成功,安裝成功界面如圖 1.1- 10 所示。

圖 1.1- 10 安裝成功界面

1.2如何使用 Downloader

1、左鍵單擊計(jì)算機(jī)左下方的“開(kāi)始菜單”中“所有程序”中的“基礎(chǔ)型學(xué) 習(xí)板實(shí)驗(yàn)平臺(tái)”,如圖 1.2- 1 所示。




圖 1.2- 1 打開(kāi) 0724 電子出品
2、單擊鼠標(biāo)右鍵 Downloader,選擇以管理員身份運(yùn)行,這個(gè)是我們向 stm8
單片機(jī)里下載程序的軟件,Downloader 打開(kāi)界面如圖 1.2- 2 所示。

圖 1.2- 2 Downloader 界面
3、應(yīng)用此軟件之前需要軟件注冊(cè),單擊軟件注冊(cè),如圖 1.2- 3 所示。
圖 1.2- 3 注冊(cè)界面
4、單擊 Port Name 中的下箭頭,選擇 COM 口,由前面“如何在 win7 系統(tǒng)




下查看 com 口”可知選擇 COM3(讀者是 COM 幾,就選擇 COM 幾),如圖 1.2- 4
所示。

圖 1.2- 4 選擇 com 口
5、單擊注冊(cè)窗口右側(cè)的藍(lán)色圓箭頭,提示輸入軟件注冊(cè)碼,如圖 1.2- 5 所 示。

圖 1.2- 5 軟件注冊(cè)界面
6、注意每個(gè)學(xué)習(xí)板的注冊(cè)碼不同,讀者請(qǐng)參看學(xué)習(xí)板上的標(biāo)簽,上面就是 學(xué)習(xí)板的注冊(cè)碼。在灰色框內(nèi)輸入注冊(cè)HVGG_GQGG_JJJI_KNHM_JMJH_JKJG 如圖 1.2- 6 所示,注意注冊(cè)碼要求英文半角大寫。每四位為一組,讀者以學(xué)習(xí)板 標(biāo)簽為主,若輸入的注冊(cè)碼不對(duì)會(huì)有錯(cuò)誤提示窗口。輸入結(jié)束后單擊藍(lán)色箭頭, 注冊(cè)成功,如圖 1.2- 7 所示。

圖 1.2- 6 輸入注冊(cè)碼注冊(cè)

















圖 1.2- 7 注冊(cè)成功
注冊(cè)部分介紹結(jié)束,下載部分在下面下載程序部分介紹。

1.3IAR forstm8軟件的安裝


在這里我們以 win7 操作系統(tǒng)下為例介紹軟件的安裝過(guò)程。 打開(kāi)微云電子資料內(nèi)容中的\相關(guān)軟件及工具\(yùn)IAR FOR STM8 v1.3 文件夾,
可看到如圖 1.3- 1 所示:




圖 1.3- 1 IAR FOR STM8 v1.3 文件夾內(nèi)容
其中第一個(gè)是安裝軟件,第二個(gè)是注冊(cè)機(jī)。右擊安裝軟件,點(diǎn)擊“以管理員 身份運(yùn)行”,操作界面如圖 1.3- 2 所示(對(duì)于涉及權(quán)限的一律點(diǎn)“是”或者“允 許”,以下不再贅述)。

















圖 1.3- 2 安裝管理權(quán)限
打開(kāi)安裝軟件后,界面如圖 1.3- 3 所示:


圖 1.3- 3 打開(kāi)安裝軟件界面
點(diǎn)擊“next”按鈕,之后,選擇同意協(xié)議,操作如圖 1.3- 4 所示,再點(diǎn)擊“next”:




圖 1.3- 4 接受協(xié)議
然后界面如圖 1.3- 5 所示:


圖 1.3- 5 輸入用戶信息
其中 Name 和 Company 可以隨便填,接下來(lái)就是注冊(cè)和破解的過(guò)程了。在 IAR FOR STM8 v1.3 文件夾下找到注冊(cè)機(jī) key_iar_stm8,同樣以管理員身份運(yùn)行,注 意,此處一定要以管理員的身份運(yùn)行,否則獲取的 ID 號(hào)將不準(zhǔn)確,會(huì)影響以后 軟件的使用。操作如圖 1.3- 6所示。






圖 1.3- 6 注冊(cè)管理權(quán)限
打開(kāi)之后界面如圖 1.3- 7 所示,在 Product 一欄選擇 Embedded Workbench For
STM8 1.30,然后點(diǎn)擊“Generate”,因?yàn)槭请S機(jī)產(chǎn)生的,可多點(diǎn)幾次。


圖 1.3- 7 注冊(cè)機(jī)界面
把 License number 選定,復(fù)制到之前的 License#的條框里。然后點(diǎn)擊“next”, 操縱如圖 1.3- 8 所示。





圖 1.3- 8 輸入 License 信息
然后把注冊(cè)機(jī)的 License Key,復(fù)制到下圖位置,點(diǎn)擊“next”,操作如圖 1.3- 9
所示。
















圖 1.3- 9 輸入用戶 License Key 信息
接下來(lái)是選擇安裝路徑,因?yàn)檐浖淮,所以最好默認(rèn)安裝到 C 盤,如果一 定要更改安裝路徑,可點(diǎn)擊“Change”,操作如圖 1.3-10 所示。





圖 1.3- 10 修改安裝路徑
接下來(lái)就是選擇安裝類型(如圖 1.3- 11 所示)和安裝 ST-LINK 安裝包(如 圖 1.3- 12 所示),全部選擇默認(rèn),一路點(diǎn)擊“next”就好。

圖 1.3- 11 安裝類型

圖 1.3- 12 ST-LINK 安裝
以下兩個(gè)可以選項(xiàng)不勾選,點(diǎn)擊“finish”,就完成了所有的安裝。操作如圖
1.3- 13 所示。





圖 1.3- 13 安裝完成
接下來(lái)這一步很重要,就是把微云電子資料內(nèi)容中>安裝軟件及工具>IAR FOR  STM8  v1.3  里 的 config  文 件 夾 替 換 掉C:\Program  Files\IAR Systems\Embedded Workbench 6.0 Evaluation\stm8(注:個(gè)別將軟件安裝到別的路 徑下,請(qǐng)自行分析替換)路徑下的config 文件夾。Config 文件夾如圖 1.3- 14 所 示。如果沒(méi)有這一步的話,會(huì)影響以后程序的下載。如果在安裝過(guò)程中忘了這一 步,之后不用重新安裝軟件,直接加上這一步即可。


圖 1.3- 14 config 文件夾
至此,IAR 軟件就全部安裝完畢了,你會(huì)在開(kāi)始菜單->所有程序中看到一 個(gè) IAR 的相關(guān)文件夾。操作如圖 1.3- 15 所示。





圖 1.3- 15 開(kāi)始菜單中的 IAR


1.4如何新建工程


1.4.1建立工程


首 先 , 點(diǎn) 擊 開(kāi) 始 菜 單 , 選 擇 所 有 程 序 ->IAR Systems->IAR Embedded
Workbench              for              STMicroelectronics              STM8              1.30              Evaluation->IAR              Embedded
Workbench,啟動(dòng) IAR。操作如圖 1.4- 1 所示。


圖 1.4- 1 啟動(dòng) IAR
啟動(dòng)之后如圖 1.4- 2 所示:






圖 1.4- 2 IAR 運(yùn)行界面
選擇 File>New>Workspace,新建一個(gè) Workplace,用來(lái)放置當(dāng)前要建立的 工程,操作如圖 1.4- 3 所示。


圖 1.4- 3 建立 Workplace
再點(diǎn)擊 Project>Create New Project,如圖 1.4- 4 所示:





圖 1.4- 4 建立工程
彈出對(duì)話框,如圖 1.4- 5 所示:


圖 1.4- 5 工程類型
Tool chain 默認(rèn)是 STM8 Series。 無(wú)需再選擇。這里的工程可以建成四種, 空工程,匯編 ASM,基于 C++或者是 C 語(yǔ)言的,我們這里選擇的是 C, 然后點(diǎn) 擊 OK,彈出保存工程的對(duì)話框,如圖 1.4- 6 所示:






圖 1.4- 6 保存工程對(duì)話框
通常,為了方便區(qū)分每個(gè)工程和便于日后的管理與調(diào)試,往往將每個(gè)工程用 單獨(dú)的文件夾來(lái)保存,所以,筆者建議在這個(gè)步驟多新建一個(gè)文件夾,用來(lái)保存 新建的工程,點(diǎn)擊新建文件夾,取名為“my_first_project”,操作如圖 1.4- 7 所 示。






圖 1.4- 7 新建工程文件夾
雙擊打開(kāi)此文件夾,然后在文件名一欄寫入工程的名字 my_first_program, 然后點(diǎn)擊保存,操作如圖 1.4- 8 所示。
圖 1.4- 8 保存工程




工程建好之后,要保存一下 Workplace,選擇 File>Save Workspace。操作如 所圖 1.4- 9 所示。


圖 1.4- 9 保存 Workplace
指 定 要 保 存 的 路 徑 , 并 輸 入              workspace 的 名 字 , 我 們 這 里 取 名 為
my_first_workplace。





圖 1.4- 10 Workplace 名稱
一般情況下,project 和 Workplace 的名字最好保持一致,便于以后的管理, 這里,筆者為了讓你更好的區(qū)分 project 和 Workplace,所以取了不同的名字。至 此,整個(gè)工程基本上就建好了,界面如圖 1.4- 10 所示。工程建立完畢后的 IAR 界面如圖 1.4- 11 所示。
圖 1.4- 11 工程建立完畢后的 IAR 界面




1.4.2工程的選項(xiàng)配置


選 擇 Project>Options , 或 者 在 Workspace 窗 口 , 選 中 project 名 字 , 右 擊 選 擇 選 擇 “Options…”。操作如圖 1.4-12 所示。







彈出 Options 的對(duì)話框:
圖 1.4- 12 工程選項(xiàng)配置




1)在 Category 中,選擇“General Options”,如圖 1.4- 13所示:
在 Target 的 Device 中,選擇相應(yīng)的 MCU 型號(hào) STM8S103K3U。其他選 擇默認(rèn)。




圖 1.4- 13 配置中的 General Options
這里要提一下,雖然我們學(xué)習(xí)板上的單片機(jī)型號(hào)為 STM8S103K3,但是在這 里我們要選擇 STM8S103K3U,這可能就是 IAR 軟件與單片機(jī)不兼容造成的,不 過(guò)別擔(dān)心,這并不會(huì)影響我們對(duì)單片機(jī)的正常使用的。
2)              在 Category 中,選擇 C/C++Compiler,顯示 compiler 選項(xiàng)頁(yè),操作如圖
1.4- 14所示。


圖 1.4- 14 配置中的 C/C++Compiler 中的 Language




選擇 Output list file, 勾選輸出列表文件,操作如圖 1.4- 15 所示。


圖 1.4- 15 配置中 C/C++Compiler 中的 List
3)              在 Category 中,選擇 Assembler,顯示 Assembler 選項(xiàng)頁(yè),操作如圖 1.4- 16
所示。


圖 1.4- 16 配置中的 Assembler 中的 Language




4)              在 Category 中,選擇 Output Converter,顯示 Output Converter 選項(xiàng)頁(yè) ,操 作如圖 1.4- 17所示。

圖 1.4- 17 配置中的 Output Converter
在 Debug\Exe 目錄中,產(chǎn)生目標(biāo)文件。IAR 默認(rèn)的是.out 文件。而我們的 下載器只識(shí)別.hex 文件,此處 Output format 選擇 Intelextended,然后勾選 Override default。
5)              在 Category 中,選擇 Linker,顯示 Linker 選項(xiàng)頁(yè),config操作如圖 1.4- 18
所示,list操作如圖 1.4- 19所示。





圖 1.4- 18 配置中的 Linker 中的 config


圖 1.4- 19 配置中的 Linker 中的 list
選中 Generate linker map file,生成鏈接映像文件。
6) 在 Category 中,選擇 Debugger,顯示 Debugger 選項(xiàng)頁(yè),這里主要配置下




載程序的方式,因?yàn)槲覀冇玫氖谴谙螺d程序,所以這一步配置不是很重要,
操作如圖 1.4- 20所示。
圖 1.4- 20 配置中的 Debugger
最后點(diǎn)擊“OK”,就完全配置好了。

1.5如何下載程序


1.5.1文件的編譯與連接


在代碼編輯區(qū),我們先輸入一段寫好的點(diǎn)亮 led 燈的程序,(此段代碼可以在 基礎(chǔ)篇>點(diǎn)亮 led 燈里找到,這里引用只是為了講解如何下載程序,詳細(xì)代碼分 析請(qǐng)參看第二章),如圖 1.5- 1 所示:






圖 1.5- 1 在 IAR 中輸入程序
然后我們點(diǎn)擊“Compiled”,編譯一下,操作如圖 1.5- 2 所示:


圖 1.5- 2 編譯程序
可以看到下面“Build”一欄中沒(méi)有錯(cuò)誤,如圖 1.5- 3 所示:


圖 1.5- 3 Build 錯(cuò)誤顯示欄
然后我們?cè)邳c(diǎn)擊“Make”圖標(biāo),如圖 1.5- 4 所示:


圖 1.5- 4 Make 程序
“Build”一欄中顯示如圖 1.5- 5 所示:





圖 1.5- 5 Make 后的 Build 欄
沒(méi) 有 錯(cuò) 誤 和 警 告 , 這 時(shí) 候 , 在 我 們 所 建 的 工 程 目 錄 D:\......\ 基 礎(chǔ) 篇
\my_first_project\Debug\Exe 下,出現(xiàn) my_first_program.hex 和 my_first_program.out 兩個(gè)文件,其中,my_first_program.hex 文件是我們將要下載的文件,如圖 1.5- 6 所示。


圖 1.5- 6 hex 文件

1.5.2程序的下載


關(guān)于 Downloder 軟件的安裝與注冊(cè)以及串口驅(qū)動(dòng)的安裝,請(qǐng)參考 1.2,這里 不再贅述。將硬件跳帽連接好,USB 線連接上電腦的 U口,操作如圖 1.5- 7 所 示:






圖 1.5- 7 led 燈的硬件連接實(shí)物圖
選擇“開(kāi)始”菜單,所有程序——>微云電子出品文件夾——>Downloader,
打開(kāi) Downloder,如圖 1.5- 8 所示:






圖 1.5- 8 下載器運(yùn)行界面
點(diǎn)擊下載器按鈕,選擇相應(yīng)的串口(串口號(hào)在設(shè)備管理器里可以看到),若 沒(méi)有出來(lái)串口可點(diǎn)擊一下刷新,如圖 1.5- 9 所示。





圖 1.5- 9 下載器串口操作
然后點(diǎn)擊右下角的下一步,出現(xiàn)界面如圖 1.5- 10 所示:


圖 1.5- 10 下載 hex 文件界面

點(diǎn)擊右側(cè)的按鈕,選擇上面已經(jīng)編譯好的 hex 文件,文件在工程目錄
\my_first_project\Debug\Exe 下,然后點(diǎn)擊確定,操作如圖 1.5- 11 所示。




圖 1.5- 11 下載 hex 文件操作
再次點(diǎn)擊下一步按鈕,就會(huì)彈出一個(gè)對(duì)話框,提示下載成功,如圖 1.5- 12
所示。
圖 1.5- 12 下載成功界面




這時(shí)候,跳上 J7 的跳線帽就可以看到我們的基礎(chǔ)型學(xué)習(xí)板上中間的小燈點(diǎn) 亮了,如圖 1.5- 13 所示。

圖 1.5- 13 led 燈照亮實(shí)物圖

1.6特別注意


由于本款單片機(jī)學(xué)習(xí)板是 STM8 和 51 單片機(jī)二合一的板子,很多口都是復(fù) 用的,所以在調(diào)試 STM8 的時(shí)候,確定要將 51 設(shè)置成高阻輸出狀態(tài)。也就是說(shuō) 下載一個(gè)配置程序 P3M 到 51 單片機(jī)里就行了,該程序在目錄 51 程序/內(nèi)。

2章              基礎(chǔ)學(xué)習(xí)篇


2.1GPIO應(yīng)用之點(diǎn)亮 LED


2.1.1STM8GPIO口原理簡(jiǎn)介


GPIO 口即通用輸入/輸出口用于芯片和外部進(jìn)行數(shù)據(jù)傳輸。一個(gè) IO 端口可 以包括多達(dá) 8 個(gè)引腳,每個(gè)引腳可以被獨(dú)立編程作為數(shù)字輸入或者數(shù)字輸出口。 我們這款單片機(jī)在 STM8 家族中算比較簡(jiǎn)單的,只有 PA,PB,PC,PD ,PE 五個(gè)口。每個(gè) IO 口都分配五個(gè)寄存器,它們是:一個(gè)輸出數(shù)據(jù)寄存器 ODR,一 個(gè)輸入引腳寄存器 IDR,一個(gè)數(shù)據(jù)方向寄存器 DDR,一個(gè)選擇寄存器 CR1,和 一個(gè)配置寄存器 CR2。一個(gè) I/O 口工作在輸入還是輸出是取決于該口的數(shù)據(jù)方向 寄存器的狀態(tài)。 對(duì)于常用的幾個(gè)寄存器介紹如下:




注意:每一個(gè)端口寄存器位驅(qū)動(dòng)相應(yīng)的端口的引腳 。

圖 2.1- 1 DDR 寄存器
Px_DDR 寄存器用來(lái)配置 IO 口的輸入或輸出模式,在這里,我們要點(diǎn)亮 led 燈,所以要把與 led 燈相連的口配置成輸出模式。與 led燈相連的是 PD4 口,所 以在寫代碼的時(shí)候要把 PD4 口的 DDR 寄存器置 1,DDR 寄存器如圖 2.1- 1 所示。

圖 2.1- 2 ODR 寄存器
Px_ODR 寄存器,通常只在 IO 口配置成輸出的時(shí)候起作用,ODR 寄存器里 的值,表示在輸出模式下,IO 口引腳上的值。所以,要想把 IO 口的某一個(gè)或多 個(gè)引腳置高或置低,只需操作 ODR 即可,ODR 寄存器如圖 2.1- 2 所示。




圖 2.1- 3 IDR 寄存器
當(dāng) IO 口配置為輸入時(shí),可從此寄存器讀取當(dāng)前 IO 口的狀態(tài)值。在這里我們 暫時(shí)還用不到這個(gè) IDR 寄存器,IDR 寄存器如圖 2.1- 3所示。


圖 2.1- 4 CR1 寄存器
通常,模擬開(kāi)漏輸出需要外接上拉電阻,驅(qū)動(dòng)能力較強(qiáng),推挽輸出不需要外 接電阻,驅(qū)動(dòng)能力較弱,對(duì)于 led 的點(diǎn)亮,推挽輸出足以,所以我們通常將 IO 口配置為推挽輸出。當(dāng)然,也有配置為開(kāi)漏輸出的時(shí)候,在以后會(huì)遇到。CR1 寄存器如圖 2.1- 4 所示。




圖 2.1- 5 CR2 寄存器
CR2 控制寄存器多用來(lái)在輸入模式下控制外部中斷,在輸出模式下,作用不 大,此款單片機(jī)雖然可以最高外接 25M 晶振,但我們還用不到那么高的速度, 所以,IO 的輸出速度也可以不必關(guān)心。CR2 寄存器如圖 2.1- 5 所示。
至此,我們已經(jīng)把 GPIO 口的所有寄存器了解完畢了。

2.1.2硬件連接原理


LED 燈部分及單片機(jī)的學(xué)習(xí)板上的原理圖如圖 2.1- 6 所示:

圖 2.1- 6 LED 燈硬件原理圖
根據(jù)上面兩個(gè)原理圖來(lái)看:?jiǎn)纹瑱C(jī)的第 29 腳,即 PD4 口通過(guò)名為 BEEP 的 線連接到 J7 跳帽的 2 引腳,J7 跳帽的 1 腳連接著一個(gè)電阻和一個(gè) led 燈串聯(lián)后 接地,由此我們可以判斷,要想讓 led 小燈亮,就是讓 PD4 口置為高電平即可(若 將 J7 的跳帽接到 2,3 腳,則可以驅(qū)動(dòng)蜂鳴器)。

2.1.3原工程詳解


由以上兩小節(jié)我們可知,點(diǎn)亮 led 燈只需配置 PD4 口就好,且看以下代碼:




#include<iostm8s103k3.h>              //將 MCU  型號(hào)(stm8s103k3)的頭文件加進(jìn) 來(lái)
int main( void )
{
PD_DDR |=0x10;              //將 PD.4 設(shè)置成輸出模式 PD_CR1 |=0x10;              //將 PD.4 設(shè)置成推挽輸出方式 PD_CR2 &=~0x10;              //設(shè)置 PD.4 輸出速率最大為 2MHZ
PD_ODR |=0x10;              //將 ODR 寄存器的第 4 位置 1,即 PD.4=1;
while(1);              //始終循環(huán),程序停在此處
}
這里只有一個(gè)主函數(shù),每個(gè)寄存器包括八位,分別控制 PD0~PD7 八個(gè)引腳, 這里與 led 燈相連的是 PD4,
PD_DDR |=0x10;就是 DDR 與十六進(jìn)制數(shù) 10(即二進(jìn)制 00010000)相或。 因?yàn)槿魏螖?shù)與 0 相或都不變,與 1 相或則為 1,所以“或”有置位的效果,從右 邊低位 0 位算起,第五個(gè)數(shù)恰好是 PD4 口,所以此句話相當(dāng)于 PD4 設(shè)置成輸出 模式。PD_CR1 |=0x10; PD_ODR |=0x10; 兩句是同樣的道理。
PD_CR2 &= ~0x10;              ~是指取反符號(hào),~0x10 就是 0xef,此句就是 CR2 與 fe
(即二進(jìn)制 11101111)相與,因?yàn)槿魏螖?shù)與 1 相與都不變,與 0 相與則必為 0, 所以“或”有清零的效果,所以此句話相當(dāng)于把 CR2的第 4 位清零(即最大擺 率設(shè)為 2MHZ)。這是操作八位寄存器的常用習(xí)慣語(yǔ)句,它的好處就是,可以不 影響其他的引腳而直接操作你想操作的位,以后我們會(huì)經(jīng)常用到。
PD_ODR |=0x10; 此句相當(dāng)于直接把已設(shè)置成輸出的 PD4 口直接拉成高電 平。
while(1);是個(gè)死循環(huán),讓程序停在此處,防止程序跑飛。 至此,我們按照上一章的講解,新建一個(gè)工程,把上面的代碼編輯好,編譯
一下,下載到板子上,注意跳帽的連接,至少連接四個(gè)哦,就可以看到中間的 led
燈亮了。

2.1.4學(xué)習(xí)拓展:閃爍 led


想讓 led 燈閃爍,其實(shí)就是讓燈亮一會(huì),再滅一會(huì),也就是 ODR 這個(gè)寄存器 置高再清零的過(guò)程,但是單片機(jī)若只操作 ODR 寄存器,人的肉眼是看不到 led 燈變化的,所以中間可加一個(gè)延時(shí)函數(shù)。
#include<iostm8s103k3.h>
#define u8 unsigned char              //為了方便編程,以下的程序中的
#define u16 unsigned int              //unsigned char 都可以用 u8 表示。

#define u32 unsigned long void Clk_Config(void)

{
CLK_CKDIVR= 0x00;              //系統(tǒng)時(shí)鐘 1 分頻
while(!(CLK_ICKR & 0x02));              //等待 HSI 準(zhǔn)備好


}
void Io_Config(void)




{
PD_DDR |= 0x10;              //PD4 設(shè)置為輸出 PD_CR1 |= 0x10;              //推挽輸出 PD_CR2 &= ~0x10;                            //輸出高電平
}
void delay(u16 n)
{
u16 i,j;
while(n --)
{
for(i = 0;i < 32;i ++)
for(j = 0;j < 10;j ++);
}
}
int main( void )
{

//                            Clk_Config(); Io_Config(); while(1)

{

PD_ODR |=0x10; delay(500); PD_ODR &=~0x10; delay(500);

}
}
這里出現(xiàn)了幾個(gè)新的函數(shù)。
Io_Config();這里把 IO 口的配置寫成了一個(gè)子函數(shù),這樣使整個(gè)程序思路更 清晰。
delay();延時(shí)函數(shù),在默認(rèn)時(shí)鐘為 2MHZ 時(shí)大約為 1ms,delay(500)就是 延時(shí) 500ms。
Clk_Config();主要是為了配置時(shí)鐘,單片機(jī)默認(rèn)是 2MHZ 的時(shí)鐘,只要改 變 CLK_CKDIVR 寄存器的值就可以改變系統(tǒng)的時(shí)鐘,設(shè)成 0x00 則是將系統(tǒng)時(shí) 鐘提高到 16MHZ,所以如果在主函數(shù)里加上這個(gè)配置函數(shù)的話,程序就會(huì)變快。 有興趣的童鞋可以把這一句加上(去掉主函數(shù)里這個(gè)子函數(shù)前面的//就好啦),看 一下燈閃的是不是快了。

2.2GPIO應(yīng)用之蜂鳴器


蜂鳴器是現(xiàn)在單片機(jī)應(yīng)用系統(tǒng)中很常見(jiàn)的,常用于實(shí)現(xiàn)報(bào)警功能。蜂鳴器一 般分為有源和無(wú)源兩種,有源的蜂鳴器只要給它兩端加電,就可以響。而無(wú)源蜂 鳴器則需要給加一個(gè)有頻率的方波,才可以響。為了更好地學(xué)習(xí)和了解蜂鳴器的 原理,我們這套板子配的是無(wú)源的蜂鳴器。




2.2.1STM8的蜂鳴器原理簡(jiǎn)介


其實(shí),由上一節(jié)的介紹可知,驅(qū)動(dòng)蜂鳴器和驅(qū)動(dòng) led 燈的 IO 口是同一個(gè),即
PD4,所以,我們只要把 J7 的跳帽往左一換,如圖 2.2- 1 所示:











圖 2.2- 1 蜂鳴器硬件連接實(shí)物圖
蜂鳴器就會(huì)響了。但我們這款單片機(jī) STM8 特別集成了蜂鳴器模塊,可直接 產(chǎn)生 1K,2K 或 4KHZ 的方波,應(yīng)用起來(lái)非常方便。所以,我們著重介紹內(nèi)置蜂 鳴器模塊的原理,同時(shí)也可以更進(jìn)一步的了解直接操作寄存器的原理。
STM8 單片機(jī)一共有四個(gè)不同的時(shí)鐘源,它們是:
               1-24MHz 高速外部晶體振蕩器(HSE)
               最大 24MHz 高速外部時(shí)鐘信號(hào)(HSE user-ext)
               16MHz 高速內(nèi)部 RC 振蕩器(HSI)
               128KHz 低速內(nèi)部 RC(LSI)
在應(yīng)用蜂鳴器模塊時(shí),首先要使能片內(nèi)的低速 RC 振蕩器(當(dāng)然也能使用外 部的高速時(shí)鐘),其頻率為 128KH,通過(guò)操作CLK_ICKR 的 LSIEN 位來(lái)實(shí)現(xiàn)。 CLK_ICKR 寄存器如圖 2.2- 2 所示。





圖 2.2- 2 CLK_ICKR 寄存器
注:對(duì)于該寄存器的更詳細(xì)的講解請(qǐng)參考STM8S微控制器手冊(cè)
其次就是要配置 BEEP_CSR 寄存器了。BEEP_CSR 寄存器如圖 2.2- 3 所示。






圖 2.2- 3 BEEP_CSR 寄存器
設(shè)置蜂鳴器控制寄存器 BEEP_CSR 中的 BEEPDIV[4:0]來(lái)分頻獲取 8KHZ 的 時(shí)鐘,再通過(guò) BEEPSEL 最終產(chǎn)生 1KHZ、2KHZ 或4KHZ 的蜂鳴信號(hào),最后使 能該寄存器中的 BEEPEN 位,產(chǎn)生蜂鳴器的輸出。 蜂鳴器控制寄存器的設(shè)置:
首先設(shè)置蜂鳴器的預(yù)分頻器:BEEPDIV[4:0] = 0e 時(shí),BEEPDIV=16; 再設(shè)置 BEEPSEL[1:0]進(jìn)行蜂鳴器頻率選擇:
BEEPSEL[1:0]              蜂鳴器頻率
00:              輸出 fls/(8*BEEPDIV)kHz (輸出 1kHz)
01:              輸出 fls/(4*BEEPDIV)kHz (輸出 2kHz)
1x:              輸出 fls/(2*BEEPDIV)kHz (輸出 4kHz)
最后將 BEEPEN 位置 1,使能蜂鳴器功能;

2.2.2硬件連接原理


本節(jié)的硬件連接在上一節(jié)已經(jīng)提過(guò),這里不再重復(fù)。




2.2.3原工程詳解


以下是蜂鳴器產(chǎn)生 1kHz 信號(hào)程序:


#include<iostm8s103k3.h>
#define u8 unsigned char
#define u16 unsigned int

#define u32 unsigned long void Clk_Config(void)

{
CLK_ICKR=0x08;                //選擇 LSI 低速時(shí)鐘 128KHz CLK_CKDIVR &= 0xf8;                            //實(shí)現(xiàn)系統(tǒng)時(shí)鐘 1 分頻; while(!(CLK_ICKR & 0x10));              //等待 LSI 準(zhǔn)備好
}
int main( void )
{
Clk_Config();              //時(shí)鐘初始化
BEEP_CSR= 0X2e;              //使能蜂鳴器,設(shè)置蜂鳴器產(chǎn)生 1KHz




信號(hào);





}

while(1)              //無(wú)限循環(huán)
{
}




修改蜂鳴器控制寄存器 BEEP_CSR 的值,就可以輸出 1、2、4KHz 的蜂鳴信 號(hào)。BEEP_CSR=0x2e==>1kHz;BEEP_CSR=0x6e==>2kHz;
BEEP_CSR=0xee 或 0xae==>4kHz;

2.3定時(shí)器應(yīng)用之 8位定時(shí)器點(diǎn)亮 LED(帶中斷)


STM8S 提 供 三 種 類 型 的 TIM 定 時(shí) 器 : 高 級(jí) 控 制 型 (TIM1) 、 通 用 型 (TIM2/TIM3/TIM5)和基本型定時(shí)器(TIM4/TIM6)。它們雖有不同功能但都基于共 同的架構(gòu)。此共同的架構(gòu)使得采用各個(gè)定時(shí)器來(lái)設(shè)計(jì)應(yīng)用變得非常容易與方便 (相同的寄存器映射,相同的基本功能)。
這里,我們配合 led 燈,以 TIM4 為例,介紹一下基本定時(shí)器的用法。

2.3.1STM8的基本定時(shí)器原理簡(jiǎn)介


定時(shí)器 TIM4 的功能包括:
8 位向上計(jì)數(shù)的自動(dòng)重裝載計(jì)數(shù)器,即計(jì)數(shù)器從 0 開(kāi)始計(jì)數(shù),計(jì)到自動(dòng)重裝 載計(jì)數(shù)器 ARR 里的值時(shí),再重新重 0 開(kāi)始計(jì)數(shù)。
               3 位可編程的預(yù)分頻器(可在運(yùn)行中修改),提供 1,2,4,8,16,32,64 和 128 這 8
中分頻比例。




               在計(jì)數(shù)器更新時(shí):即計(jì)數(shù)器溢出,可產(chǎn)生更新中斷。 基本定時(shí)器較其他定時(shí)器相比相對(duì)簡(jiǎn)單,下面我們介紹一下與我們這節(jié)的實(shí)
驗(yàn)密切相關(guān)的幾個(gè)通用定時(shí)器的寄存器。


圖 2.3- 1 TIMx_CRI 寄存器
這個(gè)定時(shí)器的主要作用是第 0 位 CEN 和第 7 位 APPRE,用來(lái)使能計(jì)數(shù)器和 預(yù)裝載。TIMx_CRI 寄存器如圖 2.3- 1 所示。






圖 2.3- 2 TIMx_IER 寄存器
如果需要開(kāi)啟計(jì)數(shù)器中斷的話,就把 TIM4_IER 寄存器的第 0 位 UIE 置 1,
TIM4 只有一個(gè)溢出中斷,即當(dāng)計(jì)數(shù)器計(jì)滿時(shí)所產(chǎn)生的中斷。IER 寄存器如所圖
2.3- 2 示。





圖 2.3- 3 SR 寄存器
狀態(tài)計(jì)數(shù)器 TIM4_SR 通常都是由硬件自動(dòng)置位,STM8 也是通過(guò) UIF 位來(lái) 判斷是否進(jìn)入中斷的,所以在中斷函數(shù)里,我們往往要手動(dòng)的清除 UIF 位,以 免發(fā)生重復(fù)進(jìn)入中斷的錯(cuò)誤。SR 寄存器如圖 2.3- 3 所示。
注:由于我們參考的是整個(gè)STM8S家族的微控制器手冊(cè),對(duì)于不同型號(hào)的 MCU難免有微小的差別,這里,在程序里TIM4的狀態(tài)寄存器為TIM4_SR,而并 不是TIM4_SR1,對(duì)于這些微小的差別,可查詢iostm8s103k3.h的頭文件。


圖 2.3- 4 CNTR 寄存器
記錄計(jì)數(shù)器的當(dāng)前值,可不需要配置,在編輯程序的過(guò)程中,可通過(guò)此計(jì)數(shù) 器里的值,判斷已計(jì)了多少時(shí)間。CNTR 寄存器如圖2.3- 4 所示。


圖 2.3- 5 PSCR 寄存器
舉個(gè)例子,比如單片機(jī)的系統(tǒng)時(shí)鐘為 2MHZ,而 TIM4_PSCR 計(jì)數(shù)器為 0x02, 那么,定時(shí)器 TIM4 的工作頻率就是2M/2^2=0.5MHZ,換句話說(shuō)就是計(jì)數(shù)器 CNTR 每增加 1,計(jì)數(shù)器就計(jì) 2us。PSCR 寄存器如圖 2.3- 5 所示。





圖 2.3- 6 ARR 寄存器
當(dāng)計(jì)數(shù)器計(jì)到該寄存器里的值時(shí),又重新返回 0,重新計(jì)數(shù)。如果開(kāi)啟中斷 的話,將產(chǎn)生更新中斷。ARR 寄存器如圖 2.3- 6 所示。
只要對(duì)以上幾個(gè)寄存器進(jìn)行簡(jiǎn)單的設(shè)置,我們就可以使用定時(shí)器了,并且可 以產(chǎn)生中斷。
這一節(jié),我們將使用定時(shí)器產(chǎn)生中斷,然后在中斷服務(wù)函數(shù)里面翻轉(zhuǎn) led 上 的電平,來(lái)指示定時(shí)器中斷的產(chǎn)生。接下來(lái)我們來(lái)說(shuō)明要經(jīng)過(guò)哪些步驟,才能達(dá) 到這個(gè)要求,并產(chǎn)生中斷。
1)設(shè)置 TIM4_ARR 和 TIM4_PSCR 的值。 通過(guò)這兩個(gè)寄存器,我們來(lái)設(shè)置自動(dòng)重裝的值,以及分頻系數(shù)。這兩個(gè)參數(shù)
加上時(shí)鐘頻率就決定了定時(shí)器的溢出時(shí)間。
2)設(shè)置 TIM4_IER 允許更新中斷。
因?yàn)槲覀円褂?TIM4 的更新中斷,所以設(shè)置 IER 的 UIE 位,并使能觸發(fā)中 斷。
3)允許 TIM4 工作。 光配置好定時(shí)器還不行,沒(méi)有開(kāi)啟定時(shí)器,照樣不能用。我們?cè)谂渲猛旰笠?/div>
開(kāi)啟定時(shí)器,通過(guò) TIM4_CR1 的 CEN 位來(lái)設(shè)置。
6)編寫中斷服務(wù)函數(shù)。 在最后,還是要編寫定時(shí)器中斷服務(wù)函數(shù),通過(guò)該函數(shù)來(lái)處理定時(shí)器產(chǎn)生的
相關(guān)中斷。在中斷產(chǎn)生后,通過(guò)狀態(tài)寄存器的值來(lái)判斷此次產(chǎn)生的中斷屬于什么 類型。然后執(zhí)行相關(guān)的操作,我們這里使用的是更新(溢出)中斷,所以在狀態(tài) 寄存器 SR 的最低位。在處理完中斷之后應(yīng)該向 TIM4_SR 的最低位寫 0,來(lái)清除 該中斷標(biāo)志。
通過(guò)以上幾個(gè)步驟,我們就可以達(dá)到我們的目的了,使用基本 8 位定時(shí)器的 的更新中斷,來(lái)控制外部 led 的翻轉(zhuǎn)。

2.3.2硬件連接原理


同樣是點(diǎn)亮 led 燈的電路原理。




2.3.3原工程詳解


打開(kāi)基礎(chǔ)篇的程序,找到 8 位定時(shí)器控制 led 燈的例程,首先還是包括頭文 件,幾個(gè)宏定義以及延時(shí)函數(shù):
#include<iostm8s103k3.h>
#include <intrinsics.h>
#define u8 unsigned char
#define u16 unsigned int

#define u32 unsigned long void delay(u16 n)

{
u16 i,j;
while(n --)
{
for(i = 0;i < 32;i ++)
for(j = 0;j < 10;j ++);



}
}
然后是系統(tǒng)的時(shí)鐘配置和 led 燈所占的 IO 口配置
void Clk_Config(void)
{
CLK_CKDIVR= 0x00;              //系統(tǒng)時(shí)鐘 1 分頻
while(!(CLK_ICKR & 0x02));              //等待 HSI 準(zhǔn)備好


}
void Io_Config(void)
{
PD_DDR |= 0x10;              //PD4 設(shè)置為輸出 PD_CR1 |= 0x10;              //推挽輸出 PD_CR2 &= ~0x10;                            //輸出高電平
}
然后就是定時(shí)器的配置了。
void Tim4_Init(void)
{
TIM4_PSCR = 6;              //64 分頻得到 250KHZ 的定時(shí)器時(shí)鐘,
定時(shí)器加 1 就是 4us
TIM4_ARR = 0xfa;              //1ms 中斷一次 TIM4_IER_UIE = 1;              //更新中斷使能 TIM4_CR1_ARPE =1;                            //預(yù)裝載使能 TIM4_CR1_CEN = 1;                            //啟動(dòng)計(jì)數(shù)器
}




由上面可以看出,定時(shí)器定時(shí)一周為 1ms。在這里,我們可以看到第 3,4,5 句和我們之前配置寄存器的方式不太一樣,其實(shí) STM8單片機(jī)是可以按位尋址 的,這些位的定義在頭文件 iostm8s103k.h 可以查看到,如圖 2.3- 7 所示:


圖 2.3- 7 iostm8s103k 頭文件
紅框內(nèi)我們可以看到,我們可以直接對(duì) CR1 寄存器的 CEN 位操作。
int main( void )
{

Clk_Config(); Io_Config(); Tim4_Init();

enable_interrupt();
while(1){}
}
在主函數(shù)里除了對(duì)系統(tǒng)時(shí)鐘,IO 口,定時(shí)器的配置之外,還要開(kāi)啟全局中斷, 單片機(jī)有很多中斷,每個(gè)中斷都有自己相應(yīng)的寄存器來(lái)開(kāi)啟中斷,但 STM8 和
51 一樣,必須開(kāi)啟一個(gè)總中斷。在 STM8 的參考手冊(cè)里對(duì)開(kāi)總中斷的指令可如 圖 2.3- 8 所示:






圖 2.3- 8 中斷指令
在 IAR 中可以用 asm()函數(shù)來(lái)調(diào)用匯編指令,所以這里可以寫 asm(“rim”); 來(lái)開(kāi)啟總中斷。但還有另外一種方式,就是調(diào)用enable_interrupt();此函數(shù)包含 在頭文件 intrinsics.h 里,具體的內(nèi)容,可以參考 IAR 的 help 相關(guān)文檔,這里就 不多介紹了。
最后是中斷子函數(shù),也是最重要的地方。
#pragma vector = TIM4_OVR_UIF_vector
interrupt root void TIM4_UIF_HANDLER(void)
{
static u16 i;
i++;
if(i == 1000)
{

i = 0; PD_ODR_ODR4=~PD_ODR_ODR4;

}
TIM4_SR_UIF = 0;
}
#pragma vector 是 IAR 中斷向量指令,是固定的,iostm8s103k3.h 文件中如 所圖 2.3- 9 所示。


圖 2.3- 9 iostm8s103k3 中的中斷向量指令




TIM4_OVR_UIF_vector 實(shí)際上就是 0x19,是中斷向量的編號(hào),一旦有中斷 產(chǎn)生時(shí),CPU 憑借中斷向量編號(hào)進(jìn)入中斷子函數(shù)。那么中斷向量編號(hào)是如何確 定的呢?
STM8 的 FLASH 地址是從 0x00800 開(kāi)始,IAR 的中斷編號(hào)從 0  開(kāi)始。中 斷向量號(hào)依次按照中斷地址遞增。如: 復(fù)位向量是0x008000,中斷向量號(hào)是
0x00; TRAP 的中斷地址是 0x008004,中斷向量號(hào)是 0x01;SPI 中斷向量號(hào) 是 0x0C;中斷向量如圖 2.3- 10 所示。


圖 2.3- 10 中斷向量
圖中,我們可以看出,TIM4 的更新(溢出)中斷所對(duì)應(yīng)的中斷地址是
0x008068,中斷向量號(hào)是 0x19;當(dāng)然,我們也可以不需要這么麻煩的去計(jì)算向 量編號(hào),我們可以在建好的工程左邊,雙擊iostm8s103k3.h 頭文件,就可以直接 用它的宏定義就可以了,就像上面用到的一樣,操作如圖 2.3- 11 所示。





圖 2.3- 11 工程中的頭文件
interrupt   void   interrupt_handler(void):   是 聲 明 一 個(gè) 中 斷 函 數(shù) , 注 意
interrupt 是兩個(gè)下劃線,interrupt_handler 是中斷函數(shù)名字,可自己定義。
static u16 i;
這是定義了一個(gè)靜態(tài)變量 i,定時(shí)器每隔 1ms 中斷一次,每中斷一次,i 就自 加 一 次 , 當(dāng) 加 到 1000  時(shí) , 正 好 是 1s , 這 時(shí) , i清 零 , 重 新 計(jì) 數(shù) , PD_ODR_ODR4=~PD_ODR_ODR4;表示 led 燈翻轉(zhuǎn),所以整個(gè)程序就實(shí)現(xiàn)了定時(shí) 器定時(shí) 1s 閃爍 led 燈的功能了。

TIM4_SR_UIF = 0; 前面已經(jīng)提到,此位必須每次清零,否則會(huì)導(dǎo)致重復(fù)中斷。 至此,我們已經(jīng)把所有的代碼都詳細(xì)講解過(guò)了,按照之前的講解,編譯一下

工程,連接好板子,下載程序之后就可以看到 led 燈按照 1s 的速度閃爍了。

2.3.4學(xué)習(xí)拓展:16位定時(shí)器控制 led


8 位定時(shí)器計(jì)數(shù)最大值也就是 255,所以想定時(shí)時(shí)間大一點(diǎn),就不得不用變 量 i 來(lái)計(jì)數(shù)了,若是十六位計(jì)數(shù)器的話,就不一樣了,16位通用計(jì)數(shù)器最大可以 計(jì)數(shù)到 65535,所以計(jì)數(shù)的尺度很大,以定時(shí)器 TIM2 為例,我們看一下 16 位定 時(shí)器如何控制 led 燈,我們只列出與 TIM4 不一樣的地方。
void Tim2_Init(void)
{
TIM2_PSCR = 6;              //64 分頻得到 1/32MHZ 的定時(shí)器時(shí)鐘,
//定時(shí)器加 1 就是 32us
TIM2_ARRH = 0x7a;              //1s 中斷一次
TIM2_ARRL = 0x12;
TIM2_IER_UIE = 1;              //更新中斷使能 TIM2_CR1_ARPE = 1;                            //預(yù)裝載使能TIM2_CR1_CEN = 1;                            //啟動(dòng)計(jì)數(shù)器
}
#pragma vector = TIM2_OVR_UIF_vector
interrupt root void TIM4_UIF_HANDLER(void)
{




PD_ODR_ODR4=~PD_ODR_ODR4; TIM2_SR1_UIF = 0;

}
計(jì)數(shù)器加 1 為 32us,ARR 寄存器的值為 0x7a12,即 31250,所以計(jì)數(shù)一周 正好是 1s,所以在中斷函數(shù)里我們只要翻轉(zhuǎn) PD4 口就可以了。

2.4UART通用異步收發(fā)器


2.4.1STM8串口簡(jiǎn)介


作為軟件開(kāi)發(fā)重要的調(diào)試手段,串口的作用是很大的。在調(diào)試的時(shí)候可以用 來(lái)查看和輸入相關(guān)的信息。在使用的時(shí)候,串口也是一個(gè)和外設(shè)(比如 GPS,GPRS 模塊等)通信的重要渠道。
STM8S 家族共有 UART1,UART2,UART3,三組串口,不同型號(hào)的單片機(jī)內(nèi) 置不同的串口,有的 STM8 內(nèi)置有兩個(gè)串口,這里我們這款單片機(jī)內(nèi)置的是 UART1。接下來(lái)我們將從寄存器層面,告訴您如何設(shè)置串口,以達(dá)到我們最基 本的通信功能。本實(shí)例中,我們將實(shí)現(xiàn)利用串口 1 接收從串口發(fā)過(guò)來(lái)的數(shù)據(jù),把 發(fā)送過(guò)來(lái)的數(shù)據(jù)直接送回給電腦。
串口最基本的設(shè)置,就是波特率的設(shè)置。STM8 的串口使用起來(lái)還是蠻簡(jiǎn)單 的,只要您開(kāi)啟了串口時(shí)鐘,然后配置一下波特率,數(shù)據(jù)位長(zhǎng)度,奇偶校驗(yàn)位等 信息,就可以使用了。下面,我們就簡(jiǎn)單介紹下這幾個(gè)與串口基本配置直接相關(guān) 的寄存器。關(guān)于串口更詳細(xì)高級(jí)的功能請(qǐng)參考《STM8S 微控制器參考手冊(cè)》。




圖 2.4- 1 UART_SR 寄存器
在這里,我們僅用到了狀態(tài)寄存器第 7 位,由于單片機(jī)是 8 位的單片機(jī),所 以每次發(fā)送都是以字節(jié)為單位向外發(fā)送的,為了保證在下一次發(fā)數(shù)之前的數(shù)據(jù)已 經(jīng)發(fā)送完畢,必須保證發(fā)送數(shù)據(jù)寄存器為空,即狀態(tài)寄存器第 7 位置 1。UART_SR 寄存器如圖 2.4- 1 所示。


圖 2.4- 2 UART_DR 寄存器
當(dāng)我們把和串口有關(guān)的所有寄存器配置好之后,我們只需要將所要發(fā)送的數(shù)




據(jù)寫到此寄存器里,比如發(fā)送字符 a,就寫 UART1_DR=‘a(chǎn)’;就可以了。同樣, 當(dāng)接收到一個(gè)字符時(shí),我們也可以從此寄存器里讀出一個(gè)字符,把它賦值給其他 變量,如 ch=UART1_DR;如何判斷是否接收到字符呢?一個(gè)方法是產(chǎn)生接收中 斷,另一個(gè)是使用查詢的方法,不斷查詢 SR 寄存器的 RXNE 位。由于查詢方法 很是消耗 CPU,效率不高,所以我們通常用中斷的方法。UART_SR 寄存器如圖
2.4- 2 所示。


圖 2.4- 3 UART_BRR1 寄存器


圖 2.4- 4 UART_BBR2 寄存器
對(duì)于串口來(lái)說(shuō)配置波特率可能是最重要的步驟了,STM8 單片機(jī)就是通過(guò) BRR1 和 BRR2 這兩個(gè)寄存器(BRR1 寄存器如圖 2.4- 3所示,BBR2 寄存器如 圖 2.4- 4 所示)來(lái)配置波特率的,對(duì)于如何配置這兩個(gè)寄存器,在參考手冊(cè)里寫 的很好,如圖 2.4- 5 所示:






圖 2.4- 5 配置波特率的操作
fMASTER 指的是系統(tǒng)時(shí)鐘,默認(rèn)為 2M,系統(tǒng)時(shí)鐘可通過(guò) CLK_CKDIVR 寄 存器控制,前面已經(jīng)提過(guò)。在此處,一定要先寫 BRR2寄存器,在寫 BRR1 寄存 器。圖 2.4- 6 是一些常用的波特率配置:


圖 2.4- 6 常用波特率配置






圖 2.4- 7 UART_CR1 寄存器
通過(guò)位 4:M 來(lái)控制字長(zhǎng),當(dāng)需要奇偶校驗(yàn)位或者是有 9 個(gè)數(shù)據(jù)位時(shí)要配置 此位,此實(shí)驗(yàn)不需要配置。PS 位:用來(lái)配置奇校驗(yàn)或偶校驗(yàn)的。這里同樣不需 要配置。UART_CR1 寄存器如圖 2.4- 7 所示。






圖 2.4- 8 UART_CR2 寄存器
這個(gè)是一個(gè)比較重要的寄存器,當(dāng)串口全配置好之后,我們通過(guò)此寄存器打 開(kāi)發(fā)送或接收的功能,這里,我們常用的有:RIEN 接收中斷使能,TEN 發(fā)送使 能,REN 接收使能等幾個(gè)功能。UART_CR2 寄存器如圖 2.4- 8 所示。
當(dāng)然,關(guān)于串口的寄存器還有很多,這里我們就不一一介紹了,對(duì)串口的基 本操作,有以上這些寄存器就夠了,在看一下配置串口的步驟。






圖 2.4- 9 字節(jié)發(fā)送的配置步驟

























圖 2.4- 10 字節(jié)接收的配置步驟
上面第一個(gè)圖是字符發(fā)送的配置步驟(如圖 2.4- 9 所示),第二個(gè)是字符接 收的配置步驟(如圖 2.4- 10 所示)。因?yàn)槲覀儾恍枰渲闷媾夹r?yàn)和停止位等信 息(全部默認(rèn)),所以我們不需要步驟 1,2,由此我們就大大簡(jiǎn)化了程序的配置, 只需要配置 BRR 和 CR2 兩個(gè)寄存器就好。

2.4.2硬件連接原理


該實(shí)驗(yàn)的硬件配置不同于前幾個(gè)實(shí)驗(yàn):





圖 2.4- 11 串口的電路原理圖
原理圖如圖 2.4- 11 所示,電腦 USB 連接著 CH340 芯片,CH340 芯片的 TXD, RXD 與 STM8S 單片機(jī)之間隔著兩個(gè)跳帽,也就是說(shuō)串口 1 與 USB 串口默認(rèn)是 分開(kāi)的,并沒(méi)有在 PCB 上連接在一起,需要通過(guò)跳線帽來(lái)連接一下。如圖 2.4- 12 所示:


圖 2.4- 12 串口的硬件連接實(shí)物圖
連接上這里之后,我們?cè)谟布暇驮O(shè)置完成了,可以開(kāi)始軟件設(shè)計(jì)了。

2.4.3原工程詳解


打開(kāi)基礎(chǔ)篇程序,串口發(fā)數(shù)的程序,讓我們一起分析一下代碼: 當(dāng)然開(kāi)始還是固定的頭文件,宏定義,延時(shí)函數(shù)和系統(tǒng)時(shí)鐘配置:
#include <iostm8s103k3.h>
#include<string.h>
#include <intrinsics.h>
#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long
const char table[]={"Wish you study SCM happy!\n"};
void delay(u16 n)
{
u16 i,j;
while(n --)




{
for(i = 0;i < 32;i ++)
for(j = 0;j < 10;j ++);



}
}
void Clk_Config(void)
{
CLK_CKDIVR= 0x00;              //系統(tǒng)時(shí)鐘 1 分頻
while(!(CLK_ICKR & 0x02));              //等待 HSI 準(zhǔn)備好


}
這里新定義了一個(gè)數(shù)組 table,我們的目的就是用串口把這個(gè)數(shù)組里的信息發(fā) 到上位機(jī)上去。然后是串口的初始化配置:
void Uart_Init(void)
{
UART1_BRR2 = 0x00;
UART1_BRR1 = 0x0d;              //2MHZ 時(shí)波特率 9600 對(duì)應(yīng)數(shù) 值
UART1_CR2 = 0x08;              //開(kāi)啟發(fā)送
}
這里只配置了波特率和開(kāi)啟發(fā)送功能,其他寄存器全部選擇默認(rèn)。一般情況 下,都是一個(gè)停止位,沒(méi)有校驗(yàn),8 個(gè)數(shù)據(jù)位,這些在很多的上位機(jī)軟件里也是 默認(rèn)的,所以這里都沒(méi)有改動(dòng)。
為了調(diào)用方便,我們把發(fā)送字節(jié)寫成了一個(gè)簡(jiǎn)單的子函數(shù),如下:
void UART1_Sendint(unsigned int ch)
{
while((USART1_SR & 0x80) == 0x00);              // 等待數(shù)據(jù)的傳送
UART1_DR = ch;
}
然后是主函數(shù)了:
int main( void )
{
u8 i;

//Clk_Config(); Uart_Init();



while(1)
{
for(i=0;i<=strlen(table);i++)
{
UART1_Sendint(table[ i]);

[ i]


}
delay(500);
}
}
主函數(shù)里配置完串口后,在 while(1)的循環(huán)里,設(shè)了一個(gè) for 循環(huán),把數(shù) 組 table 里的每個(gè)元素按順序發(fā)送出去,為了區(qū)別每次之間的發(fā)送,特設(shè)了 500ms 的延時(shí)。strlen()函數(shù)是獲取字符串?dāng)?shù)組的長(zhǎng)度,在 C 語(yǔ)言里經(jīng)常用到,包含在頭 文件 string.h 里。
接下來(lái)我們就用串口調(diào)試助手來(lái)看一看程序的效果吧。 先按照之前的方法將程序下載到板子上,然后別的可以不用動(dòng),在電腦上直
接 打 開(kāi) 微 云 電 子 資 料 內(nèi) 容 里 的 “ 相 關(guān) 安 裝 軟 件 及 工 具 ” 文 件 夾 里 的

串口調(diào)試助手,注意這時(shí)為了避免電腦串口的重復(fù) 占用,一定要把下載器完全關(guān)掉,必要的時(shí)候可重新拔插一下 USB 數(shù)據(jù)線。打 開(kāi)的串口調(diào)試助手如圖 2.4- 13 所示:



圖 2.4- 13 串口調(diào)試助手
選擇好 COM 口和波特率,并打開(kāi)串口,因?yàn)槲覀儼l(fā)送的是字符,所以不要 十六進(jìn)制顯示,把 Receive As HEX 之前的勾取消,這時(shí),我們就看到接收區(qū)出 現(xiàn)我們想看到的字符了,顯示界面如圖 2.4- 14 所示。





圖 2.4- 14 接收串口顯示

2.4.4學(xué)習(xí)拓展:UART之串口收發(fā)數(shù)


上面的軟件設(shè)計(jì)僅僅介紹了串口的發(fā)數(shù)功能,在這一小節(jié),我們?cè)敿?xì)的介紹 一下如何利用接收中斷,來(lái)接收字符,并把它發(fā)送出去。首先還是頭文件,宏定 義和系統(tǒng)配置:
#include <iostm8s103k3.h>
#include <intrinsics.h>
#define u8 unsigned char
#define u16 unsigned int

#define u32 unsigned long void delay(u16 n)

{
u16 i,j;
while(n --)
{
for(i = 0;i < 32;i ++)
for(j = 0;j < 10;j ++);
}
}
void Clk_Config(void)
{
CLK_CKDIVR= 0x00;              //系統(tǒng)時(shí)鐘 1 分頻
while(!(CLK_ICKR & 0x02));              //等待 HSI 準(zhǔn)備好





}
然后是串口的初始化:
void Uart_Init(void)
{
UART1_BRR2 = 0x00;
UART1_BRR1 = 0x0d;              //2MHZ 時(shí)波特率 9600 對(duì)應(yīng)數(shù)值
UART1_CR2 = 0x2c;              //開(kāi)啟發(fā)送 接收及接收中斷
}
這里 CR2 寄存器里我們使能了發(fā)送,接收和接收中斷功能。詳情見(jiàn)圖。。 然后是發(fā)送函數(shù),和主函數(shù),注意主函數(shù)容易忘記開(kāi)總中斷。
void UART1_Sendint(unsigned int ch)
{
while((USART1_SR & 0x80) == 0x00);              // 等待數(shù)據(jù)的傳送
UART1_DR = ch;
}
int main( void )
{

//Clk_Config(); Uart_Init();

enable_interrupt();
while(1)
{
}
}
#pragma vector=UART1_R_RXNE_vector
interrupt root void UART1_Recv_IRQHandler (void)
{
unsigned int              ch;


ch = UART1_DR; UART1_Sendint(ch);



}
這個(gè)是接收中斷函數(shù),其中中斷向量編號(hào) UART1_R_RXNE_vector 是查看頭 文件 iostm8s103k3.h 看到了,之前也有提到。每當(dāng)上位機(jī)發(fā)送一個(gè)字符時(shí)就會(huì)引 起中斷,在接收中斷里我們把接收到的字符,即 DR 寄存器里的數(shù)讀出來(lái),賦給 ch 變量,然后再用UART1_Sendint();函數(shù)原封不動(dòng)的發(fā)送出去,這樣我們?cè)偕衔?機(jī)上就可以看到你發(fā)送什么,接收區(qū)就顯示什么了。串口顯示如圖 2.4- 15所示。





圖 2.4- 15 發(fā)送接收串口顯示
當(dāng)然,感興趣的童鞋也可以變個(gè)花樣,比如發(fā)送“1”,返回“2”,發(fā)送“a”, 返回“b”什么的。本串口軟件還支持發(fā)送漢字,感興趣的童鞋可以自己上網(wǎng)查 一查如何編輯漢字,這里我們就不再介紹了。

2.5ADC模擬/數(shù)字轉(zhuǎn)換


這一節(jié)我們將向大家介紹 STM8 的 ADC。本節(jié)將利用 STM8 的 ADC 通道 3
來(lái)采樣外部溫度或光強(qiáng)值。

2.5.1STM8ADC簡(jiǎn)介


在許多的單片機(jī)應(yīng)用系統(tǒng)中,都需要 A/D 轉(zhuǎn)換器,將模擬量轉(zhuǎn)換成數(shù)字量。 在 STM8 單片機(jī)中,提供的是 10 位的 A/D,通道數(shù)隨芯片不同而不同,少的有
4 個(gè)通道,多的則有 16 個(gè)通道(實(shí)際準(zhǔn)確的通道數(shù)量由數(shù)據(jù)手冊(cè)的引腳描述說(shuō) 明)。下面的實(shí)驗(yàn)程序首先利用定時(shí)器定時(shí)對(duì) A/D 輸入進(jìn)行采樣,然后分別將采 樣結(jié)果的高 8 位和低 8 位依次用串口發(fā)送出去。這樣可以控制采樣的時(shí)間,以免 單片機(jī)采樣過(guò)快,產(chǎn)生溢出錯(cuò)誤。
同樣,我們結(jié)合著寄存器,了解一下 ADC 的功能。






圖 2.5- 1 ADC_CR1 寄存器
ADC 支持 5 種轉(zhuǎn)換模式:?jiǎn)未文J、連續(xù)模式、帶緩存的連續(xù)模式、單次 掃描模式、連續(xù)掃描模式。
              單次模式:ADC 僅在唯一的通道(由 ADC_CSR 寄存器的 CH[3:0]選定) 上完成一次轉(zhuǎn)換,一旦轉(zhuǎn)換完成,轉(zhuǎn)換后的數(shù)據(jù)存儲(chǔ)在 ADC_DR 寄存器中,EOC
(轉(zhuǎn)換結(jié)束)標(biāo)志被置位。
  連續(xù)和帶緩存的連續(xù)模式:在連續(xù)轉(zhuǎn)換模式中,ADC 在唯一選定的通道 上完成一次轉(zhuǎn)換后立即開(kāi)始下一次在同樣通道上的轉(zhuǎn)換。通過(guò)將 CONT 位置位 將 ADC 設(shè)為連續(xù)模式。不帶緩沖功能的連續(xù)模式中,轉(zhuǎn)換結(jié)果數(shù)據(jù)保存在 ADC_DR 寄存器中,同時(shí)EOC 標(biāo)志置位。若緩存功能被使能,那么將轉(zhuǎn)換結(jié)果 會(huì)填滿數(shù)據(jù)緩存,此時(shí),EOC 置位。
              單次掃描模式:與非掃描模式相比,此模式是用來(lái)轉(zhuǎn)換從 AIN0 到 AINn
(n 為通道編號(hào))之間的一連串模擬通道,也是只完成一次轉(zhuǎn)換。此模式中,轉(zhuǎn) 換從 AIN0 通道開(kāi)始,數(shù)據(jù)結(jié)果被保存在數(shù)據(jù)緩沖寄存器 ADC_DBxR 中,當(dāng)最 后一個(gè)通道(通道 n)被轉(zhuǎn)換完后,EOC 被置位。
 連續(xù)掃描模式:該模式和單次掃描模式相近,知識(shí)每一次在最后通道轉(zhuǎn) 換完成時(shí),一次新的從通道 0 到通道 n 掃描轉(zhuǎn)換會(huì)自動(dòng)開(kāi)始。
在本實(shí)驗(yàn)中我們只用到了最簡(jiǎn)單的單次模式,由定時(shí)器控制每次轉(zhuǎn)換的開(kāi) 啟,注意 ADON 位的兩次開(kāi)啟,第一次只是把 ADC 從低功耗模式喚醒,之后每 次要開(kāi)啟轉(zhuǎn)換時(shí)都要將 ADON 位置位才可以。ADC_CR1 寄存器如圖 2.5- 1 所示。






圖 2.5- 2 ADC_CR2 寄存器
此寄存器我們主要了解它的第 1 位和第 3 位,上面已經(jīng)介紹過(guò)是什么是掃描 模式和單通道模式了,即掃描模式是開(kāi)啟很多個(gè)通道,這里,我們只開(kāi)了一個(gè)通 道,所以在配置此寄存器時(shí)位 1 要保持為 0。ADC_CR2 寄存器如圖 2.5- 2 所示。
由于單片機(jī)為 8 位單片機(jī),而 ADC 采樣為 10 位,所以涉及一個(gè)在數(shù)據(jù)如何 存儲(chǔ)的問(wèn)題。數(shù)據(jù)左對(duì)齊和右對(duì)齊的區(qū)別如圖 2.5- 3所示:






圖 2.5- 3 數(shù)據(jù)左對(duì)齊右對(duì)齊區(qū)別
然后是狀態(tài)寄存器,重點(diǎn)是位 7,位 5 和位[3:0],ADC_CSR 寄存器如圖 2.5- 4
所示:






圖 2.5- 4 ADC_CSR 寄存器
把位 5 置 1 后,每次轉(zhuǎn)換結(jié)束后都會(huì)產(chǎn)生轉(zhuǎn)換結(jié)束中斷,在中斷里要清除 EOC 標(biāo)志,位[3:0]是選擇要轉(zhuǎn)換的通道 AINx,如果是單次模式,則轉(zhuǎn)換的就是 AINx 通道,如果是掃描模式,則轉(zhuǎn)換的是從 AIN0 到 AINx 通道。


圖 2.5- 5 ADC 數(shù)據(jù)高位寄存器


圖 2.5- 6  ADC 數(shù)據(jù)低位寄存器
當(dāng)轉(zhuǎn)換結(jié)束后,采樣結(jié)果從這兩個(gè)寄存器里讀出,如果是多通道掃描模式, 數(shù)據(jù)則儲(chǔ)存在 ADC_DBxRH 和 ADC_DBxRL 寄存器里。ADC 數(shù)據(jù)高位寄存器如 圖 2.5- 5 所示,ADC 數(shù)據(jù)低位寄存器如圖 2.5- 6 所示。
關(guān)于更多的 ADC 的詳細(xì)功能,請(qǐng)參考 STM8S 微控制器參考手冊(cè)。




2.5.2硬件連接原理


原理圖如圖 2.5- 7 所示:


圖 2.5- 7 ADC 電路原理圖
如上圖中紅框的兩個(gè)跳帽,將 J2  和 J3 的 2,3 腳連接起來(lái),可采集光強(qiáng)數(shù)據(jù), 切換 J2 為 1,2 腳,可采集溫度數(shù)據(jù)。硬件連接如圖2.5- 8 所示:
圖 2.5- 8 ADC 硬件連接實(shí)物圖

2.5.3軟件設(shè)計(jì)


打開(kāi)基礎(chǔ)篇的最后一個(gè)程序,同樣開(kāi)始是頭文件,宏定義,延時(shí)函數(shù)和系統(tǒng) 時(shí)鐘配置:
#include <iostm8s103k3.h>
#include <intrinsics.h>
#define u8 unsigned char
#define u16 unsigned int

#define u32 unsigned long u16 Adc_Data;





void delay(u16 n)
{
u16 i,j;
while(n --)
{
for(i = 0;i < 32;i ++)
for(j = 0;j < 10;j ++);
}
}
void Clk_Config(void)
{
CLK_CKDIVR= 0x00;              //系統(tǒng)時(shí)鐘 1 分頻
while(!(CLK_ICKR & 0x02));              //等待 HSI 準(zhǔn)備好
}
然后是 ADC 配置:
void Adc_Config(void)
{
ADC_CR2 = 0x00;              //              禁止掃描,數(shù)據(jù)左對(duì)齊
ADC_CSR = 0x23;              // 選擇轉(zhuǎn)換通道為模擬通道 3 開(kāi)啟中斷
ADC_CR1 |= 0x01;              // 從低耗喚醒轉(zhuǎn)換
delay(1);              // 等待 ADC 模塊的上電完成
}
這里我們用的是單次轉(zhuǎn)換模式,開(kāi)啟的是模擬通道 3,在原理圖上連線寫的
,只是一個(gè)名稱,不要和通道 3 混淆。


void Tim4_Config(void)
{
TIM4_PSCR = 2;              //4 分頻得到 250KHZ 的定時(shí)器時(shí)鐘,定 時(shí)器加 1 就是 4us
TIM4_ARR = 0xfa;              //1ms 中斷一次 TIM4_IER_UIE = 1;              //更新中斷使能 TIM4_CR1_ARPE= 1;                            //預(yù)裝載使能 TIM4_CR1_CEN = 1;                            //啟動(dòng)計(jì)數(shù)器
}
用定時(shí)器比較容易控制 ADC 的轉(zhuǎn)換頻率,這里 TIM4 定時(shí)器 1ms 中斷一次, 因此在定時(shí)器中斷函數(shù)里:
#pragma vector = TIM4_OVR_UIF_vector
interrupt root void TIM4_UIF_HANDLER(void)
{
static u16 i;
i++;
if(i == 10)
{




i = 0;
ADC_CR1 |= 0x01;
}
TIM4_SR_UIF = 0;
}
同樣設(shè)置了一個(gè)計(jì)數(shù)變量 i,每次 i 計(jì) 10 時(shí)(即每隔 10ms),開(kāi)啟一次轉(zhuǎn)換, 當(dāng)轉(zhuǎn)換完畢時(shí),ADON 位自動(dòng)清零。
以下是串口的初始化和發(fā)送函數(shù),不再詳述。
void Uart_Init(void)
{
UART1_BRR2 = 0x00;
UART1_BRR1 = 0x0d;              //2MHZ 時(shí)波特率 9600 對(duì)應(yīng)數(shù) 值
UART1_CR2 = 0x08;              //開(kāi)啟發(fā)送
}
void UART1_Sendint(unsigned int ch)
{
while((UART1_SR & 0x80) == 0x00);              // 等待數(shù)據(jù)的傳送
UART1_DR = ch;
}
主函數(shù),注意要使能全局中斷。
int main( void )
{

// Clk_Config(); Tim4_Config(); Adc_Config(); Uart_Init();

enable_interrupt();
while(1)
{


}
}
最后是 ADC 轉(zhuǎn)換結(jié)束中斷,在每隔 10ms 開(kāi)啟一次中斷后,ADC 開(kāi)始轉(zhuǎn)換, 轉(zhuǎn)換結(jié)束后產(chǎn)生如下中斷:
#pragma vector = ADC1_EOC_vector
interrupt root void ADC1_EOF_HANDLER(void)
{
u8 temp;
if(ADC_CSR_EOC != 0)
{

ADC_CSR_EOC = 0; temp = ADC_DRH; UART1_Sendint(temp);





temp= ADC_DRL; UART1_Sendint(temp);

}
}
此時(shí)狀態(tài)寄存器的 EOC 位一定會(huì)被硬件置 1,所以要清零,然后將 ADC_DRH
和 ADC_DRL 里的數(shù)讀出來(lái),由串口發(fā)送到上位機(jī)顯示。 最后,編譯一下程序,下載到板子上,打開(kāi)串口調(diào)試助手,可看到串口發(fā)送
的數(shù)據(jù),如圖 2.5- 9 所示:

圖 2.5- 9 串口發(fā)送數(shù)據(jù)
用手遮擋住光敏電阻,或者是捂住熱敏電阻,應(yīng)該可以看到串口調(diào)試助手中 數(shù)值的變化。
在本章,我們主要是為了講解單片機(jī)的 ADC 采樣功能才使用了熱敏電阻和 光敏電阻的的模擬電路,對(duì)于熱敏電阻與光敏電阻當(dāng)然有更多的功能啦,下一章 我們將會(huì)配合著數(shù)碼管介紹熱敏電阻。

2.5.4學(xué)習(xí)拓展:趣味心電監(jiān)測(cè)儀


了解了 ADC 的工作原理后,我們依據(jù)此原理在上位機(jī)上制作了一個(gè)有趣的 心電監(jiān)測(cè)儀。心臟檢測(cè)儀工作的硬件原理圖如圖 2.5- 10所示:






圖 2.5- 10 心臟檢測(cè)儀原理圖
其硬件跳帽如圖 2.5- 11 所示,黃色框內(nèi)即為紅外對(duì)管:


圖 2.5- 11 趣味心臟檢測(cè)儀的硬件連接
要想要紅外對(duì)管正常工作,必須使圖中紅框內(nèi)的 DRIVER 拉低,DRIVER 信 號(hào)是由 IrAD-driver 經(jīng)過(guò)一個(gè)反相器得到的,因此只需將IrAD-driver 拉高即可。 從原理圖中可以看到,IrAD-driver 由單片機(jī)的 PA1 產(chǎn)生,因此在寫程序的時(shí)候 要將 PA1 口初始化為輸出,且給其高電平。此外,還需要把上面 ADC 采集程序 中的轉(zhuǎn)換通道改成模擬通道 2.此時(shí)單片機(jī)采集到的才是 ADIN_2,即紅外對(duì)管電 路產(chǎn)生的輸出電壓。注意:要把 J4 跳線帽的 1、2 腳相連。當(dāng)心臟跳動(dòng)時(shí),產(chǎn)生 的電壓會(huì)發(fā)生變化,我們將變化的電壓值采集進(jìn)來(lái)進(jìn)行處理,利用串口發(fā)送到上 位機(jī),就可以在上位機(jī)顯示心跳波形啦!由于程序與 ADC 采集的基本相同,這 里只列出與之不同的地方!
下面一段程序是初始化 PA1 為輸出,且給其高電平,從而使紅外對(duì)管工作。
void GPIO_Config(void)
{




PA_DDR|=0x02; PA_CR1|=0x02; PA_CR2&=~0x02; PA_ODR|=0x02;

}


下面一段程序與前面基本相同,只是將 ADC 轉(zhuǎn)換通道由模擬通道 3(ADIN_1)
改成了模擬通道 2(ADIN_2). void Adc_Config(void)
{
ADC_CR2 = 0x00;              // 禁止掃描,數(shù)據(jù)左對(duì)齊
ADC_CSR = 0x22;              // 選擇轉(zhuǎn)換通道為模擬通道 2,開(kāi)啟中斷
ADC_CR1 |= 0x01;              // 從低耗喚醒轉(zhuǎn)換
delay(1);              // 等待 ADC 模塊的上電完成
}
在這里我們只將采集到電壓的高八位發(fā)送至串口,用高八位值的變化來(lái)反映 采集心臟電壓的變化趨勢(shì)!因此,下面的一小段中斷程序中只有發(fā)送高八位的語(yǔ) 句!
#pragma vector = ADC1_EOC_vector
interrupt root void ADC1_EOF_HANDLER(void)
{
u8 temp;
if(ADC_CSR_EOC != 0)
{

ADC_CSR_EOC = 0; temp = ADC_DRH; UART1_Sendint(temp);

}
}
將程序下載到學(xué)習(xí)班中,結(jié)合心電監(jiān)測(cè)儀觀察現(xiàn)象。 心電監(jiān)測(cè)儀的使用方法如下:打開(kāi)心臟檢測(cè)儀軟件,打開(kāi)方法為單擊電腦左
下角的開(kāi)始菜單中的所有程序中的基礎(chǔ)型學(xué)習(xí)板實(shí)驗(yàn)平臺(tái),如圖 2.5- 12 所示。





圖 2.5- 12 心電監(jiān)測(cè)儀打開(kāi)方法
打開(kāi)軟件后,先單擊左側(cè)的方框選擇 COM 口,然后單擊右上角的心形按鈕, 如圖 2.5- 13 所示紅框內(nèi)。

圖 2.5- 13 操作心臟檢測(cè)儀




讀者坐姿端正心情放松,用食指指肚兒輕輕放在紅外對(duì)管上,在軟件中就可 以看到 AD 采集到的心臟電壓波形。通過(guò)此軟件就可以觀測(cè)到自己的心跳波形變 化情況啦!是不是很有趣呢!如圖 2.5- 14 所示:
圖 2.5- 14 上位機(jī)軟件界面

2.6SPI串行外設(shè)接口


2.6.1SPI總線協(xié)議簡(jiǎn)介


SPI 是英語(yǔ) Serial Peripheral interface 的縮寫,顧名思義就是串行外圍設(shè)備接 口。是 Motorola 首先在其 MC68HCXX 系列處理器上定義的。SPI 接口主要應(yīng)用 在 EEPROM,F(xiàn)LASH,實(shí)時(shí)時(shí)鐘,AD 轉(zhuǎn)換器,還有數(shù)字信號(hào)處理器和數(shù)字信 號(hào)解碼器之間。SPI,是一種高速的,全雙工,同步的通信總線。
SPI 接口一般使用 4 條線:
MISO 主設(shè)備數(shù)據(jù)輸入,從設(shè)備數(shù)據(jù)輸出。 MOSI 主設(shè)備數(shù)據(jù)輸出,從設(shè)備數(shù)據(jù)輸入。 SCLK 時(shí)鐘信號(hào),由主設(shè)備產(chǎn)生。
CS 從設(shè)備片選信號(hào),由主設(shè)備控制。只有在片選選通時(shí),才可以對(duì)從機(jī)進(jìn) 行讀或?qū)懖僮,一般情況下低電平有效。
一般情況下,SPI 也可以僅有 3 條線組成,即 SCK 時(shí)鐘線,SDA 數(shù)據(jù)線和
CS 片選,SDA 可配置為雙向數(shù)據(jù)傳輸。SPI 時(shí)序如圖 2.6- 1 所示:





圖 2.6- 1 SPI 時(shí)序
從機(jī)在時(shí)鐘線的上升沿或者下降沿鎖存數(shù)據(jù)。
SPI 主要特點(diǎn)有:可以同時(shí)發(fā)出和接收串行數(shù)據(jù);可以當(dāng)作主機(jī)或從機(jī)工作; 提供頻率可編程時(shí)鐘;發(fā)送結(jié)束中斷標(biāo)志;寫沖突保護(hù);總線競(jìng)爭(zhēng)保護(hù)等。出于 這種簡(jiǎn)單易用的特性,現(xiàn)在越來(lái)越多的芯片集成了這種通信協(xié)議,STM8 也有 SPI 接口。這里我們只對(duì)STM8S 的 SPI 接口做一個(gè)簡(jiǎn)單的介紹,通過(guò)寄存器對(duì) SPI 接口進(jìn)行詳細(xì)了解一下。
關(guān)于 SPI 的配置很簡(jiǎn)單,只需要配置 CR1 和 CR2 兩個(gè)寄存器就好。SPI_CR1
寄存器如圖 2.6- 2 所示,SPI_CR2 寄存器如圖 2.6- 4 所示。





圖 2.6- 2 SPI_CR1 寄存器
位 7 是用來(lái)配置 SPI 在傳輸數(shù)據(jù)時(shí)是高字節(jié)在前還是低字節(jié)在前。比如
DS1302 芯片就是低字節(jié)在前,而 TM1628 則是低字節(jié)在前。
位 6 是開(kāi)啟 SPI,位 5:3 控制 SPI 的波特率,最高可達(dá)到 8M。
位 2 是將單片機(jī)配置為主設(shè)備還是從設(shè)備,一般情況下,我們都用單片機(jī)做 主設(shè)備來(lái)驅(qū)動(dòng)其他設(shè)備。
位 1 和位 0 的功能如圖 2.6- 3 所示:

圖 2.6- 3 SPI_CRI 位 1 位 0 功能





圖 2.6- 4 SPI_CR2 寄存器
對(duì)于單工通信,SPI 可以配置為兩種方式:
               1 條時(shí)鐘線和 1 條雙向數(shù)據(jù)線
               1 條時(shí)鐘線和 1 條數(shù)據(jù)線(雙工或接收方式) 這兩種方式由 BDM 和 BODE 控制,
              1 條時(shí)鐘線和 1 條雙向數(shù)據(jù)線
置 SPI_CR2 寄存器中的 BDM 位啟用此模式。在這個(gè)模式中,SCK 用作時(shí)鐘, 主模式中的 MOSI 或從模式中的 MISO 用作數(shù)據(jù)通信。傳輸?shù)姆较颍ㄝ斎牖蜉敵觯?由 SPI_CR2 寄存器里的 BODE 位控制,當(dāng)這個(gè)位是 1 的時(shí)候,數(shù)據(jù)線是輸出, 否則是輸入。
              1 條時(shí)鐘和 1 條數(shù)據(jù)線(雙工或只接收方式)
為了釋放一根 I/O 腳作為它用,可以通過(guò)設(shè)置 SPI_CR2 寄存器中的 RXONLY
位來(lái)禁止 SPI 輸出使能 。這樣的話,SPI 將運(yùn)行于只接收模式。當(dāng) RXONLY 位




置 0 時(shí),SPI 又會(huì)恢復(fù)到全雙工模式。
位 1 使能從模式軟件管理,位 0 選擇主模式,這兩位在配置過(guò)程中都要置 1, 詳細(xì)介紹請(qǐng)參考手冊(cè)。
還有,在 SPI 通信過(guò)程中,PE5 引腳,也就是 NSS 引腳,一般就配置為普通 的 IO 口即可,手動(dòng)的拉低或拉高來(lái)控制從機(jī)的片選。

圖 2.6- 5 SPI_SR 寄存器
這個(gè)寄存器,我們通常只是判斷位 7,即 SPI 是否空閑。SPI_SR 寄存器如圖
2.6- 5 所示。





圖 2.6- 6 SPI_DR 寄存器
當(dāng)把 SPI 配置好之后,只需要向這個(gè)寄存器里寫數(shù)或者讀數(shù)。SPI_DR 寄存 器如圖 2.6- 6 所示。

2.6.2硬件連接原理


由于本節(jié)只對(duì) SPI 進(jìn)行原理性介紹,具體應(yīng)用請(qǐng)參考下一章內(nèi)容。

2.6.3原工程詳解


打開(kāi)基礎(chǔ)篇程序,找到 SPI 的工程,我們這里只分析一下 SPI 的配置。
void SPI_Init(void)
{
PB_DDR|=0x70;              //PE5 輸出,其余保持原功能
PB_CR1|=0x70;              //對(duì)應(yīng)位設(shè)置為推挽輸出              /*mosi 引腳必須設(shè)置為推挽 輸出,否則輸出為鋸齒波*/
PB_CR2&=~0x70;              //輸出最大頻率為 2Mhz
SPI_CR2 = 0X03;              //軟件管理使能開(kāi),主模式
SPI_CR1 = 0X04;              //MSB 在前;使能開(kāi);1MHZ              (HSE = 8MHZ);主模




式;


SPI_CR1_BR =0; SPI_CR1_SPE =1;

}

// 空閑狀態(tài)時(shí) scl=0;采用從第一個(gè)時(shí)鐘邊沿開(kāi)始




在配置 SPI 之前,要配置一下 SPI 相應(yīng)的 IO 口,PE5 和 MOSI 引腳都要配 置為輸出模式。SPI 配置步驟如圖 2.6- 7 所示。




圖 2.6- 7 SPI 配置步驟
然后我們?cè)倏匆幌略趺催M(jìn)行 SPI 通信。
main()
{

Clk_Config(); SPI_Init();



while(1)
{
PB_ODR_ODR4=0;
while(!SPI_SR_TXE);
//              delay(1);
SPI_DR = 0x0A;
while(!SPI_SR_TXE);

// delay(1); PB_ODR_ODR4=1; delay(100);

}
}
看到主函數(shù)我們知道,等待 SPI 的 BUSY 位不忙得時(shí)候,往 SPI_DR 寄存器 里寫數(shù)即可。
至此,SPI 的內(nèi)容我們就介紹完了,具體應(yīng)用請(qǐng)看下一章讀寫 SD 卡。

2.7本章小結(jié)


至此,關(guān)于 STM8 的最基礎(chǔ)的知識(shí)我們已經(jīng)完全介紹完了,GPIO,通用定 時(shí)器,串口,ADC 和 SPI。是不是掌握了呢,接下來(lái),我們將進(jìn)入稍稍難一點(diǎn)的 中級(jí)篇,程序難度高一些,但也更加有趣,讓我們繼續(xù)加油吧!


高級(jí)應(yīng)用篇,不知道大家是否需要,等待下載量情況,后續(xù)推出。


完整的pdf格式文檔51黑下載地址:
學(xué)習(xí)板stm8單片機(jī)篇零基礎(chǔ)學(xué)習(xí)開(kāi)發(fā)基礎(chǔ)篇教程.pdf (6.81 MB, 下載次數(shù): 196)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏9 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:126534 發(fā)表于 2019-1-26 14:06 | 只看該作者
正是需要的,樓主威武。請(qǐng)問(wèn)樓主中、高級(jí)篇什么時(shí)候上傳。
回復(fù)

使用道具 舉報(bào)

板凳
ID:544220 發(fā)表于 2019-5-21 21:41 | 只看該作者
語(yǔ)句有些解釋得很到位,希望有更多的解釋出來(lái),謝謝,
回復(fù)

使用道具 舉報(bào)

地板
ID:33899 發(fā)表于 2019-7-24 11:08 | 只看該作者
很好的教程,感謝樓主
回復(fù)

使用道具 舉報(bào)

5#
ID:509605 發(fā)表于 2019-11-12 13:54 | 只看該作者
很適合初學(xué)者的教程
回復(fù)

使用道具 舉報(bào)

6#
ID:663680 發(fā)表于 2019-12-18 17:44 | 只看該作者
寫的很好,看了前面幾章感覺(jué)解釋的很清楚
回復(fù)

使用道具 舉報(bào)

7#
ID:640709 發(fā)表于 2020-2-1 12:25 | 只看該作者
不錯(cuò)不錯(cuò),好資料,收下了!
回復(fù)

使用道具 舉報(bào)

8#
ID:388929 發(fā)表于 2020-2-12 10:18 | 只看該作者
很適合
回復(fù)

使用道具 舉報(bào)

9#
ID:388929 發(fā)表于 2020-2-13 14:13 | 只看該作者
請(qǐng)教一下,我看到中斷那一部分,interrupt root void TIM4_UIF_HANDLER(void),這句是不是少了點(diǎn)什么,我一直都編譯不成功
回復(fù)

使用道具 舉報(bào)

10#
ID:669166 發(fā)表于 2020-3-22 13:36 | 只看該作者
不錯(cuò),下載學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

11#
ID:576801 發(fā)表于 2020-8-5 17:01 | 只看該作者
問(wèn)題是實(shí)驗(yàn)平臺(tái)哪里下載?
回復(fù)

使用道具 舉報(bào)

12#
ID:688700 發(fā)表于 2020-8-13 11:55 | 只看該作者
有pwm輸出和pid的教程嗎
回復(fù)

使用道具 舉報(bào)

13#
ID:850855 發(fā)表于 2020-11-28 21:27 來(lái)自手機(jī) | 只看該作者
請(qǐng)問(wèn)第一步的基礎(chǔ)型學(xué)習(xí)板實(shí)驗(yàn)平臺(tái)軟件在哪下載
回復(fù)

使用道具 舉報(bào)

14#
ID:850855 發(fā)表于 2020-11-28 21:45 來(lái)自手機(jī) | 只看該作者
zm9989 發(fā)表于 2020-8-13 11:55
有pwm輸出和pid的教程嗎

請(qǐng)問(wèn)一下那個(gè)實(shí)驗(yàn)平臺(tái)軟件在哪里下載呢?
回復(fù)

使用道具 舉報(bào)

15#
ID:81138 發(fā)表于 2021-1-27 09:25 | 只看該作者
那個(gè)實(shí)驗(yàn)平臺(tái)軟件在哪里下載呢?
回復(fù)

使用道具 舉報(bào)

16#
ID:62246 發(fā)表于 2021-10-3 17:07 | 只看該作者
非常感謝!現(xiàn)在正用到。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表