日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

歷史上的今天

今天是:2025年07月19日(星期六)

2020年07月19日 | [MSP430] 3.UART

發(fā)布者:幸福時光 來源: eefocus關鍵字:MSP430  UART  溫度傳感器 手機看文章 掃描二維碼
隨時隨地手機看文章

這一節(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  UART  溫度傳感器 引用地址: [MSP430] 3.UART

上一篇: [MSP430] 2.中斷和計時器
下一篇:MSP432學習筆記:CCS的環(huán)境配置(庫函數(shù)的導入)

推薦閱讀

近日,加入英特爾已有3個月的明星芯片架構師Jim Keller接受了外媒VentureBeat的采訪,在采訪中談及了自己加入英特爾的始末和讓其為之興奮的新角色——英特爾公司技術、系統(tǒng)架構和客戶端事業(yè)部高級副總裁兼芯片工程事業(yè)部總經(jīng)理。 人們認為更快的芯片和摩爾定律是理所當然的事情??紤]到半導體的歷史,和已走過50年的英特爾這樣的芯片制造商的成就,這個過...
首先,必須配置和激活啟動該外設的時鐘,比如使用PB2的引腳前,必須激活GPIOB的時鐘,只有啟動時鐘后,這個外設才能變得可用。下一步根據(jù)具體功能,對外設進行設置和配置,這樣需要用到的外設才被激活,不需要的無需初始化,能夠降低功耗。配置引腳模式?對應到外設的輸入輸出功能基本有三種情況1、引腳輸出:根據(jù)外圍電路的配置選擇對應的引腳為復用功能...
#include<STC15F2K60S2.H>#include"intrins.h"#define uint unsigned int#define uchar unsigned char#define led_output P0#define led_duan_and_wei P2 //定義段選和位選unsigned char add1,add2;unsigned int num=52700,index=52700;uchar code tabe[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//顯示1,2,3,4,5,6,7,8,9...
先來回顧一下,前兩篇Linux下開發(fā)stm32(一) | 使用gcc-arm-none-eabi工具鏈編譯和Linux下開發(fā)stm32(二) | 使用openocd下載與調試中,我們介紹了如何創(chuàng)建一個空的裸機工程(只有啟動文件和main文件),并編譯工程生成elf文件,然后將其轉為bin格式或hex格式,使用openocd下載,最后編寫了一個makefile雛形,并成功點亮了一個LED~但是這個LED我們是...

史海拾趣

問答坊 | AI 解惑

基于at89c51的可燃性氣體語音報警器畢業(yè)設計

求助__基于at89c51的可燃性氣體報警器畢業(yè)設計…

查看全部問答∨

有沒有精通TI達芬奇系列DSP芯片的工程師

目前有個項目,需要請一位工程師(業(yè)余兼職即可)。 1、熟悉TI 達芬奇系列DSP芯片,有DM64xx上開發(fā),優(yōu)化經(jīng)驗。 2、熟悉H264協(xié)議或者MPEG4協(xié)議,最好在DM64XX上做過相關協(xié)議的開發(fā)或者優(yōu)化工作。 詳細可以QQ455247859聯(lián)系。 …

查看全部問答∨

關于simulink利用rtw工具箱轉化成C代碼的一些問題

        小弟是DSP初學者,想把simulink的框圖轉化成c代碼,在DSP上跑.我在rtw工具箱的設置是:     Solver:  stop time 選inf             &nb ...…

查看全部問答∨

請問激活驅動ERROR ID:2錯誤,怎么解決?

WINCE注冊表中激活驅動的時候出現(xiàn)ERROR ID:2這個錯誤,可有人知道是啥原因?…

查看全部問答∨

弱弱的一問,最大包長度的問題

例如我要傳送一張圖片 大小為100KB,而我的端點最大包長度為1KB,那么我就要傳100次是嗎,對數(shù)據(jù)的分割時應用層來做還是驅動層自動做的,我大概看了驅動的代碼好像沒有數(shù)據(jù)分割這么一說,見笑?!?

查看全部問答∨

SPI總線通信里面,是不是一個設備為主設備就永遠只能做主設備,做從設備的設備永遠只能做從設備?主從設備能不能按要求動態(tài)切換?

SPI總線通信里面,是不是一個設備為主設備就永遠只能做主設備,做從設備的設備永遠只能做從設備?主從設備能不能按要求動態(tài)切換? //================ 就是某一刻通信::A(主)-----》B(從) 隨后的某一刻通信::B(主)-----》A(從) ...…

查看全部問答∨

不間斷電源UPS問題

沒有接觸過不間斷電源,有幾個問題像大家請教,忘不惜告知,先謝了! 有裝飾用的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 ...…

查看全部問答∨

怎么用單片機控制MOS管?

小弟最近剛開始學習單片機,最近要用單片機來控制MOS管的開斷,僅僅是開斷就可以了,我想用單片機直接控制門級可以嗎?必須要加驅動電路嗎?…

查看全部問答∨

關于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 …

查看全部問答∨
小廣播
設計資源 培訓 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved