本筆記整理自B站教程MSP430F5529單片機學習視頻匯總
基于庫函數(shù)的開發(fā)—GPIO庫函數(shù)






右邊部分寫錯了,看的時候注意


基于庫函數(shù)的開發(fā)—GPIO實踐操作
LED交替閃爍
#include <msp430.h>
/*
* EXP-GPIO-01.C
*
* Created on: 2023年3月10日
* Author: ASUS
*/
#include "driverlib.h"
void main(void)
{
//關(guān)閉看門狗
WDT_A_hold(WDT_A_BASE);
//設(shè)置P1.0為輸出(LED1)
GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);
//設(shè)置P4.7為輸出(LED2)
GPIO_setAsOutputPin(GPIO_PORT_P4, GPIO_PIN7);
//設(shè)置P1.0輸出高電平(LED1點亮)
GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN0);
//設(shè)置P4.7輸出低電平(LED2熄滅)
GPIO_setOutputLowOnPin(GPIO_PORT_P4, GPIO_PIN7);
while(1)
{
//取反P4.7引腳的輸出
GPIO_toggleOutputOnPin(GPIO_PORT_P4, GPIO_PIN7);
//取反P1.0引腳的輸出
GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0);
//軟件延遲
__delay_cycles(1000000);
}
}
注意#include“driverlib.h”頭文件時要注意:
添加MSP430F5xx_6xx文件夾到當前工程下
MSP430F5xx_6xx文件夾是在導入的msp430ware_3_80_13_03包中找


把上述MSP430F5xx_6xx文件夾的路徑包含進來


按鍵控制LED
#include <msp430.h>
/*
* EXP-GPIO-02.C
*
* Created on: 2023年3月10日
* Author: ASUS
*/
#include "driverlib.h"
void main(void)
{
//關(guān)閉看門狗
WDT_A_hold(WDT_A_BASE);
//設(shè)置P1.0為輸出(LED1)
GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);
//設(shè)置P4.7為輸出(LED2)
GPIO_setAsOutputPin(GPIO_PORT_P4, GPIO_PIN7);
//設(shè)置P1.0輸出低電平(LED1熄滅)
GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);
//設(shè)置P4.7輸出低電平(LED2熄滅)
GPIO_setOutputLowOnPin(GPIO_PORT_P4, GPIO_PIN7);
//設(shè)置P2.1為輸入,上拉(S1)
GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P2, GPIO_PIN1);
//設(shè)置P1.1為輸入,上拉(S2)
GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1);
while(1)
{
//沒有按鍵按下時,為高電平;按鍵按下時為低電平
if((GPIO_INPUT_PIN_LOW == GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1)) ||
(GPIO_INPUT_PIN_LOW == GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1))
)
{
//軟件延時,相當于是按鍵消抖
__delay_cycles(5000);
if(GPIO_INPUT_PIN_LOW == GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1))
{
//等待按鍵釋放
while(GPIO_INPUT_PIN_LOW == GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1));
//改變LED1的狀態(tài),(取反P1.0引腳的輸出)
GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0);
}
if(GPIO_INPUT_PIN_LOW == GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1))
{
//等待按鍵釋放
while(GPIO_INPUT_PIN_LOW == GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1));
//改變LED1的狀態(tài),(取反P4.7引腳的輸出)
GPIO_toggleOutputOnPin(GPIO_PORT_P4, GPIO_PIN7);
}
}
//軟件延時
__delay_cycles(5000);
}
}
單個LED閃爍
#include <msp430.h>
/*
* EXAMPLE007.C
*
* Created on: 2023年3月10日
* Author: ASUS
*/
/**
* main.c
*/
void main(void)
{
unsigned i, j;
WDTCTL = WDTPW | WDTHOLD; //stop watchdog timer關(guān)閉看門狗
P4DIR |= BIT7; //p4.7方向設(shè)置為輸出
P4OUT |= BIT7; //p4.7輸出高電平,點亮LED
P4OUT &= ~BIT7; //p4.7輸出低電平,熄滅LED
while(1)
{
P4OUT |= BIT7; //p4.7輸出高電平,點亮LED
for(i = 60000; i > 0; i --)
{
for(j = 200; j > 0; j --) //延時
{
;
}
}
P4OUT &= ~BIT7; //p4.7輸出低電平,熄滅LED
for(i = 60000; i > 0; i --)
{
for(j = 200; j > 0; j --) //延時
{
;
}
}
}
}
時鐘系統(tǒng)(UCS:Unified Clock System)

有三個系統(tǒng)時鐘可以選擇ACLK、SMCLK、MCLK




VLOCLK、DCOCLK、DCOCLKDIV、REFOCLK是內(nèi)部時鐘源
VLOCLK受溫度變化影響較大;DCOCLK、DCOCLKDIV穩(wěn)定度稍微高一點;REFOCLK穩(wěn)定度更高,是經(jīng)過內(nèi)部修整之后的
上電之后MCLK、SMCLK時鐘信號默認來自DCOCLKDIV時鐘源,這是DCOCLK經(jīng)過2分頻得到的,ACLK主要來自XT1CLK










MCLK時鐘信號默認來自DCOCLKDIV時鐘源,這題的表述可能不是很準確


時鐘源如果來自LFXT1低頻晶振,當?shù)皖l晶振發(fā)生故障,不工作,系統(tǒng)會自動切換到REFOCLK(32768),場景2也同理,這是系統(tǒng)的防護機制文章來源:http://www.zghlxwxcb.cn/news/detail-462254.html



TimerA定時器基本功能









LED1通過定時器控制不斷閃爍
/*
* TimerA.C
*
* Created on: 2023年3月11日
* Author: ASUS
*/
#include <msp430.h>
int main(void)
{
//關(guān)閉看門狗
WDTCTL = WDTPW + WDTHOLD;
//引腳設(shè)置為輸出
P1DIR |= 0x01;
//使能CCR0中斷
TA0CCTL0 = CCIE;
//設(shè)置計數(shù)值
TA0CCR0 = 50000;
//選擇時鐘源,選擇工作模式
TA0CTL = TASSEL_2 + MC_1 + TACLR;
//進入LPM0,開啟全局中斷
__bis_SR_register(LPM0_bits + GIE);
__no_operation();
}
//Timer0 A0中斷服務(wù)函數(shù)
#pragma vector = TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)
{
//引腳P1.0的輸出取反
P1OUT ^= 0x01;
}
TimerA工作模式和中斷





定時器控制紅色LED閃爍
具體要求

解題思路



請思考,用軟件延時的方式,有利弊?文章來源地址http://www.zghlxwxcb.cn/news/detail-462254.html



代碼示例

#include <msp430.h>
/*
* TimerA_LED.C
* 代碼示例1:采用溢出中斷的方式
* Created on: 2023年3月11日
* Author: ASUS
*/
int main(void)
{
//停用看門狗
WDTCTL = WDTPW + WDTHOLD;
//P1.0設(shè)置為輸出
P1DIR |= BIT0;
//設(shè)置開始計數(shù)值;16384 / 32768 = 0.5s,65535-16384
TA0R = 65535 - 16384;
//選擇ACLK,連續(xù)計數(shù)模式,不要清除TAR
TA0CTL = TASSEL__ACLK + MC_2 + TAIE;
//開啟中斷
_EINT();
while(1)
{
__no_operation(); //調(diào)試用
}
}
//Timer0 A1中斷服務(wù)函數(shù)
#pragma vector = TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR(void)
{
switch(__even_in_range(TA0IV, 14))
{
case 0: //無中斷
break;
case 2: //CCR1中斷
break;
case 4: //CCR2中斷
break;
case 6: //CCR3中斷
break;
case 8: //CCR4中斷
break;
case 10: //CCR5中斷
break;
case 12: //CCR6中斷
break;
//溢出中斷
case 14:
TA0R = 65535 - 16384;
P1OUT ^= BIT0;
break;
default:
break;
}
}

#include <msp430.h>
/*
* TimerA_LED2.C
*
* Created on: 2023年3月11日
* Author: ASUS
*/
unsigned char u8_count_10ms;
int main(void)
{
//停用看門狗
WDTCTL = WDTPW + WDTHOLD;
//P1.0設(shè)置為輸出
P1DIR |= BIT0;
//使能CCR0中斷
TA0CCTL0 = CCIE;
//設(shè)置目標計數(shù)值
TA0CCR0 = 10000; //10ms
//選擇SMCLK,增計數(shù)模式,清除TAR
TA0CTL = TASSEL__SMCLK + MC_1 + TACLR;
u8_count_10ms = 0;
//開啟中斷
_EINT();
while(1)
{
__no_operation();
}
}
//Timer0 A0中斷服務(wù)函數(shù)
#pragma vector = TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)
{
u8_count_10ms ++;
if(u8_count_10ms >= 50)
{
P1OUT ^= BIT0; //P1.0的輸出取反
u8_count_10ms = 0;
}
}

#include <msp430.h>
/*
* TimerA_LED3.C
*
* Created on: 2023年3月11日
* Author: ASUS
*/
int main(void)
{
//停用看門狗
WDTCTL = WDTPW + WDTHOLD;
//P1.0設(shè)置為輸出
P1DIR |= BIT0;
//使能CCR0中斷
TA0CCTL0 = CCIE;
//設(shè)置目標計數(shù)值
TA0CCR0 = 50000; //500ms
//選擇SMCLK,增計數(shù)模式,清除TAR
TA0CTL = TASSEL__SMCLK + ID__2 + MC_1 + TACLR; //ID__2表示2分頻
TA0EX0 = TAIDEX_5; //TAIDEX_5表示5分頻,加起來10分頻
//開啟中斷
_EINT();
while(1)
{
__no_operation();
}
}
//Timer0 A0中斷服務(wù)函數(shù)
#pragma vector = TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void) //每500ms進一次中斷
{
//P1.0的輸出取反
P1OUT ^= BIT0;
}




到了這里,關(guān)于MSP430F5529單片機入門學習筆記1的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!