初學,有什么錯誤或者不恰當的地方多多指正,大家一起交流學習。
推薦一個好去處:TI官方MSP430交流社區http://www.deyisupport.com/question_answer/microcontrollers/msp430/f/55.aspx需要注冊。在這里面提問題,都會有TI的在職工程師為你解答。
第一章,先學習I/O。I/O的操作是最基本的,而且這些寄存器也都要牢牢掌握。MSP430難就難在它有大量的寄存器需要設置,雖然不是每個都必須掌握,但I/O控制寄存器我覺得肯定還要記住的。這個太基礎了啊啊-_'
大家手里要常備一份原理圖(PCB圖),方便查線和配置引腳
一、通用I/O的簡單操作(設置)
1.1 I/O的簡介
特點:①多種復用和設置(即可控制是否輸入、是否輸出、是否接上拉電阻、是否接下拉電阻、是否可接受中斷);
②一般情況下,P1和P2都是具有中斷能力的。從P1和P2接口的各個I/O管腳引入的中斷可以獨立的被使能並且設置為上升沿或者下降沿觸發。對應的中斷向量表分別為P1IV和P2IV,它們只能進行字操作,並且PAIV這個寄存器根本不存在。
③P1、P2可合為PA,P3、P4可合為PB,…PC、PD。所以P1為8位BCD 0x00,PA為16位BCD 0x0000。當進行字操作寫入PA口時,所有的16位都被寫入這個端口;當利用字節操作寫入PA口的低字節時,高字節保持不變;
④由於430很多I/O和外圍電路接線,所以這里常用位操作。如事先定義(接下來也會用到,先在此聲明)BIT0=0X01、BIT1=0X02、BIT3=0X04…BIT7=0X80,那么將P1.1、P1.3的輸出設為1的時候,就可以這樣操作:P1OUT|=(BIT1+BIT3)。這樣顯得很清楚。
⑤沒有用到的I/O,要統一拉低為好。此外,當讀入的數據長短小於端口最大長度時,那些沒有用到的位會被視零。
1.2 I/O的簡單配置
430I/O的配置是用軟件來實現的,是通過相應的配置寄存器來實現的。(用到某個I/O時,一定要先配置好該I/O,否則易出錯)
1.2.1 I/O方向設定寄存器PXDIR
如設定P1.1和P1.2為輸出狀態,操作為: P1DIR |=(BIT1+BIT2)等價於PADIR |=(BIT1+BIT2)也等價於PADIR_L|=(BIT1+BIT2。
拉高設定為輸出,拉低設定為輸入(默認)。
1.2.2 I/O輸入設定寄存器PXIN
如設定P1.1和P1.2的輸入為低電平,操作為: P1IN &=~(BIT1+BIT2)。
1.2.3 I/O輸出設定寄存器PXOUT
①當只用為簡單的輸出時:如設定P1.1和P1.2輸出高電平,操作為: P1OUT |=(BIT1+BIT2)。
②如果該引腳為正常I/O功能,且當前已設定為輸入方向,且上拉/下拉電阻寄存器是有效地。那么PXOUT可以用來配置上拉和下拉電阻:
低電平為下拉電阻;
高電平為上拉電阻;
1.2.4 上拉/下拉電阻使能寄存器PXREN
低電平該寄存器為無效狀態;
高電平該寄存器為有效狀態;
1.2.5 輸出驅動能力設置寄存器PXDS
弱化驅動可以減弱電磁干擾EMI,全力驅動會增強電磁干擾。默認為減弱驅動。
低電平表示減弱的驅動(默認);
高電平表示全力的驅動;
1.2.6 功能選擇寄存器PXSEL
用來聲明該端口是要應用於外圍電路的特殊功能(不決定輸入輸出方向),默認為低電平。
低電平表示普通的I/O(默認);
高電平表示該引腳將有連接外圍電路的特殊用途;
如:開發板初始化函數HAL_Board.c中有這樣一句程序:
P5SEL |=(BIT2+BIT3)(=00001100);
這句話的意思就是聲明P5.2和P5.3將有特殊用途,實際上這兩個I/O接的是外部的高頻時鍾晶振(之后還要設定為輸入狀態才可以)。
此外需要注意的是,一旦某個I/O的PXSEL置高了,那么該引腳將不能再被用為中斷引腳。
總結,簡單的程序應用:
/*實現LED的閃爍*/LED位於每個觸摸按鍵下方,具體接口請查詢原理圖
#include <msp430.h> 該頭文件內部包含430各個寄存器的配置情況
void main(void)
{
WDTCTL=WDTPW+WDTHOLD; //關閉看門狗
P1DIR|=(BIT0+BIT1+BIT2+BIT3+BIT4+BIT5); //P1.0-P1.5方向為輸出,BITX的定義在msp430.h中
P1OUT&=~(BIT0+BIT1+BIT2+BIT3+BIT4+BIT5); //清零
/*P1SEL=0X00;
PXDS=0X00;默認*/
int i=0,j=0;
while(1)
{
if(i>5)
i=0;
else
{
switch(i)
{
case 0:P1OUT=0x01;break;
case 1:P1OUT=0x02;break;
case 2:P1OUT=0x04;break;
case 3:P1OUT=0x08;break;
case 4:P1OUT=0x10;break;
case 5:P1OUT=0x20;break;
}
}
i++;
for(j=20000;j>0;j--); //延時
}
}
文章摘錄於:http://blog.lehu.shu.edu.cn/879836630/A448899.html