CC2430 串列埠使用詳解

2021-06-04 08:14:05 字數 3538 閱讀 9481

為了完成課題,最近下定決心學習cc2430。網上的資料很多,重複的部分不做過多的介紹,沒有的部分做一下少許的補充,希望對大家有用!【建議各位使用更新的cc2530,該晶元為cc2430的替代版本】

全部**如下,先看一下整體!

//標頭檔案

#include "hal.h"

#include "stdio.h"

// 函式宣告

uint8 uart0_init();

void main()

}int putchar(int c)

while(!utx0if);

utx0if = 0;

u0dbuf = c;

return c;

}uint8 uart0_init()

下面一步一步分析一下

#include "hal.h" 該標頭檔案包括了操作cc2430常用暫存器的巨集,書中找到的覺得很實用。

#include "stdio.h" 呼叫printf函式,重定義putchar函式

設定了cc2430的時鐘頻率,即使用片外32mhz。根據資料手冊,cc2430可以有兩種時鐘,第一種是片外的32m石英晶振,另一種是片內的16m的rc振盪器。順便說一下,這個set_main_clock_source() 是乙個名為hal.h檔案中的「動作巨集」。我手頭有一本書,名為《zigbee技術實踐教程》,其中的**都使用了這個標頭檔案。該標頭檔案中有很多的api函式,若仔細的檢視**,配合資料手冊頁可以看懂其中各巨集的「原理」。設定時鐘的的函式原型是這樣的:

#define set_main_clock_source(source) \

do \

sleep |= 0x04; \

} \

else \

}while (0)

對應著資料手冊,完全可以看懂其中的「玄機」。由於我還處在學習cc2430的初級階段,以後就根據這個標頭檔案編寫程式。至於暫存器的話,大概知道其中的作用即可

領悟到的小技巧:

1 如果需要使用乙個複雜的動作巨集的話,多行書寫使用 \ 。

2 所有的這些動作都包含在 do{} while(0)中。

這句話把uart0的io口定義到p02 p03 p04 p05。函式原型是這樣的:

#define io_per_loc_uart0_at_port0_pin2345() do  while (0)
函式原型是這樣的:

#define uart_setup(uart, baudrate, options)      \

do else \

} \

else else \

} \

\u##uart##gcr = baud_e((baudrate),clkspd); \

u##uart##baud = baud_m(baudrate); \

\u##uart##csr |= 0x80; \\\

u##uart##ucr |= ((options) | 0x80); \

\if((options) & transfer_msb_first) \

} while(0)

若串列埠資料傳送完成,該暫存器被置位。若暫存器被置位,需要通過軟體清零。這個也是很好理解的。

說完了初始化,再來談談如何使用

putchar

和printf

函式。putchar

和printf都是c

語言標準庫函式。

printf

呼叫putchar

實現字元資料的傳送。翻看

iar的**,獲得了使用

putchar

函式的資訊。

iar中來了一段

51微控制器的**。該**位於

ew8051_compilerreference

檔案中。其中有這麼一段參考**。

#include int putchar(int c)   

while (!scon_bit.ti);

scon_bit.ti = 0;

return (sbuf = c);

}

這段**有點

51基礎的都可以看懂。唯一需要說明的就是,如果出現轉義字元

\n(回車)的話,先輸出轉義字元

\t(換行)。簡單說,

windows

喜歡先來換行(

\r),再來回車(

\n)。而

linux

中只要乙個回車就ok。

同理,cc2430

的**就是可以這樣寫:

int putchar(int c)

while(!utx0if);

utx0if = 0;

u0dbuf = c;

return c;

}

接下來必須說說

iar中相關的設定,在

ew8051_userguide

中,指出了

printf

和scanf

函式的相關設定。p

rintf

包含了small medium large

三個選項。每個選型包含不同的

printf

功能,當然功能越全,消耗的資源也就越多。在這裡我就先設定成

small

了。iar

的說明檔案中也給出了這個選項引數所提供的功能,如下表所示。

最後給出實驗的結果,雖然**非常的簡單,但是我還是花了一整個下午去除錯,後來發現其實是

iar中的

link

中某引數選擇錯誤了。實驗的結果還是預想的那樣,使用的時候還是要注意串列埠的引數設定,

cc2430

的串列埠除錯助手的引數要一致。

串列埠的使用非常的重要,它是

pc機和微控制器的重要橋梁。現在,微控制器負責採集資料,而

pc機負責分析處理資料。在這個示例**中,通過使用

hal標頭檔案,避免了複雜難記的暫存器操作,從而快速的初始化串列埠;通過改寫

putchar

函式,寫出了適合

cc2430

串列埠輸出的函式;最後使用了標準的

printf

函式實現了串列埠輸出。

CC2430 串列埠通訊UART

cc2430有兩個序列通訊介面usart0和usart1,本實驗採用第乙個介面。要實現的功能是在超級終端傳送資料到開發板,並且在lcd上顯示。那麼,此實驗中uart中主要用的是接受功能。當u0csr.re 1時,在uart上資料接收就開始了。然後uart會在輸入引腳中尋找有效起始位,並且設定u0cs...

基於CC2430的串列埠無線模組的設計

1 引言 隨著現代科技的飛速發展,無線通訊技術成為人們日益關注的問題之一。在工業系統控制中。短距離無線通訊技術應用也越來越廣泛。水阻試驗是內燃機車恆功率負載試驗的主要方式之一,本文論述了在對內燃機車智慧型化水阻試驗系統資料採集部分的改進中,將原來的有線資料採集改為無線資料採集傳輸方式的無線模組設計。...

藍芽CC2541 串列埠學習筆記

usart暫存器如下 1.u0csr 為 usart0的控制和狀態 7位 usart模式選擇 0為spi模式 1為usart模式 6為 usart接收使能 0為禁止 1為使能接收 5位 spi主從模式設定 0主模式 1為從模式 4位 usart幀錯誤狀態 0沒有錯誤 1有錯誤 3位 usart奇偶校...