久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 25513|回復: 15
打印 上一主題 下一主題
收起左側

STM8單片機零基礎學習開發基礎篇教程

  [復制鏈接]
跳轉到指定樓層
樓主
ID:223470 發表于 2018-3-16 13:13 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本文檔是學習板stm8單片機篇零基礎學習開發基礎篇教程;希望給大家的學習中帶來幫助;
stm8單片機篇
1章 預備篇
1.1如何在 win7系統下安裝基礎型學習板實驗平臺軟件

1、雙擊鼠標左鍵打開資料中的“基礎型學習板實驗平臺”,“ 基礎型學習板 實驗平臺”如圖 1.1- 1 所示。

圖 1.1- 1 微云電子出品文件夾
2、打開“基礎型學習板實驗平臺”后,出現一名為 Volume 的文件夾,界面 如圖 1.1- 2 所示。

圖 1.1- 2 Volume 文件夾
3、雙擊鼠標左鍵打開“Volume 文件夾”,出現安裝 setup 所在文件夾,如圖
1.1- 3 所示。

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

圖 1.1- 4 以管理員身份運行安裝圖標
5、安裝程序初始化界面如圖 1.1- 5 所示。

圖 1.1- 5 安裝程序初始化
6、選擇目標目錄界面,基礎型學習板實驗平臺目錄的默認目錄是 C:\Program

Files\基礎型學習板實驗平臺\,如圖 1.1- 6 所示。

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

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

圖 1.1- 8 開始安裝
9、安裝進度如圖 1.1- 9 所示。


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

圖 1.1- 10 安裝成功界面

1.2如何使用 Downloader

1、左鍵單擊計算機左下方的“開始菜單”中“所有程序”中的“基礎型學 習板實驗平臺”,如圖 1.2- 1 所示。




圖 1.2- 1 打開 0724 電子出品
2、單擊鼠標右鍵 Downloader,選擇以管理員身份運行,這個是我們向 stm8
單片機里下載程序的軟件,Downloader 打開界面如圖 1.2- 2 所示。

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




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

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

圖 1.2- 5 軟件注冊界面
6、注意每個學習板的注冊碼不同,讀者請參看學習板上的標簽,上面就是 學習板的注冊碼。在灰色框內輸入注冊HVGG_GQGG_JJJI_KNHM_JMJH_JKJG 如圖 1.2- 6 所示,注意注冊碼要求英文半角大寫。每四位為一組,讀者以學習板 標簽為主,若輸入的注冊碼不對會有錯誤提示窗口。輸入結束后單擊藍色箭頭, 注冊成功,如圖 1.2- 7 所示。

圖 1.2- 6 輸入注冊碼注冊

















圖 1.2- 7 注冊成功
注冊部分介紹結束,下載部分在下面下載程序部分介紹。

1.3IAR forstm8軟件的安裝


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




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

















圖 1.3- 2 安裝管理權限
打開安裝軟件后,界面如圖 1.3- 3 所示:


圖 1.3- 3 打開安裝軟件界面
點擊“next”按鈕,之后,選擇同意協議,操作如圖 1.3- 4 所示,再點擊“next”:




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


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






圖 1.3- 6 注冊管理權限
打開之后界面如圖 1.3- 7 所示,在 Product 一欄選擇 Embedded Workbench For
STM8 1.30,然后點擊“Generate”,因為是隨機產生的,可多點幾次。


圖 1.3- 7 注冊機界面
把 License number 選定,復制到之前的 License#的條框里。然后點擊“next”, 操縱如圖 1.3- 8 所示。





圖 1.3- 8 輸入 License 信息
然后把注冊機的 License Key,復制到下圖位置,點擊“next”,操作如圖 1.3- 9
所示。
















圖 1.3- 9 輸入用戶 License Key 信息
接下來是選擇安裝路徑,因為軟件不大,所以最好默認安裝到 C 盤,如果一 定要更改安裝路徑,可點擊“Change”,操作如圖 1.3-10 所示。





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

圖 1.3- 11 安裝類型

圖 1.3- 12 ST-LINK 安裝
以下兩個可以選項不勾選,點擊“finish”,就完成了所有的安裝。操作如圖
1.3- 13 所示。





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


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





圖 1.3- 15 開始菜單中的 IAR


1.4如何新建工程


1.4.1建立工程


首 先 , 點 擊 開 始 菜 單 , 選 擇 所 有 程 序 ->IAR Systems->IAR Embedded
Workbench              for              STMicroelectronics              STM8              1.30              Evaluation->IAR              Embedded
Workbench,啟動 IAR。操作如圖 1.4- 1 所示。


圖 1.4- 1 啟動 IAR
啟動之后如圖 1.4- 2 所示:






圖 1.4- 2 IAR 運行界面
選擇 File>New>Workspace,新建一個 Workplace,用來放置當前要建立的 工程,操作如圖 1.4- 3 所示。


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





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


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






圖 1.4- 6 保存工程對話框
通常,為了方便區分每個工程和便于日后的管理與調試,往往將每個工程用 單獨的文件夾來保存,所以,筆者建議在這個步驟多新建一個文件夾,用來保存 新建的工程,點擊新建文件夾,取名為“my_first_project”,操作如圖 1.4- 7 所 示。






圖 1.4- 7 新建工程文件夾
雙擊打開此文件夾,然后在文件名一欄寫入工程的名字 my_first_program, 然后點擊保存,操作如圖 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 的名字最好保持一致,便于以后的管理, 這里,筆者為了讓你更好的區分 project 和 Workplace,所以取了不同的名字。至 此,整個工程基本上就建好了,界面如圖 1.4- 10 所示。工程建立完畢后的 IAR 界面如圖 1.4- 11 所示。
圖 1.4- 11 工程建立完畢后的 IAR 界面




1.4.2工程的選項配置


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







彈出 Options 的對話框:
圖 1.4- 12 工程選項配置




1)在 Category 中,選擇“General Options”,如圖 1.4- 13所示:
在 Target 的 Device 中,選擇相應的 MCU 型號 STM8S103K3U。其他選 擇默認。




圖 1.4- 13 配置中的 General Options
這里要提一下,雖然我們學習板上的單片機型號為 STM8S103K3,但是在這 里我們要選擇 STM8S103K3U,這可能就是 IAR 軟件與單片機不兼容造成的,不 過別擔心,這并不會影響我們對單片機的正常使用的。
2)              在 Category 中,選擇 C/C++Compiler,顯示 compiler 選項頁,操作如圖
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 選項頁,操作如圖 1.4- 16
所示。


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




4)              在 Category 中,選擇 Output Converter,顯示 Output Converter 選項頁 ,操 作如圖 1.4- 17所示。

圖 1.4- 17 配置中的 Output Converter
在 Debug\Exe 目錄中,產生目標文件。IAR 默認的是.out 文件。而我們的 下載器只識別.hex 文件,此處 Output format 選擇 Intelextended,然后勾選 Override default。
5)              在 Category 中,選擇 Linker,顯示 Linker 選項頁,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 選項頁,這里主要配置下




載程序的方式,因為我們用的是串口下載程序,所以這一步配置不是很重要,
操作如圖 1.4- 20所示。
圖 1.4- 20 配置中的 Debugger
最后點擊“OK”,就完全配置好了。

1.5如何下載程序


1.5.1文件的編譯與連接


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






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


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


圖 1.5- 3 Build 錯誤顯示欄
然后我們在點擊“Make”圖標,如圖 1.5- 4 所示:


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





圖 1.5- 5 Make 后的 Build 欄
沒 有 錯 誤 和 警 告 , 這 時 候 , 在 我 們 所 建 的 工 程 目 錄 D:\......\ 基 礎 篇
\my_first_project\Debug\Exe 下,出現 my_first_program.hex 和 my_first_program.out 兩個文件,其中,my_first_program.hex 文件是我們將要下載的文件,如圖 1.5- 6 所示。


圖 1.5- 6 hex 文件

1.5.2程序的下載


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






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






圖 1.5- 8 下載器運行界面
點擊下載器按鈕,選擇相應的串口(串口號在設備管理器里可以看到),若 沒有出來串口可點擊一下刷新,如圖 1.5- 9 所示。





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


圖 1.5- 10 下載 hex 文件界面

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




圖 1.5- 11 下載 hex 文件操作
再次點擊下一步按鈕,就會彈出一個對話框,提示下載成功,如圖 1.5- 12
所示。
圖 1.5- 12 下載成功界面




這時候,跳上 J7 的跳線帽就可以看到我們的基礎型學習板上中間的小燈點 亮了,如圖 1.5- 13 所示。

圖 1.5- 13 led 燈照亮實物圖

1.6特別注意


由于本款單片機學習板是 STM8 和 51 單片機二合一的板子,很多口都是復 用的,所以在調試 STM8 的時候,確定要將 51 設置成高阻輸出狀態。也就是說 下載一個配置程序 P3M 到 51 單片機里就行了,該程序在目錄 51 程序/內。

2章              基礎學習篇


2.1GPIO應用之點亮 LED


2.1.1STM8GPIO口原理簡介


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




注意:每一個端口寄存器位驅動相應的端口的引腳 。

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

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




圖 2.1- 3 IDR 寄存器
當 IO 口配置為輸入時,可從此寄存器讀取當前 IO 口的狀態值。在這里我們 暫時還用不到這個 IDR 寄存器,IDR 寄存器如圖 2.1- 3所示。


圖 2.1- 4 CR1 寄存器
通常,模擬開漏輸出需要外接上拉電阻,驅動能力較強,推挽輸出不需要外 接電阻,驅動能力較弱,對于 led 的點亮,推挽輸出足以,所以我們通常將 IO 口配置為推挽輸出。當然,也有配置為開漏輸出的時候,在以后會遇到。CR1 寄存器如圖 2.1- 4 所示。




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

2.1.2硬件連接原理


LED 燈部分及單片機的學習板上的原理圖如圖 2.1- 6 所示:

圖 2.1- 6 LED 燈硬件原理圖
根據上面兩個原理圖來看:單片機的第 29 腳,即 PD4 口通過名為 BEEP 的 線連接到 J7 跳帽的 2 引腳,J7 跳帽的 1 腳連接著一個電阻和一個 led 燈串聯后 接地,由此我們可以判斷,要想讓 led 小燈亮,就是讓 PD4 口置為高電平即可(若 將 J7 的跳帽接到 2,3 腳,則可以驅動蜂鳴器)。

2.1.3原工程詳解


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




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

2.1.4學習拓展:閃爍 led


想讓 led 燈閃爍,其實就是讓燈亮一會,再滅一會,也就是 ODR 這個寄存器 置高再清零的過程,但是單片機若只操作 ODR 寄存器,人的肉眼是看不到 led 燈變化的,所以中間可加一個延時函數。
#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;              //系統時鐘 1 分頻
while(!(CLK_ICKR & 0x02));              //等待 HSI 準備好


}
void Io_Config(void)




{
PD_DDR |= 0x10;              //PD4 設置為輸出 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);

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

2.2GPIO應用之蜂鳴器


蜂鳴器是現在單片機應用系統中很常見的,常用于實現報警功能。蜂鳴器一 般分為有源和無源兩種,有源的蜂鳴器只要給它兩端加電,就可以響。而無源蜂 鳴器則需要給加一個有頻率的方波,才可以響。為了更好地學習和了解蜂鳴器的 原理,我們這套板子配的是無源的蜂鳴器。




2.2.1STM8的蜂鳴器原理簡介


其實,由上一節的介紹可知,驅動蜂鳴器和驅動 led 燈的 IO 口是同一個,即
PD4,所以,我們只要把 J7 的跳帽往左一換,如圖 2.2- 1 所示:











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





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






圖 2.2- 3 BEEP_CSR 寄存器
設置蜂鳴器控制寄存器 BEEP_CSR 中的 BEEPDIV[4:0]來分頻獲取 8KHZ 的 時鐘,再通過 BEEPSEL 最終產生 1KHZ、2KHZ 或4KHZ 的蜂鳴信號,最后使 能該寄存器中的 BEEPEN 位,產生蜂鳴器的輸出。 蜂鳴器控制寄存器的設置:
首先設置蜂鳴器的預分頻器:BEEPDIV[4:0] = 0e 時,BEEPDIV=16; 再設置 BEEPSEL[1:0]進行蜂鳴器頻率選擇:
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硬件連接原理


本節的硬件連接在上一節已經提過,這里不再重復。




2.2.3原工程詳解


以下是蜂鳴器產生 1kHz 信號程序:


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

#define u32 unsigned long void Clk_Config(void)

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




信號;





}

while(1)              //無限循環
{
}




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

2.3定時器應用之 8位定時器點亮 LED(帶中斷)


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

2.3.1STM8的基本定時器原理簡介


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




               在計數器更新時:即計數器溢出,可產生更新中斷。 基本定時器較其他定時器相比相對簡單,下面我們介紹一下與我們這節的實
驗密切相關的幾個通用定時器的寄存器。


圖 2.3- 1 TIMx_CRI 寄存器
這個定時器的主要作用是第 0 位 CEN 和第 7 位 APPRE,用來使能計數器和 預裝載。TIMx_CRI 寄存器如圖 2.3- 1 所示。






圖 2.3- 2 TIMx_IER 寄存器
如果需要開啟計數器中斷的話,就把 TIM4_IER 寄存器的第 0 位 UIE 置 1,
TIM4 只有一個溢出中斷,即當計數器計滿時所產生的中斷。IER 寄存器如所圖
2.3- 2 示。





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


圖 2.3- 4 CNTR 寄存器
記錄計數器的當前值,可不需要配置,在編輯程序的過程中,可通過此計數 器里的值,判斷已計了多少時間。CNTR 寄存器如圖2.3- 4 所示。


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





圖 2.3- 6 ARR 寄存器
當計數器計到該寄存器里的值時,又重新返回 0,重新計數。如果開啟中斷 的話,將產生更新中斷。ARR 寄存器如圖 2.3- 6 所示。
只要對以上幾個寄存器進行簡單的設置,我們就可以使用定時器了,并且可 以產生中斷。
這一節,我們將使用定時器產生中斷,然后在中斷服務函數里面翻轉 led 上 的電平,來指示定時器中斷的產生。接下來我們來說明要經過哪些步驟,才能達 到這個要求,并產生中斷。
1)設置 TIM4_ARR 和 TIM4_PSCR 的值。 通過這兩個寄存器,我們來設置自動重裝的值,以及分頻系數。這兩個參數
加上時鐘頻率就決定了定時器的溢出時間。
2)設置 TIM4_IER 允許更新中斷。
因為我們要使用 TIM4 的更新中斷,所以設置 IER 的 UIE 位,并使能觸發中 斷。
3)允許 TIM4 工作。 光配置好定時器還不行,沒有開啟定時器,照樣不能用。我們在配置完后要
開啟定時器,通過 TIM4_CR1 的 CEN 位來設置。
6)編寫中斷服務函數。 在最后,還是要編寫定時器中斷服務函數,通過該函數來處理定時器產生的
相關中斷。在中斷產生后,通過狀態寄存器的值來判斷此次產生的中斷屬于什么 類型。然后執行相關的操作,我們這里使用的是更新(溢出)中斷,所以在狀態 寄存器 SR 的最低位。在處理完中斷之后應該向 TIM4_SR 的最低位寫 0,來清除 該中斷標志。
通過以上幾個步驟,我們就可以達到我們的目的了,使用基本 8 位定時器的 的更新中斷,來控制外部 led 的翻轉。

2.3.2硬件連接原理


同樣是點亮 led 燈的電路原理。




2.3.3原工程詳解


打開基礎篇的程序,找到 8 位定時器控制 led 燈的例程,首先還是包括頭文 件,幾個宏定義以及延時函數:
#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 ++);



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


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




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


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

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

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






圖 2.3- 8 中斷指令
在 IAR 中可以用 asm()函數來調用匯編指令,所以這里可以寫 asm(“rim”); 來開啟總中斷。但還有另外一種方式,就是調用enable_interrupt();此函數包含 在頭文件 intrinsics.h 里,具體的內容,可以參考 IAR 的 help 相關文檔,這里就 不多介紹了。
最后是中斷子函數,也是最重要的地方。
#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 實際上就是 0x19,是中斷向量的編號,一旦有中斷 產生時,CPU 憑借中斷向量編號進入中斷子函數。那么中斷向量編號是如何確 定的呢?
STM8 的 FLASH 地址是從 0x00800 開始,IAR 的中斷編號從 0  開始。中 斷向量號依次按照中斷地址遞增。如: 復位向量是0x008000,中斷向量號是
0x00; TRAP 的中斷地址是 0x008004,中斷向量號是 0x01;SPI 中斷向量號 是 0x0C;中斷向量如圖 2.3- 10 所示。


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





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

TIM4_SR_UIF = 0; 前面已經提到,此位必須每次清零,否則會導致重復中斷。 至此,我們已經把所有的代碼都詳細講解過了,按照之前的講解,編譯一下

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

2.3.4學習拓展:16位定時器控制 led


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




PD_ODR_ODR4=~PD_ODR_ODR4; TIM2_SR1_UIF = 0;

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

2.4UART通用異步收發器


2.4.1STM8串口簡介


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




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


圖 2.4- 2 UART_DR 寄存器
當我們把和串口有關的所有寄存器配置好之后,我們只需要將所要發送的數




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


圖 2.4- 3 UART_BRR1 寄存器


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






圖 2.4- 5 配置波特率的操作
fMASTER 指的是系統時鐘,默認為 2M,系統時鐘可通過 CLK_CKDIVR 寄 存器控制,前面已經提過。在此處,一定要先寫 BRR2寄存器,在寫 BRR1 寄存 器。圖 2.4- 6 是一些常用的波特率配置:


圖 2.4- 6 常用波特率配置






圖 2.4- 7 UART_CR1 寄存器
通過位 4:M 來控制字長,當需要奇偶校驗位或者是有 9 個數據位時要配置 此位,此實驗不需要配置。PS 位:用來配置奇校驗或偶校驗的。這里同樣不需 要配置。UART_CR1 寄存器如圖 2.4- 7 所示。






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






圖 2.4- 9 字節發送的配置步驟

























圖 2.4- 10 字節接收的配置步驟
上面第一個圖是字符發送的配置步驟(如圖 2.4- 9 所示),第二個是字符接 收的配置步驟(如圖 2.4- 10 所示)。因為我們不需要配置奇偶校驗和停止位等信 息(全部默認),所以我們不需要步驟 1,2,由此我們就大大簡化了程序的配置, 只需要配置 BRR 和 CR2 兩個寄存器就好。

2.4.2硬件連接原理


該實驗的硬件配置不同于前幾個實驗:





圖 2.4- 11 串口的電路原理圖
原理圖如圖 2.4- 11 所示,電腦 USB 連接著 CH340 芯片,CH340 芯片的 TXD, RXD 與 STM8S 單片機之間隔著兩個跳帽,也就是說串口 1 與 USB 串口默認是 分開的,并沒有在 PCB 上連接在一起,需要通過跳線帽來連接一下。如圖 2.4- 12 所示:


圖 2.4- 12 串口的硬件連接實物圖
連接上這里之后,我們在硬件上就設置完成了,可以開始軟件設計了。

2.4.3原工程詳解


打開基礎篇程序,串口發數的程序,讓我們一起分析一下代碼: 當然開始還是固定的頭文件,宏定義,延時函數和系統時鐘配置:
#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;              //系統時鐘 1 分頻
while(!(CLK_ICKR & 0x02));              //等待 HSI 準備好


}
這里新定義了一個數組 table,我們的目的就是用串口把這個數組里的信息發 到上位機上去。然后是串口的初始化配置:
void Uart_Init(void)
{
UART1_BRR2 = 0x00;
UART1_BRR1 = 0x0d;              //2MHZ 時波特率 9600 對應數 值
UART1_CR2 = 0x08;              //開啟發送
}
這里只配置了波特率和開啟發送功能,其他寄存器全部選擇默認。一般情況 下,都是一個停止位,沒有校驗,8 個數據位,這些在很多的上位機軟件里也是 默認的,所以這里都沒有改動。
為了調用方便,我們把發送字節寫成了一個簡單的子函數,如下:
void UART1_Sendint(unsigned int ch)
{
while((USART1_SR & 0x80) == 0x00);              // 等待數據的傳送
UART1_DR = ch;
}
然后是主函數了:
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);
}
}
主函數里配置完串口后,在 while(1)的循環里,設了一個 for 循環,把數 組 table 里的每個元素按順序發送出去,為了區別每次之間的發送,特設了 500ms 的延時。strlen()函數是獲取字符串數組的長度,在 C 語言里經常用到,包含在頭 文件 string.h 里。
接下來我們就用串口調試助手來看一看程序的效果吧。 先按照之前的方法將程序下載到板子上,然后別的可以不用動,在電腦上直
接 打 開 微 云 電 子 資 料 內 容 里 的 “ 相 關 安 裝 軟 件 及 工 具 ” 文 件 夾 里 的

串口調試助手,注意這時為了避免電腦串口的重復 占用,一定要把下載器完全關掉,必要的時候可重新拔插一下 USB 數據線。打 開的串口調試助手如圖 2.4- 13 所示:



圖 2.4- 13 串口調試助手
選擇好 COM 口和波特率,并打開串口,因為我們發送的是字符,所以不要 十六進制顯示,把 Receive As HEX 之前的勾取消,這時,我們就看到接收區出 現我們想看到的字符了,顯示界面如圖 2.4- 14 所示。





圖 2.4- 14 接收串口顯示

2.4.4學習拓展:UART之串口收發數


上面的軟件設計僅僅介紹了串口的發數功能,在這一小節,我們詳細的介紹 一下如何利用接收中斷,來接收字符,并把它發送出去。首先還是頭文件,宏定 義和系統配置:
#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;              //系統時鐘 1 分頻
while(!(CLK_ICKR & 0x02));              //等待 HSI 準備好





}
然后是串口的初始化:
void Uart_Init(void)
{
UART1_BRR2 = 0x00;
UART1_BRR1 = 0x0d;              //2MHZ 時波特率 9600 對應數值
UART1_CR2 = 0x2c;              //開啟發送 接收及接收中斷
}
這里 CR2 寄存器里我們使能了發送,接收和接收中斷功能。詳情見圖。 然后是發送函數,和主函數,注意主函數容易忘記開總中斷。
void UART1_Sendint(unsigned int ch)
{
while((USART1_SR & 0x80) == 0x00);              // 等待數據的傳送
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);



}
這個是接收中斷函數,其中中斷向量編號 UART1_R_RXNE_vector 是查看頭 文件 iostm8s103k3.h 看到了,之前也有提到。每當上位機發送一個字符時就會引 起中斷,在接收中斷里我們把接收到的字符,即 DR 寄存器里的數讀出來,賦給 ch 變量,然后再用UART1_Sendint();函數原封不動的發送出去,這樣我們再上位 機上就可以看到你發送什么,接收區就顯示什么了。串口顯示如圖 2.4- 15所示。





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

2.5ADC模擬/數字轉換


這一節我們將向大家介紹 STM8 的 ADC。本節將利用 STM8 的 ADC 通道 3
來采樣外部溫度或光強值。

2.5.1STM8ADC簡介


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






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






圖 2.5- 2 ADC_CR2 寄存器
此寄存器我們主要了解它的第 1 位和第 3 位,上面已經介紹過是什么是掃描 模式和單通道模式了,即掃描模式是開啟很多個通道,這里,我們只開了一個通 道,所以在配置此寄存器時位 1 要保持為 0。ADC_CR2 寄存器如圖 2.5- 2 所示。
由于單片機為 8 位單片機,而 ADC 采樣為 10 位,所以涉及一個在數據如何 存儲的問題。數據左對齊和右對齊的區別如圖 2.5- 3所示:






圖 2.5- 3 數據左對齊右對齊區別
然后是狀態寄存器,重點是位 7,位 5 和位[3:0],ADC_CSR 寄存器如圖 2.5- 4
所示:






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


圖 2.5- 5 ADC 數據高位寄存器


圖 2.5- 6  ADC 數據低位寄存器
當轉換結束后,采樣結果從這兩個寄存器里讀出,如果是多通道掃描模式, 數據則儲存在 ADC_DBxRH 和 ADC_DBxRL 寄存器里。ADC 數據高位寄存器如 圖 2.5- 5 所示,ADC 數據低位寄存器如圖 2.5- 6 所示。
關于更多的 ADC 的詳細功能,請參考 STM8S 微控制器參考手冊。




2.5.2硬件連接原理


原理圖如圖 2.5- 7 所示:


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

2.5.3軟件設計


打開基礎篇的最后一個程序,同樣開始是頭文件,宏定義,延時函數和系統 時鐘配置:
#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;              //系統時鐘 1 分頻
while(!(CLK_ICKR & 0x02));              //等待 HSI 準備好
}
然后是 ADC 配置:
void Adc_Config(void)
{
ADC_CR2 = 0x00;              //              禁止掃描,數據左對齊
ADC_CSR = 0x23;              // 選擇轉換通道為模擬通道 3 開啟中斷
ADC_CR1 |= 0x01;              // 從低耗喚醒轉換
delay(1);              // 等待 ADC 模塊的上電完成
}
這里我們用的是單次轉換模式,開啟的是模擬通道 3,在原理圖上連線寫的
,只是一個名稱,不要和通道 3 混淆。


void Tim4_Config(void)
{
TIM4_PSCR = 2;              //4 分頻得到 250KHZ 的定時器時鐘,定 時器加 1 就是 4us
TIM4_ARR = 0xfa;              //1ms 中斷一次 TIM4_IER_UIE = 1;              //更新中斷使能 TIM4_CR1_ARPE= 1;                            //預裝載使能 TIM4_CR1_CEN = 1;                            //啟動計數器
}
用定時器比較容易控制 ADC 的轉換頻率,這里 TIM4 定時器 1ms 中斷一次, 因此在定時器中斷函數里:
#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;
}
同樣設置了一個計數變量 i,每次 i 計 10 時(即每隔 10ms),開啟一次轉換, 當轉換完畢時,ADON 位自動清零。
以下是串口的初始化和發送函數,不再詳述。
void Uart_Init(void)
{
UART1_BRR2 = 0x00;
UART1_BRR1 = 0x0d;              //2MHZ 時波特率 9600 對應數 值
UART1_CR2 = 0x08;              //開啟發送
}
void UART1_Sendint(unsigned int ch)
{
while((UART1_SR & 0x80) == 0x00);              // 等待數據的傳送
UART1_DR = ch;
}
主函數,注意要使能全局中斷。
int main( void )
{

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

enable_interrupt();
while(1)
{


}
}
最后是 ADC 轉換結束中斷,在每隔 10ms 開啟一次中斷后,ADC 開始轉換, 轉換結束后產生如下中斷:
#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);

}
}
此時狀態寄存器的 EOC 位一定會被硬件置 1,所以要清零,然后將 ADC_DRH
和 ADC_DRL 里的數讀出來,由串口發送到上位機顯示。 最后,編譯一下程序,下載到板子上,打開串口調試助手,可看到串口發送
的數據,如圖 2.5- 9 所示:

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

2.5.4學習拓展:趣味心電監測儀


了解了 ADC 的工作原理后,我們依據此原理在上位機上制作了一個有趣的 心電監測儀。心臟檢測儀工作的硬件原理圖如圖 2.5- 10所示:






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


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




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

}


下面一段程序與前面基本相同,只是將 ADC 轉換通道由模擬通道 3(ADIN_1)
改成了模擬通道 2(ADIN_2). void Adc_Config(void)
{
ADC_CR2 = 0x00;              // 禁止掃描,數據左對齊
ADC_CSR = 0x22;              // 選擇轉換通道為模擬通道 2,開啟中斷
ADC_CR1 |= 0x01;              // 從低耗喚醒轉換
delay(1);              // 等待 ADC 模塊的上電完成
}
在這里我們只將采集到電壓的高八位發送至串口,用高八位值的變化來反映 采集心臟電壓的變化趨勢!因此,下面的一小段中斷程序中只有發送高八位的語 句!
#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);

}
}
將程序下載到學習班中,結合心電監測儀觀察現象。 心電監測儀的使用方法如下:打開心臟檢測儀軟件,打開方法為單擊電腦左
下角的開始菜單中的所有程序中的基礎型學習板實驗平臺,如圖 2.5- 12 所示。





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

圖 2.5- 13 操作心臟檢測儀




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

2.6SPI串行外設接口


2.6.1SPI總線協議簡介


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





圖 2.6- 1 SPI 時序
從機在時鐘線的上升沿或者下降沿鎖存數據。
SPI 主要特點有:可以同時發出和接收串行數據;可以當作主機或從機工作; 提供頻率可編程時鐘;發送結束中斷標志;寫沖突保護;總線競爭保護等。出于 這種簡單易用的特性,現在越來越多的芯片集成了這種通信協議,STM8 也有 SPI 接口。這里我們只對STM8S 的 SPI 接口做一個簡單的介紹,通過寄存器對 SPI 接口進行詳細了解一下。
關于 SPI 的配置很簡單,只需要配置 CR1 和 CR2 兩個寄存器就好。SPI_CR1
寄存器如圖 2.6- 2 所示,SPI_CR2 寄存器如圖 2.6- 4 所示。





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

圖 2.6- 3 SPI_CRI 位 1 位 0 功能





圖 2.6- 4 SPI_CR2 寄存器
對于單工通信,SPI 可以配置為兩種方式:
               1 條時鐘線和 1 條雙向數據線
               1 條時鐘線和 1 條數據線(雙工或接收方式) 這兩種方式由 BDM 和 BODE 控制,
              1 條時鐘線和 1 條雙向數據線
置 SPI_CR2 寄存器中的 BDM 位啟用此模式。在這個模式中,SCK 用作時鐘, 主模式中的 MOSI 或從模式中的 MISO 用作數據通信。傳輸的方向(輸入或輸出) 由 SPI_CR2 寄存器里的 BODE 位控制,當這個位是 1 的時候,數據線是輸出, 否則是輸入。
              1 條時鐘和 1 條數據線(雙工或只接收方式)
為了釋放一根 I/O 腳作為它用,可以通過設置 SPI_CR2 寄存器中的 RXONLY
位來禁止 SPI 輸出使能 。這樣的話,SPI 將運行于只接收模式。當 RXONLY 位




置 0 時,SPI 又會恢復到全雙工模式。
位 1 使能從模式軟件管理,位 0 選擇主模式,這兩位在配置過程中都要置 1, 詳細介紹請參考手冊。
還有,在 SPI 通信過程中,PE5 引腳,也就是 NSS 引腳,一般就配置為普通 的 IO 口即可,手動的拉低或拉高來控制從機的片選。

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





圖 2.6- 6 SPI_DR 寄存器
當把 SPI 配置好之后,只需要向這個寄存器里寫數或者讀數。SPI_DR 寄存 器如圖 2.6- 6 所示。

2.6.2硬件連接原理


由于本節只對 SPI 進行原理性介紹,具體應用請參考下一章內容。

2.6.3原工程詳解


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




式;


SPI_CR1_BR =0; SPI_CR1_SPE =1;

}

// 空閑狀態時 scl=0;采用從第一個時鐘邊沿開始




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




圖 2.6- 7 SPI 配置步驟
然后我們再看一下怎么進行 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);

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

2.7本章小結


至此,關于 STM8 的最基礎的知識我們已經完全介紹完了,GPIO,通用定 時器,串口,ADC 和 SPI。是不是掌握了呢,接下來,我們將進入稍稍難一點的 中級篇,程序難度高一些,但也更加有趣,讓我們繼續加油吧!


高級應用篇,不知道大家是否需要,等待下載量情況,后續推出。


完整的pdf格式文檔51黑下載地址:
學習板stm8單片機篇零基礎學習開發基礎篇教程.pdf (6.81 MB, 下載次數: 196)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:126534 發表于 2019-1-26 14:06 | 只看該作者
正是需要的,樓主威武。請問樓主中、高級篇什么時候上傳。
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

10#
ID:669166 發表于 2020-3-22 13:36 | 只看該作者
不錯,下載學習了
回復

使用道具 舉報

11#
ID:576801 發表于 2020-8-5 17:01 | 只看該作者
問題是實驗平臺哪里下載啊?
回復

使用道具 舉報

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

使用道具 舉報

13#
ID:850855 發表于 2020-11-28 21:27 來自手機 | 只看該作者
請問第一步的基礎型學習板實驗平臺軟件在哪下載
回復

使用道具 舉報

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

請問一下那個實驗平臺軟件在哪里下載呢?
回復

使用道具 舉報

15#
ID:81138 發表于 2021-1-27 09:25 | 只看該作者
那個實驗平臺軟件在哪里下載呢?
回復

使用道具 舉報

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产ts一区 | 国产又爽又黄的视频 | 黄色小视频大全 | 亚洲国产精品激情在线观看 | 精品亚洲一区二区 | 成人精品网 | 岛国av免费观看 | 涩涩视频大全 | 日韩精品在线看 | 国产第1页 | 亚洲成人午夜电影 | 国产精久久久 | 国产成人免费视频 | 99热欧美| 无人区国产成人久久三区 | www.日本在线观看 | 国产成人精品a视频 | 久久国产香蕉 | 中文字幕在线看第二 | www久久久 | 国产精品中文字幕在线 | 欧美午夜精品理论片a级按摩 | 四虎影院美女 | 亚洲福利网 | 久久久久久免费观看 | 国产视频一区二区 | 久久69精品久久久久久久电影好 | 精品人伦一区二区三区蜜桃网站 | av天天操| 伊人久久伊人 | 成人av观看 | www.9191| 黄色播放 | 国产欧美精品一区二区色综合 | 色射综合 | 日韩欧美国产精品 | 999精品视频 | 四虎永久免费影院 | 午夜影院免费体验区 | 久久免费精品视频 | 中文字幕一区二区三区四区 |