天天看點

基于MSP430F5529的三種點燈方式(基本、定時、外部中斷),快來瞧瞧!前言一、msp430f5529三種點燈方式二、總結題外話:

目錄

前言

一、msp430f5529三種點燈方式

二、總結

題外話:

前言

好久沒有更新一下MSP430F5529的博文了,發覺看的人有點少了,而且前段時間又因為電賽停了,就回歸STM32f1的懷抱,畢竟32位的确實比16位的好,而且就使用者而言,STM32肯定更占優勢······今天就再次回歸MSP430的懷抱,那麼接下來就會先從基礎的使用講起,這裡先是講用三種方式來點亮LED。

基于MSP430F5529的三種點燈方式(基本、定時、外部中斷),快來瞧瞧!前言一、msp430f5529三種點燈方式二、總結題外話:

一、msp430f5529三種點燈方式

在MSP430f5529中對于LED燈,均是高電平觸發,輸入高電平後就點亮,輸入低電平就熄滅,這個不同于51和STM32,這是比較基礎的。那麼接下來就主要用三種方式讓你快速點燈。

1、基本方式

基本方式就是直接設定一個延時,然後令它循環1點亮,這裡我們點亮LED1(P1.0), 首先設定好輸出模式,即P1DIR |= BIT0,這句代碼的意思就是設定為輸出模式,之後就是直接簡單一句輸出1即可實作燈的點亮,即 P1OUT |= BIT0,這句代碼就是設定輸出為1,若是想要輸出為0,即輸出P1OUT &= ~BIT0,這就是輸出0。那麼延時呢?如果不考慮更新時鐘頻率(系統初始預設1MHZ時鐘頻率),那麼可以直接采用一句__delay_cycles(x)函數延時,但是這個x代表就是幾us,是以要延時ms數字就比較大,是以可以自行修改這個自帶的延時,具體參照下面代碼:

#include <msp430.h> 

#define CPU_F ((double)1000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))//重新定義延時函數
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

int main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	// 停止看門狗
    P1DIR |= BIT0;                //設定P1.0口為輸出模式

	 while (1)
	  {
	     P1OUT |= BIT0;            //P1.0輸出高(LED1點亮)
	     delay_ms(1000);
	     P1OUT &= ~BIT0;             //P1.0輸出低(LED1熄滅)
	     delay_ms(1000);
	  }

}
           

2、定時方式

定時方式,顧名思義就是要用到定時器了,那麼怎麼使用呢?

MSP430F5529有四個定時器,分别是Timer0_A、Timer1_A、Timer2_A、Timer0_B(兩類,A類和B類,具體使用不詳講),這裡為我用到了Timer0_A,那麼簡單來說,無非就是定時器使能,設定好各種參數(模式),開啟(使能)中斷,運作中斷函數,這些其實跟其他單片機用起來差别不大,但是運用的代碼不一樣

那麼怎麼利用定時器确定自己想要的時間?這就補上

首先系統預設情況下一般為ACLK(32768HZ)、SMCLK(1MHZ)、MCLK(1MHZ)三種,那麼先設定一個參考時鐘,選用TASSEL_2為SMCLK,那麼TASSEL有多少種選擇呢?0為TACLK(外部時鐘源)1為ACLK(輔助時鐘源),2為SMCLK(子系統時鐘源),3為~TACLK;

下一講再講一下系統時鐘源的問題,這裡就簡單說明一下 

那麼時間就等于50000/1000000=0.05,之後0.05*20=1s,那麼最終結果就是LED燈1S閃爍一次

剩下部分代碼都有詳細的注釋了,相信可以很快了解。

#include <msp430.h> 

#define CPU_F ((double)1000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

unsigned char count=0;

int main(void)//定時器口中斷控制函數
{

	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
	P1DIR |= BIT0;              //P1.0置為輸出
	TA0CCTL0 = CCIE;            //CCR0中斷使能
	TA0CCR0 = 50000;            //設定計數值
	TA0CTL =TASSEL_2+MC_1+TACLR;//SMCLK,增計數模式,清除TAR
	_bis_SR_register(LPM0_bits+GIE);//低功耗模式0,使能中斷
}

#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)
{
    count++;
    if(count==20)
    {
     count=0;
     P1OUT ^= BIT0;                          //1s改變LED1燈狀态
    }
}
           

3、外部中斷方式

看完前面兩種方式,那麼最後一種即為外部中斷了,這裡其實就是按鍵中斷,設定按鍵P1.1控制LED亮滅狀态,這裡就是幾個寄存器函數的使用了,基本都詳細注釋出來了,相信也比較好了解。

#include <msp430.h> 

#define CPU_F ((double)1000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

int main(void)//io口中斷控制函數
{
  WDTCTL = WDTPW + WDTHOLD;                 // 關閉看門狗
  P1DIR |=  BIT0;                           // 設定P1.0口方向為輸出
  P1OUT &= ~BIT0;
  P1REN |=  BIT1;                           // 使能P1.1上拉電阻
  P1OUT |=  BIT1;                           // P1.1口置高電平
  P1IES |=  BIT1;                           // 中斷沿設定(下降沿觸發)
  P1IFG &= ~BIT1;                           // 清P1.1中斷标志
  P1IE  |=  BIT1;                           // 使能P1.1口中斷

  __bis_SR_register(LPM4_bits + GIE);       // 進入低功耗模式4 開中斷
  __no_operation();                                   // 空操作

}
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
   if((P1IN&BIT1)==0)
   {
      delay_ms(50);
      P1OUT ^= BIT0;                          //改變LED1燈狀态
      delay_ms(50);
      P1IFG &= ~BIT1;                         //清P1.1中斷标志位
      delay_ms(50);
   }
}
           

二、總結

關于這一部分的學習,其實就是對基本寄存器的學習,畢竟都是從點燈開始的,下一篇我會着重講一下時鐘的配置問題,這一問題是比較重要的,因為如果不配置時鐘的話,後續各種操作會因為預設1MHZ的時鐘源變得相當緩慢,是以配置時鐘就變得尤為重要,這一講主要還是比較基礎的認識MSP430,學習三種點燈方式,輕松入手哈哈。

基于MSP430F5529的三種點燈方式(基本、定時、外部中斷),快來瞧瞧!前言一、msp430f5529三種點燈方式二、總結題外話:

到這裡附上我的闆子哈哈,再見各位博友,希望這一講有幫助到你,歡迎通路其他文章,三連走起哈哈,如果覺得寫得還可以,記得給部落客點個贊!

題外話:

挺喜歡彭于晏說的一句話:“我就是沒有才華,是以才用命去拼!”

學習32之路固然辛苦,但要是堅持下來了,那不是很酷?哈哈哈

繼續閱讀