這一節(jié)我們將會看到如何在 MSP430 Launchpad 上使 用 UART 進行通信。我們的程序將會實現(xiàn)通過 UART 從 PC 讀入一個字節(jié)的數(shù)據(jù),然后發(fā)送相應的反饋字節(jié)給 PC。通信 模式為 115200 波特率,全雙工,8 位數(shù)據(jù),無奇偶校驗,1 位停止位。
MSP430 G2553(Launchpad 使用的芯片)是 MSP430 家 族中比較給力的芯片,它集成了硬件 UART 模塊。
UART 通信在處理/調試傳感器的時候尤為有用,舉一個簡單的 例子,我們可以用溫度傳感器采集數(shù)據(jù),經(jīng)過 AD 轉換之后通過 UART 發(fā)送給 PC,傳送的方式可以是有線,也可以使用無線例如藍牙。
讓我們直接進入正題吧。
首先,你應該已經(jīng)熟悉了這樣的開頭:
#include "msp430g2553.h"
#define TXLED BIT0
#define RXLED BIT6
#define TXD BIT2
#define RXD BIT1
const char string[] = { "Hello Worldn" };
unsigned int i; //Counter
像前兩節(jié)中所做的那樣,程序開頭包含 MSP430G2553 的頭文 件,然后宏定義一些常數(shù)使得程序更具可讀性。
接著我們定義了一個 char 類型數(shù)組(即一個 C String),存了 我們將要反饋給 PC 的信息(經(jīng)典的 Hello World)。最后定義一個 計數(shù)變量,輔助反饋字符串的發(fā)送。
int main(void) {
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
DCOCTL = 0; // Select lowest DCOx and MODx settings
BCSCTL1 = CALBC1_1MHZ; // Set DCO
DCOCTL = CALDCO_1MHZ;
這依然是大家熟悉的 main 函數(shù)的開始方法,首先關閉看門狗定 時器,之后的三行將單片機的內部時鐘設置為 1MHz。接下來 UART 和板上所有其他外設都將使用 SMCLK 時鐘(sub-main clock)。
P2DIR |= 0xFF; // All P2.x outputs
P2OUT &= 0x00; // All P2.x reset
P1SEL |= RXD + TXD ; // P1.1 = RXD, P1.2=TXD
P1SEL2 |= RXD + TXD ; // P1.1 = RXD, P1.2=TXD
P1DIR |= RXLED + TXLED;
P1OUT &= 0x00;
這里是配置輸入輸出引腳:
前兩行我們把 PORT2 的所有引腳關閉。對于用不到的引腳,關 閉引腳是一個比較好的習慣,這樣能有效地減少噪聲和電流的消耗。
第3行和第4行將引腳P1.1和P1.2設置為UART模式。事 實上,P1SEL 和 P1SEL2 兩個寄存器是一個多路選擇器,它們將 P1 的引腳連接至不同的板載的外設上。但是注意,TXD 和 RXD 是固定引腳的,我們可以通過查 G2553 的數(shù)據(jù)手冊找到對應的引腳。
最后兩行是初始化板載 LED。
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 = 0x08; // 1MHz 115200
UCA0BR1 = 0x00; // 1MHz 115200
UCA0MCTL = UCBRS2 + UCBRS0; // Modulation UCBRSx = 5
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
UC0IE |= UCA0RXIE; // Enable USCI_A0 RX interrupt
_EINT();
while(1)
{}
}
這是 UART 的配置。第 1 行,如同前面所說的,我們選擇 SMCLK 作為 UART 模塊的時鐘源,用來產生需要的波特率(當然, 你也可以選擇其他的時鐘源)。
UCA0BR0 和 UCA0BR1 用來選擇波特率:你可以將這兩個 寄存器存儲的整數(shù)看做對時鐘 SMCLK(1MHz)的分頻。在我們 的配置下,產生的頻率是 1MHz/8=125000Hz,而實際上我們需 要 115200 的波特率,所以在長時間的工作中會累積一定的誤差。 如果配置為 9 的話波特率又會低于 115200。這時候就需要用到 UCA0MCTL 寄存器。
這個寄存器是起調節(jié)作用的,它會選擇 8 和 9 之間的分頻因子, 在通信中可以控制累積誤差。如果分頻因子為 8,有 125000- 115200=9600(+8.5%)的誤差,如果分頻因子為 9,有 115200-111111=4089(-3.6%)的誤差。
調節(jié)器差不多會這樣工作:
位數(shù) 分頻因子 誤差(%) 累積誤差(%)
1 8 +8.5 +8.5
2 9 -3.6 +4.9
3 9 -3.6 +1.3
4 9 -3.6 -2.3
5 8 +8.5 +6.2
…… …… …… ……
在 MSP430 的編程手冊(User Guide)上可以找到一張表, 列出了 SMCLK 典型頻率和常用波特率下,UART 收發(fā)數(shù)據(jù)時期望 的最小和最大的誤差率。根據(jù)表格我們選擇 5 作為調節(jié)值。
然后我們使能所有中斷,進入循環(huán)。
?#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
P1OUT |= RXLED;
if (UCA0RXBUF == 'a') // 'a' received?
{
i = 0;
UC0IE |= UCA0TXIE; // Enable USCI_A0 TX interrupt
UCA0TXBUF = string[i++];
}
P1OUT &= ~RXLED;
}
這是當 UART 接收到數(shù)據(jù)時的中斷處理程序。如果你看過了 指導書的第二部分,你應該對中斷的概率比較熟悉了。
在中斷處理程序中,我們先點亮一個 LED,表示單片機已經(jīng) 接收到一個字節(jié)。然后我們讀 UCA0RXBUF 寄存器,這個寄存器 存儲了收到的數(shù)據(jù)。
如果收到的數(shù)據(jù)為’a’,那么就重置計數(shù)變量 i,打開發(fā)送中 斷向 PC 發(fā)送反饋字符串。
當我們把字符串的第一個字符放入 UCA0TXBUF 時,這個寄 存器就會做好準備將數(shù)據(jù)發(fā)送出去。
在這個中斷處理程序的最后,記得關閉 LED,表示接收中斷 處理完畢。
#pragma vector=USCIAB0TX_VECTOR
__interrupt void USCI0TX_ISR(void)
{
P1OUT |= TXLED;
UCA0TXBUF = string[i++]; // TX next character
if (i == sizeof(string) - 1) // TX over?
{
UC0IE &= ~UCA0TXIE; // Disable USCI_A0 TX interrupt
}
P1OUT &= ~TXLED;
}
這是UART的發(fā)送中斷處理程序。和剛才一樣,我們點亮一個 LED表示進入發(fā)送中斷。
我們將要發(fā)送的下一個字符放入緩存區(qū)中。如果字符串沒有結束, 關閉LED,中斷處理程序結束。待當前字節(jié)發(fā)送結束后,發(fā)送中斷會被再一次觸發(fā)(因為buffer中還有待發(fā)送的數(shù)據(jù))。如果反饋字 符串已經(jīng)全部載入buffer中,我們就可以關閉發(fā)送中斷,回到主程序中。
燒代碼看效果吧!
提示:通信時PC與單片機的互動可以在PC端下載一個串口助手, 比較經(jīng)典是sscom。串口助手是調試單片機程序的利器!
以下是這一節(jié)的完整代碼:
#include "msp430g2553.h"
#define TXLED BIT0
#define RXLED BIT6
#define TXD BIT2
#define RXD BIT1
const char string[] = { "Hello Worldn" };
unsigned int i; //Counter
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
DCOCTL = 0; // Select lowest DCOx and MODx settings
BCSCTL1 = CALBC1_1MHZ; // Set DCO
DCOCTL = CALDCO_1MHZ;
P2DIR |= 0xFF; // All P2.x outputs
P2OUT &= 0x00; // All P2.x reset
P1SEL |= RXD + TXD ; // P1.1 = RXD, P1.2=TXD
P1SEL2 |= RXD + TXD ; // P1.1 = RXD, P1.2=TXD
P1DIR |= RXLED + TXLED;
P1OUT &= 0x00;
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 = 0x08; // 1MHz 115200
UCA0BR1 = 0x00; // 1MHz 115200
UCA0MCTL = UCBRS2 + UCBRS0; // Modulation UCBRSx = 5
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
UC0IE |= UCA0RXIE; // Enable USCI_A0 RX interrupt
_EINT();
while (1)
{}
}
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
P1OUT |= RXLED;
if (UCA0RXBUF == 'a') // 'a' received?
{
i = 0;
UC0IE |= UCA0TXIE; // Enable USCI_A0 TX interrupt
UCA0TXBUF = string[i++];
}
P1OUT &= ~RXLED;
}
#pragma vector=USCIAB0TX_VECTOR
__interrupt void USCI0TX_ISR(void)
{
P1OUT |= TXLED;
UCA0TXBUF = string[i++]; // TX next character
if (i == sizeof(string) - 1) // TX over?
{
UC0IE &= ~UCA0TXIE; // Disable USCI_A0 TX interrupt
}
P1OUT &= ~TXLED;
}
上一篇: [MSP430] 2.中斷和計時器
下一篇:MSP432學習筆記:CCS的環(huán)境配置(庫函數(shù)的導入)
推薦閱讀
史海拾趣
品質是Cornerstone Sensors的生命線。公司建立了嚴格的質量管理體系,從原材料采購、生產制造到產品測試等各個環(huán)節(jié)都進行嚴格把控。同時,公司還注重品牌建設,通過參加行業(yè)活動、發(fā)布技術文章、提供專業(yè)培訓等方式提升品牌影響力。Cornerstone Sensors的產品逐漸成為行業(yè)內公認的高品質代表,贏得了廣泛的口碑和市場份額。
隨著業(yè)務的不斷拓展,固得沃克意識到技術升級和產能擴張的重要性。2019年,公司在江蘇鹽城成立了江蘇固得沃克微電子科技有限公司,作為新的生產基地。該基地擁有2萬平米的廠房,引進了具有國際水準的專業(yè)生產設備及先進檢測儀器,并通過了ISO9001、ISO14001等國際管理體系認證。這一舉措不僅提升了公司的生產能力和產品質量,還進一步鞏固了其在半導體行業(yè)的地位。
為了進一步提升品牌影響力和市場占有率,固得沃克積極尋求與行業(yè)內知名企業(yè)的戰(zhàn)略合作。例如,公司與銳單商城達成戰(zhàn)略合作,共同推動電子元器件的在線銷售和服務。這一合作不僅拓寬了公司的銷售渠道,還提升了公司的品牌知名度和美譽度。通過不斷參與行業(yè)交流和合作,固得沃克在電子行業(yè)中的影響力日益增強,為公司的長遠發(fā)展奠定了堅實基礎。
隨著技術的不斷成熟,DBM Optix開始積極拓展市場,將產品應用于更廣泛的領域。公司不僅在國內市場取得了顯著的成績,還積極開拓國際市場,與全球各地的客戶建立了緊密的合作關系。同時,DBM Optix還注重品牌建設,通過參加國際展會、發(fā)布技術文章等方式提升品牌知名度和影響力。這些努力使得DBM Optix逐漸成為了光學通信領域的知名品牌。
隨著業(yè)務的不斷發(fā)展,川土微電子開始在全國范圍內進行戰(zhàn)略布局。公司不僅在上海設立了總部和研發(fā)中心,還在其他地區(qū)設立了辦事處和生產基地。此外,川土微電子還積極與多家封測廠合作建立了封測專線,確保了產品的質量和供應的穩(wěn)定性。
面對日新月異的電子行業(yè)發(fā)展趨勢,Antex公司始終保持敏銳的市場洞察力和創(chuàng)新精神。公司積極推進技術開發(fā)、設備強化,不斷探索新的生產技術和應用領域。同時,Antex還注重人才培養(yǎng)和團隊建設,為公司的未來發(fā)展儲備了豐富的人才資源。
這些故事只是Antex公司發(fā)展歷程中的一部分,它們展示了公司在電子行業(yè)中的不斷努力和追求卓越的精神。未來,隨著技術的不斷進步和市場的不斷變化,Antex將繼續(xù)保持創(chuàng)新和發(fā)展,為電子行業(yè)的繁榮做出更大的貢獻。
請注意,以上內容僅為概述,并未詳細展開每個故事的每一個細節(jié)。如果需要更具體、更詳細的故事,建議查閱Antex公司的官方資料或相關新聞報道,以獲取更準確、更全面的信息。
目前有個項目,需要請一位工程師(業(yè)余兼職即可)。 1、熟悉TI 達芬奇系列DSP芯片,有DM64xx上開發(fā),優(yōu)化經(jīng)驗。 2、熟悉H264協(xié)議或者MPEG4協(xié)議,最好在DM64XX上做過相關協(xié)議的開發(fā)或者優(yōu)化工作。 詳細可以QQ455247859聯(lián)系。 … 查看全部問答∨ |
|
小弟是DSP初學者,想把simulink的框圖轉化成c代碼,在DSP上跑.我在rtw工具箱的設置是: Solver: stop time 選inf &nb ...… 查看全部問答∨ |
|
例如我要傳送一張圖片 大小為100KB,而我的端點最大包長度為1KB,那么我就要傳100次是嗎,對數(shù)據(jù)的分割時應用層來做還是驅動層自動做的,我大概看了驅動的代碼好像沒有數(shù)據(jù)分割這么一說,見笑?!? 查看全部問答∨ |
SPI總線通信里面,是不是一個設備為主設備就永遠只能做主設備,做從設備的設備永遠只能做從設備?主從設備能不能按要求動態(tài)切換? SPI總線通信里面,是不是一個設備為主設備就永遠只能做主設備,做從設備的設備永遠只能做從設備?主從設備能不能按要求動態(tài)切換? //================ 就是某一刻通信::A(主)-----》B(從) 隨后的某一刻通信::B(主)-----》A(從) ...… 查看全部問答∨ |
沒有接觸過不間斷電源,有幾個問題像大家請教,忘不惜告知,先謝了! 有裝飾用的LED燈,總功率根據(jù)項目不同一般在25W~50W之間,12Vdc。之前一直采用開關電源(輸入220,輸出12vdc)直接供電,停電后則滅。 現(xiàn)客戶提出新要求: 要求正常時,LED燈 ...… 查看全部問答∨ |
usbdemo代碼在flash可以運行,無法在ram里面運行?(問題已經(jīng)解決) IAR EWARM 4.41 & JLink & STR912FW44 & Windows 2003我把中斷向量表復制到ram的最高端, 一共64bytes.在flash里面, 中斷都沒有問題. 但是在ram里面不正常.我測試了0x04000000&nb ...… 查看全部問答∨ |
關于tiny210開發(fā)板中su: must be suid to work properly的問題 嵌入式文件系統(tǒng)一般用戶執(zhí)行su root切換根用戶提示錯誤:su: must be suid to work properly解決方法:修改busybox權限,chmod 4755 busybox … 查看全部問答∨ |