關于msp430的特點
msp430系列單片機是一款16位的單片機,51單片機為8位,stm32系列為32位,顧名思義, 位數越高代表著該單片機處理數據的能力越快,性能也就越高。那么32位機器處理性能好,8位機器廉價性價比高,我們為什么要選擇一個中間位置的16位單片機呢。它的亮點在于它的超低功耗。
字面意思,超低功耗就是這塊板子有一個低功耗模式,進入低功耗模式之后就可以長時間極少耗損地待機,定時喚醒cpu進行工作,在能量來源很少的情況下是很有必要節約能量的。
利用官網資料
本單片機是ti公司開發的產品, 所以想要獲得其資料的最好地方就是ti官網
,在搜索欄直接搜索產品型號MSP-EXP430F5529LP, 里面有產品的各種資料,超級有用的用戶指南(user‘s guide)也在這里,雖然是全英文的,但是只要有點英語水平靜下心來慢慢看,會有很大收獲的。
用戶指南=手把手教你入門本產品
環境搭建
該單片機使用較多的編程環境有IAR和CCS。本人使用的是ccs所以對其進行講解。
Code Composer Studio (CCS) 可以在官網下載,直接搜索即可。
由于msp430單片機內部集成了仿真器, 所以直接通過usb連接到電腦就可以進行硬件仿真,非常方便。
有一個小問題可能太簡單了所以當時遇到的時候并沒有搜索到答案:
仿真的同時代碼就已經燒錄到了板中, 此時板子只要供電,就可以自動執行代碼。
學習路線
目前可以說是準備工作都結束了,可以進行調試了。
以下為本人的學習路線,供大家參考
熟悉基本操作, 操作IO口,跑馬燈。
學習中斷的原理,練習使用中斷。
學習定時器原理,練習使用定時器產生pwm波。
練習使用定時器中斷。
操作各種外設,模塊。
接下來我會簡單概述一下這個幾個部分,詳細的大家可以看看其他大神的文章,講的都很詳細。
基本操作
由于本人是從51過度過來,所以會對比51單片機的語法來寫一下一部分。
操作模式和51單片機類似,都可以進行位操作,操作相應的GPIO口就能進行相應的控制
我們來看一下下面的代碼:
//51的位操作
sbit P10=P1^0;
void main()
{
P1^1 = 1;// P1^1進行拉高
while(P10 == 1); //判斷P1^0信號
}
//msp430的位操作
void main()
{
P1DIR |= BIT1;//P1^1 GPIO設置為 OUT模式
P1OUT |= BIT1;// P1^1 進行拉高
P1DIR &=~BIT0;//P1^0 GPIO設置為 IN模式
while(P1IN & BIT0); //判斷P1^0信號
}
想要去給我們的msp430寫代碼,首先要熟悉這種操作方式,我們不能直接對應一個位去賦值了,而是要使用這種’|=‘,’&=~‘進行賦值操作(對按位與& 和按位或| 不熟悉的朋友需要去了解一下了)。
MSP430 是雙向IO口 ,從51轉過來的朋友要熟悉去主動設置GPIO口的輸入/輸出。
另外在使用ccs進行操作的時候,有很多宏定義需要去熟悉, 比如BIT0 =00000001,BIT3=0000010。
如果想要同時拉高/拉低多個io口,可以使用這樣的方法: P1OUT |= BIT0+BIT3。P1OUT &=~(BIT0+BIT3);
還有一些特殊的比如CCIE, OUTMOD_x,MC_x等等,需要大家多多熟悉了。
這一部分了解之后, 我們就可以操作很多外設了,跑馬燈什么的完全不在話下。
中斷操作
MSP430 這個單片機的中斷操作很有趣,每一個IO口都可以是一個中斷觸發位,只要開啟了中斷允許位PxIE, 該IO口觸發之后就會進入中斷,
每一個IO口 P1.0~ P1.7會觸發 同一個中斷,P1中斷:
#pragma vector=PORT1_VECTOR
__interrupt void Port1 (void) //port1 即P1
{
}
同理P2.0~P2.7 會觸發P2中斷, Px.0-Px.7會觸發Px中斷。
我們還可以進行判斷是哪一位IO口觸發的中斷, 這時就需要判斷中斷標志位 ‘IFG’。
在使用中斷后,需要清除中斷標志位(定時器中斷除外),否則中斷會持續進行,導致程序卡死。
貼上一段代碼,大家感受一下
#include unsigned int a ; void init(); void main(void) { WDTCTL=WDTPW+WDTHOLD; init(); while(1) { P1OUT = 0; //P1置0 a = P1IN; //讀取P1輸入 if(a&BIT3) { P1OUT = BIT0; //P1.0置1 } } } #pragma vector=PORT1_VECTOR __interrupt void Port1 (void) { if(P1IFG&BIT3)//判斷的是P1.3 產生的中斷。 { P1IFG=0x00;//清0 中斷標志位 P4OUT^=BIT7; //P4.7置1 } } void init() { P1IE|=BIT3; //P1^3 中斷使能 P1DIR |=(BIT0); // 設置 P1.3為輸出 P4DIR |=(BIT7); // 設置 P4.7為輸出 __enable_interrupt(); //開啟總中斷 } 除此之外,還有一些特殊中斷位,比如用定時器的捕獲比較器輸出pwm波時,TACCR0-TACCR4分別對應P1.1-P1.5 使用時需要開啟特殊中斷位 PxSEL 這個可以等到看完定時器后再進行理解。 定時器 關于定時器的操作比較復雜,常用的大概包括: 1.時鐘源的選擇 TASSELx 2.分頻控制 IDx 3.工作模式 MC 4.中斷使能 TAIE 5.中斷標志 TAIFG 6.捕獲/比較器 TACCRx 7.輸出模式 OUTMODx 詳細的可以翻一翻站內資源,有關于定時器寫的非常詳細的文章,反復看反復實踐,就能快速掌握。 貼上一段代碼大家感受一下 //定時器中斷LED閃爍 #include void init() { TA0CCTL1=CCIE; //開啟捕獲比較器1中斷 TA0CCR1=50000; //置入要比較的數值 TA0CTL|=TASSEL_1+MC_2+TAIE;//選擇SCLK時鐘,使用連續模式,開啟定時器中斷 __enable_interrupt(); //開啟總中斷 } void main(void) { WDTCTL=WDTPW+WDTHOLD; //關閉看門狗 P4DIR|=BIT7; P1DIR|=BIT0; //P1.0 為輸出方向 P1OUT=0x00; //初始化LED P1OUT = BIT0; init(); while(1); } #pragma vector=TIMER0_A1_VECTOR __interrupt void TimerA(void) { init(); P1OUT ^= BIT0; } 下面貼一個定時器產生pwm波的代碼,用到了上面說到的特殊中斷位 //在P1.3產生pwm波 #include void main(void) { unsigned int PWMPeriod = 21000; //設置PWM周期 WDTCTL = WDTPW + WDTHOLD; // 關閉看門狗 P1DIR |=BIT3; // 設置 P1.3為輸出 P1SEL |=BIT3; // 設置 P1.3為TA0.2輸出(特殊中斷位) TA0CCR0 = PWMPeriod; // 設置PWM 周期 TA0CCTL2 = OUTMOD_7; // 設置PWM 輸出模式7 TA0CTL= TASSEL_2 +MC_1; // 設置定時器A的時鐘源為SMCLK, 工作模式為1,從0到CCR0重復計數 TA0CCR2=1000; //設置捕獲比較器2, 當計數達到CCR2時觸發特殊中斷位 P1.3 __enable_interrupt(); //開啟總中斷 while(1); } 關于定時器真的有好多需要學習,本人也沒有把每一部分完全學明白,等真正用到的時候再回去翻閱。 關于實際應用 學一個東西的目標不是把這個東西學通學透,而是用這個東西達到自己的目的,學通學透只是附加品而已。 邊學邊用,邊用邊學才能有成效。 下面我將簡單舉幾個例子說一下哪些東西用到了哪部分的知識,哪部分的知識能用來做什么。 簡單的方案有很多,我只指出最麻煩的方法方便大家練習/思考 1.流水燈: 基本操作+定時器 這個就很簡單了,還可以用delay函數代替定時器,方法有很多,主要可以用來練手。 2.按鍵調速電機: 基本操作+定時器+中斷 定時器產生pwm波,特殊中斷io口輸出pwm ,通過按鍵產生中斷調整pwm參數實現調速。 3.舵機控制 : 基本操作+定時器 這個和第二個原理相同,可以同時操作 4.LCD1602/12864:基本操作 從頭到尾自己手動寫一遍的話,會對賦值等有更大的理解,代碼敲起來也會更加熟練。 5… 結尾 本人的學習過程差不多就是這樣,希望文章能給各路新手們起到引導作用。本人也還是新人一枚有很多不懂的地方,知識面也很窄,希望大神們多多批評指正。本人也會不斷學習前進,朝著大神的方向前進的。
上一篇:單片機 MSP430 獨立按鍵檢測
下一篇:MSP430 BootLoader移植
推薦閱讀
史海拾趣
寧波晨翔電子有限公司(CONNFLY)成立于1998年(前身寧波正青電子有限公司),初創時期主要致力于連接器及線材產品的研發與生產。在創始團隊的共同努力下,公司逐漸在電子連接器市場找到了自己的定位,通過不斷的技術創新和品質提升,逐漸獲得了市場的認可。
在作為Cirrus Logic分公司運營了五年后,Apex Microtechnology于2012年重新回歸獨立私營狀態。這次變革使得Apex Microtechnology能夠更加靈活地應對市場變化,加速產品創新和研發。同時,公司也擴大了其業務范圍,進一步鞏固了在電子行業的地位。
Fanstel公司自成立以來,一直將技術創新視為發展的核心驅動力。在成立初期,公司面臨技術瓶頸,產品性能難以滿足市場需求。然而,公司研發團隊通過不懈努力,成功突破了一項關鍵技術,推出了一款具有行業領先水平的新型通信設備。這款產品的推出不僅為公司贏得了大量訂單,也奠定了Fanstel在電子行業的技術領先地位。
2010年,山東匯科電氣技術有限公司在山東淄博成立,標志著匯科公司在電子行業邁出了堅實的第一步。創立之初,公司就確定了以節能環保為發展核心的戰略方向。2011年,匯科與日本富士等國內外一線品牌建立了戰略合作關系,成為富士一級代理及指定維修中心,這一舉措為公司的技術積累和市場拓展奠定了堅實基礎。
職場,亦如江湖。 猶記得當年涉世之初,對待每接觸的一個人每一件事物的態度仍像課 常上聽 老師的課,把一切看似自己學習的對象,謙恭有禮不夠勢必要做到唯唯諾諾才算是后輩新手應有的本分。 幾年過去,當年別人眼中的新人也成了別人眼中的前輩, ...… 查看全部問答∨ |
|
模塊的ioctl段的定義函數是: int camif_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { camif_cfg_t *cfg = file->private_data; struct ...… 查看全部問答∨ |
wincepb50-051231-product-update-rollup-armv4i wincepb50-061231-product-update-rollup-armv4i wincepb50-071231-product-update-rollup-armv4i 這3個補丁依次包含嗎? 是不是打07的以后就不用打上面2個了… 查看全部問答∨ |
用EVC5.0做繪制實時數據曲線(每秒采集一次數據),為何不能自動刷新? 用EVC5.0做繪制實時數據曲線(每秒采集一次數據),運行時為何不能自動刷新? 而在VC下編譯、運行卻沒有任何問題。… 查看全部問答∨ |
小弟是一個學生,學計算機的,學校從來沒教過硬件語言就讓做這個,而且是一星期之內,我們還要上課...我也看了相關方面的資料,有點頭緒,但是做不出來,希望有人能幫幫忙,感激不盡! 題目這樣的: 設計一個電子密碼鎖,在鎖開的狀態下輸入密碼,密碼共4位 ...… 查看全部問答∨ |
在PCB設計中,尤其是在高頻電路中,經常會遇到由于地線干擾而引起的一些不規律、不正常的現象。本文對地線產生干擾的原因進行分析,詳細介紹了地線產生干擾的三種類型,并根據實際應用中的經驗提出了解決措施。這些抗干擾方法在實際應用中取得了良 ...… 查看全部問答∨ |