找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

CC2530 GPIO輸出控制實(shí)驗(yàn)-控制Led亮滅的詳細(xì)教程

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:244570 發(fā)表于 2017-11-1 22:39 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
1.實(shí)驗(yàn)?zāi)康?/font>
1.GPIO輸出控制實(shí)驗(yàn)-控制Led亮滅

1) 通過實(shí)驗(yàn)掌握 CC2530 芯片 GPIO 的配置方法,帶你一步步走進(jìn)嵌入式大門
2) 掌握 Led 驅(qū)動電路及開關(guān) Led 的原理
3) 試著看數(shù)據(jù)手冊 cc2530-datasheet.pdf
2.實(shí)驗(yàn)設(shè)備


硬件:PC 機(jī)
一臺

EB2530(底板、核心板、仿真器、USB線)
一套
軟件:2000/XP/win7 系統(tǒng),IAR 8.10 集成開發(fā)環(huán)境
3.實(shí)驗(yàn)相關(guān)電路圖


由于發(fā)光二級管單向?qū)щ娞匦,即只有在正向電壓(二極管的正極接正,負(fù)極接負(fù))下才 能導(dǎo)通發(fā)光。P1.0 引腳接發(fā)光二極管(D1)的負(fù)極,所以 P1.0 引腳輸出低電平 D1 亮,P1.0 引腳輸出亮電平 D1 熄滅。

提示:TI 官方的開發(fā)板是高電平點(diǎn)亮 LED 哦,我們的板子是低電平亮,更符合國人習(xí)慣, 后面協(xié)議棧也是一樣的。
更多電路圖請看“EB2530\相關(guān)資料與軟件\原理圖和參考 PCB”下的原理圖
4.實(shí)驗(yàn)相關(guān)寄存器 操作P1.0我們需要掌握相關(guān)寄存器的作用和配置方法。如下表所示(更詳細(xì)的介紹請參考 “EB2530\相關(guān)資料與軟件\cc2530-datasheet.pdf,英文不好的可參考CC2530中文數(shù)據(jù)手 冊完全版.pdf,翻譯有250頁并非官方中文,有個別地方有錯,請以英文為主哦”):

寄存器
作用

描述
P1 (0x90)
端口 1
端口 1。通用 I / O 端口?梢詮 SFR 位尋址。


P1SEL(0xF4)


端口 1 功能選擇
P1.7 到 P0.0 功能選擇
0: 通用 I / O
1: 外設(shè)功能



P1DIR(0xFE)


端口 1 方向
P1.7 到 P1.0 的 I/O 方向
0: 輸入
1: 輸出




P1INP(0xF6)



端口 1 輸入模式
P1.7 到 P1.2 的 I/O 輸入模式。由于 P1.0 和 P1.1 沒有

上拉/下拉功能, P1INP 暫時不需要配置, 了解一下為后面的實(shí)驗(yàn)打下基礎(chǔ)

0: 上拉/下拉(見 P2INP (0xF7)–端口 2 輸入模式)
1: 三態(tài)


按照表格寄存器的內(nèi)容,對 P1.0 口進(jìn)行配置,當(dāng) P1.0 輸出低電平時 D1 被點(diǎn)亮。 所以配 置如下:
P1SEL &=~0x01;  //配置P1.0為通用IO口
P1DIR |= 0x01;  //配置 P1.0 為輸出
由于 CC2530 寄存器初始化時默認(rèn)值為(詳細(xì)說明請參考 CC2530 數(shù)據(jù)手冊(中文).pdf):

P1SEL = 0x00; P1DIR = 0x00; P1INP = 0x00;

所以 IO 口初始化我們可以簡化初始化指令: P1DIR |= 0x01;   //配置 P1.0 為輸出


也許有人會問手冊怎么看?那么多頁。我們看手冊是并非一章章看下去,那樣太浪費(fèi)時 間,恐怕看兩個星期也看不完,F(xiàn)在教大家一個方法,比如這個實(shí)現(xiàn)是講 GPIO 我們就直 接看 CC2530 中文數(shù)據(jù)手冊完全版.pdf 7.IO 端口那一章,再不行找一個代碼中使用的寄存器 搜索,這方法高效吧,多做一些實(shí)驗(yàn),你看的也多了基本上也就會了,方法很重要。

5.源碼分析
打開 “EB2530\第 3 章 基礎(chǔ)實(shí)驗(yàn)\1.GPIO 輸出控制實(shí)驗(yàn)-控制 Led 亮滅\Led\Led.eww”
工程,也可以在文件夾雙擊“Led.eww”。我們先分析一下源碼后再調(diào)試程序
  1. /****************************************************************************
  2. * 文 件 名: main.c
  3. * 作    者: Andy
  4. * 修    訂: 2013-01-08
  5. * 版    本: 1.0
  6. * 描    述: GPIO 輸出控制實(shí)驗(yàn) 1 操作 IO 口控制 LED 燈的亮和滅
  7. ****************************************************************************/
  8. #include <ioCC2530.h>
  9. typedef unsigned char uchar;
  10. typedef unsigned int  uint;
  11. #define LED1 P1_0                //定義 P1.0 口為 LED1 控制端
  12. /****************************************************************************
  13. * 名    稱: DelayMS()
  14. * 功    能: 以毫秒為單位延時 16M 時大約為 530,系統(tǒng)時鐘不修改默認(rèn)為 16M
  15. * 入口參數(shù): msec 延時參數(shù),值越大,延時越久
  16. * 出口參數(shù): 無
  17. ****************************************************************************/
  18. void DelayMS(uint msec)
  19. {
  20. uint i,j;
  21. for (i=0; i<msec; i++)
  22. for (j=0; j<530; j++);
  23. }
  24. /****************************************************************************
  25. * 名              稱: InitLed()
  26. * 功              能: 設(shè)置 LED 燈相應(yīng)的 IO 口
  27. * 入口參數(shù): 無
  28. * 出口參數(shù): 無
  29. ****************************************************************************/
  30. void InitLed(void)
  31. {
  32. P1DIR |= 0x01;              //P1.0 定義為輸出口
  33. }
  34. /****************************************************************************
  35. * 程序入口函數(shù)
  36. ****************************************************************************/
  37. void main(void)
  38. {
  39. InitLed();              //設(shè)置 LED 燈相應(yīng)的 IO 口
  40. while(1)              //死循環(huán)
  41. {
  42. LED1 = 0;                //點(diǎn)亮 LED1
  43. DelayMS(1000);           //延時 1 秒 LED1 = 1;                //LED1 熄滅DelayMS(1000);           //延時 1 秒
  44. }
復(fù)制代碼

6.仿真下載程序、調(diào)試(根據(jù)自己的仿真器擇以下一種連接方式

1) SmartRF04EB 仿真器連接如下圖:







2) CC Debugger 連接如下圖:




如果編譯有錯誤,請參考最后一頁圖片說明。沒有錯誤請繼續(xù)
點(diǎn)下載調(diào)試程序,顯示如下圖所示:


如果程序錯誤我們怎么跟蹤呢?這時我們就要發(fā)揮仿真器的作用了,方法如下:
先打斷點(diǎn)讓程序停在斷點(diǎn)處再單步跟蹤變量的值。選定變量“Add to watch”即可。
光標(biāo)放在要打斷點(diǎn)的所在行,我們打在 main.c 的第 27 號,然后點(diǎn)
,或者在所在行行首雙擊,也會出現(xiàn)一個斷點(diǎn),再次雙擊可以取消此斷點(diǎn)。





再點(diǎn)全速運(yùn)行,如果程序停在斷點(diǎn)處時會變成綠色,如下圖所示

雙擊紅色圓點(diǎn)即可取消斷點(diǎn),再點(diǎn)全速運(yùn)行程序就運(yùn)行了,可以觀察實(shí)現(xiàn)現(xiàn)象了。


怎么觀察變量的值呢?選定變量右鍵在彈出的窗口選擇“Add to watch”即可。


好了,一定要學(xué)會仿真調(diào)試哦,這是解決問題最常用的方法,也是嵌入式開發(fā)中最常用的 仿真方法,大部分集成環(huán)境調(diào)試方法都大同小異的。以后的實(shí)驗(yàn)中就不重復(fù)講仿真的方 法 ,靈活使用仿真器會大大提高開發(fā)進(jìn)度。如果你有兩個仿真器并且 ID 不同時,可以在 一臺電腦同時跟蹤兩種設(shè)備,調(diào)試無線通訊中問題到底是協(xié)調(diào)器代碼有問題,還是終端代 碼有問題。此時就能發(fā)現(xiàn)兩個仿真器是如此強(qiáng)大,效率也大大提高。希望大家掌握!




編譯常用錯誤如圖所示:

1.






一般是由于 IAR 沒有裝在 C 盤造成的,修改工程 Linker 項(xiàng)即可,以后每個實(shí)驗(yàn)都要修改

哦,還是安裝在默認(rèn)路徑省事。





2.


軟件沒有注冊,請重新安裝 IAR,在第 5.6 步要仔細(xì)看。 實(shí)驗(yàn)常見問題

問題 1:為什么要用 P1_0 呢,這是硬件決定的,如果想用其它 IO 引腳就要自己跳線了


問題 2:為什么用以下賦值,直接寫等于不是更簡單?
P1DIR |= 0x01;               //P1.0 定義為輸出口 P1SEL &=~0x01;
嵌入式中位運(yùn)算只修改要修改的位,不要影響到其它位,直接等于同時也改變了其它位的狀態(tài)哦,在基礎(chǔ)實(shí)驗(yàn)功能單一,感覺不出來,如果在協(xié)議棧中就有嚴(yán)重問題了;并且用上述寫法一眼就知道操作 的位,易懂。

完整的pdf格式文檔51黑下載地址:
1.GPIO輸出控制實(shí)驗(yàn)-控制Led亮滅.pdf (1.37 MB, 下載次數(shù): 10)


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

使用道具 舉報

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

本版積分規(guī)則

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

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

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