目錄
前言
一、msp430f5529三種點燈方式
二、總結
題外話:
前言
好久沒有更新一下MSP430F5529的博文了,發覺看的人有點少了,而且前段時間又因為電賽停了,就回歸STM32f1的懷抱,畢竟32位的确實比16位的好,而且就使用者而言,STM32肯定更占優勢······今天就再次回歸MSP430的懷抱,那麼接下來就會先從基礎的使用講起,這裡先是講用三種方式來點亮LED。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL5kTN1QzMzEjM5EDOwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
一、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,學習三種點燈方式,輕松入手哈哈。
到這裡附上我的闆子哈哈,再見各位博友,希望這一講有幫助到你,歡迎通路其他文章,三連走起哈哈,如果覺得寫得還可以,記得給部落客點個贊!
題外話:
挺喜歡彭于晏說的一句話:“我就是沒有才華,是以才用命去拼!”
學習32之路固然辛苦,但要是堅持下來了,那不是很酷?哈哈哈