娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年03月18日(星期二)

正在發生

2021年03月18日 | 430學習筆記之我見

發布者:石頭上種莊稼 來源: eefocus關鍵字:MSP430  學習筆記 手機看文章 掃描二維碼
隨時隨地手機看文章

簡介:這只是我在學習TI公司生產的16位超的功耗單片機MSP430的隨筆,希望能對其他朋友有所借鑒,不對之處還請多指教。講解430的書現在也有很多了,不過大多數都是詳細說明底層硬件結構的,看了不免有些空洞和枯燥,我認為了解一個MCU的操作首先要對其基礎特性有所了解,然后再仔細研究各模塊的功能。


1.首先你要知道msp430的存儲器結構。典型微處理器的結構有兩種:馮。諾依曼結構——程序存儲器和數據存儲器統一編碼;哈佛結構——程序存儲器和數據存儲器;MSP430系列單片機屬于前者,而常用的mcs51系列屬于后者。


0-0xf特殊功能寄存器;0x10-0x1ff外圍模塊寄存器;0x200-?根據不同型號地址從低向高擴展;0x1000-0x107f seg_b0x1080_0x10ff seg_a 供flash信息存儲


剩下的從0xffff開始向下擴展,根據不同容量,例如149為60KB,0xffff-0x1100


2. 復位信號是MCU工作的起點,430的復位型號有兩種:上電復位信號POR和上電清楚信號PUC。POR信號只在上電和RST/NMI復位管腳被設置為復位功能,且低電平時系統復位。而PUC信號是POR信號產生,以及其他如看門狗定時溢出、安全鍵值出現錯誤是產生。但是,無論那種信號觸發的復位,都會使MSP430在地址0xffff處讀取復位中斷向量,然后程序從中斷向量所指的地址開始執行。復位后的狀態不寫了,詳見參考書,嘿嘿。


3. 系統時鐘是一個程序運行的指揮官,時序和中斷也是整個程序的核心和中軸線。430最多有三個振蕩器,DCO內部振蕩器;LFXT1外接低頻振蕩器,常見的 32768HZ,不用外接負載電容;也可接高頻450KHZ-8M,需接負載電容;XT2接高頻450KHZ-8M,加外接電容。


430有三種時鐘信號:MCLK系統主時鐘,可分頻1 2 4 8,供cpu使用,其他外圍模塊在有選擇情況下也可使用;SMCLK系統子時鐘,供外圍模塊使用,可選則不同振蕩器產生的時鐘信號;ACLK輔助時鐘,只能由LFXT1產生,供外圍模塊。


4.中斷是430處理器的一大特色,因為幾乎每個外圍模塊都能產生,430可以在沒有任務時進入低功耗狀態,有事件時中斷喚醒cpu,處理完畢再次進入低功耗狀態。


整個中斷的響應過程是這樣的,當有中斷請求時,如果cpu處于活動狀態,先完成當前命令;如果處于低功耗,先退出,將下一條指令的pc值壓入堆棧;如果有多個中斷請求,先響應優先級高的;執行完后,等待中斷請求標志位復位,要注意,單中斷源的中斷請求標志位自動復位,而多中斷的標志位需要軟件復位;然后系統總中斷允許位SR.GIE復位,相應的中斷向量值裝入pc,程序從這個地址繼續執行。


這里要注意,中斷允許位SR.GIE和中斷嵌套問題。如果當你執行中斷程序過程中,希望可以響應更高級別的中斷請求時,必須在進入第一個中斷時把SR.GIE置位。


其實,其他的外圍模塊時鐘沿著時鐘和中斷這個核心來執行的。具體的結構我也不羅索了,可以參考430系列手冊。


我想在寫一下c語言對430編程的整體結構?;旧蠈儆诳蚣芙Y構,即整體的模塊化編程,其實這也是硬件編程的基本法則拉(可不是我規定的法則哦)。


首先是程序的頭文件,包括#include ,這是14系列,因為常用149;其他型號可自己修改。還可以包括#include "data.h" 等數據庫頭文件,或函數變量聲明頭文件,都是你自己定義的哦。


接著就是函數和變量的聲明 void Init_Sys(void);系統初始化


系統初始化是個整體的概念,廣義上講包括所有外圍模塊的初始化,你可以把外圍模塊初始化的子函數寫到Init_Sys()中,也可以分別寫各個模塊的初始化。但結構的簡潔,最好寫完系統的時鐘初始化后,其他所用到的模塊也在這里初始化。


void Init_Sys()


{


unsigned int i;


BCSCTL1&=~XT2OFF; //打開XT2振蕩器


do


{


IFG1 &= ~OFIFG; // 清除振蕩器失效標志


for (i = 0xFF; i > 0; i--); // 延時,等待XT2起振


}


while ((IFG1 & OFIFG) != 0); // 判斷XT2是否起振


BCSCTL2 =SELM_2+SELS; //選擇MCLK、SMCLK為XT2


//以下對各種模塊、中斷、外圍設備等進行初始化


........................................


_EINT(); //打開全局中斷控制


}


這里涉及到時鐘問題,通常我們選擇XT2為8M晶振,也即系統主時鐘MCLK為8M,cpu執行命令以此時鐘為準;但其他外圍模塊可以在相應的控制寄存器中選擇其他的時鐘,ACLK;當你對速度要求很低,定時時間間隔大時,就可以選擇ACLK,例如在定時器Timea初始化中設置。


主程序: void main( void )


{


WDTCTL = WDTPW + WDTHOLD; //關閉看門狗


InitSys(); //初始化


//自己任務中的其他功能函數


。。。。。。。。。。。。。。。。。。。。。


while(1);


}


主程序之后我要講講中斷函數,中斷是你做單片機任務中不可缺少的部分,也可以說是靈魂了(夸張嗎)。


/*****************************************************************************


各中斷函數,可按優先級依次書寫


***********************************************************************/


舉個定時中斷的例子:


初始化 void Init_Timer_A(void)


{


TACTL = TASSEL0 + TACLR; // ACLK, clear TAR


CCTL0 = CCIE; // CCR0 中斷使能


CCR0=32768; //定時1s


TACTL|=MC0; //增計數模式


}


中斷服務 #pragma vector=TIMERA0_VECTOR


__interrupt void TimerA0()


{


// 你自己要求中斷執行的任務


}


當然,還有其他的定時,和多種中斷,各系列芯片的中斷向量個數也不同。


這就是簡單的整體程序框架,寫得簡單啦,還忘諒解,明天詳細了解一下各外圍模塊的初始化和功能,晚安。


整體的程序設計結構,包括了所有外圍模塊及內部時鐘,中斷,定時的初始化。具體情況大家可以根據自己的需要添加或者減少,記住,模塊化設計時最有力的武器。


這可是個人總結的經典阿,謝謝支持。因為經常使用149,所以這是149的結構,其他的再更改,根據個人需要。


/*****************************************************************************


文件名:main.c


描述:MSP430框架程序。適用于MSP430F149,其他型號需要適當改變。


不使用的中斷函數保留或者刪除都可以,但保留時應確保不要打開不需要的中斷。


*****************************************************************************/


//頭文件


#include


//函數聲明


void InitSys();


int main( void )


{


WDTCTL = WDTPW + WDTHOLD; //關閉看門狗


InitSys(); //初始化


start:


//以下填充用戶代碼


LPM3; //進入低功耗模式n,n:0~4。若不希望進入低功耗模式,屏蔽本句


goto start;


}


/*****************************************************************************


系統初始化


******************************************************************************/


void InitSys()


{


unsigned int iq0;


//使用XT2振蕩器


BCSCTL1&=~XT2OFF; //打開XT2振蕩器


do


{


IFG1 &= ~OFIFG; // 清除振蕩器失效標志


for (iq0 = 0xFF; iq0 > 0; iq0--); // 延時,等待XT2起振


}


while ((IFG1 & OFIFG) != 0); // 判斷XT2是否起振


BCSCTL2 =SELM_2+SELS; //選擇MCLK、SMCLK為XT2


//以下填充用戶代碼,對各種模塊、中斷、外圍設備等進行初始化


_EINT(); //打開全局中斷控制,若不需要打開,可以屏蔽本句


}


/*****************************************************************************


端口2中斷函數


******************************************************************************/


#pragma vector=PORT2_VECTOR


__interrupt void Port2()


{


//以下為參考處理程序,不使用的端口應當刪除其對于中斷源的判斷。


if((P2IFG&BIT0) == BIT0)


{


//處理P2IN.0中斷


P2IFG &= ~BIT0; //清除中斷標志


//以下填充用戶代碼


}


else if((P2IFG&BIT1) ==BIT1)


{


//處理P2IN.1中斷


P2IFG &= ~BIT1; //清除中斷標志


//以下填充用戶代碼


}


else if((P2IFG&BIT2) ==BIT2)


{


//處理P2IN.2中斷


P2IFG &= ~BIT2; //清除中斷標志


//以下填充用戶代碼


}


else if((P2IFG&BIT3) ==BIT3)


{


//處理P2IN.3中斷


P2IFG &= ~BIT3; //清除中斷標志


//以下填充用戶代碼


}


else if((P2IFG&BIT4) ==BIT4)


{


//處理P2IN.4中斷


P2IFG &= ~BIT4; //清除中斷標志


//以下填充用戶代碼


}


else if((P2IFG&BIT5) ==BIT5)


{


//處理P2IN.5中斷


P2IFG &= ~BIT5; //清除中斷標志


//以下填充用戶代碼


}


else if((P2IFG&BIT6) ==BIT6)


{


//處理P2IN.6中斷


P2IFG &= ~BIT6; //清除中斷標志


//以下填充用戶代碼


}


else


{


//處理P2IN.7中斷


P2IFG &= ~BIT7; //清除中斷標志


//以下填充用戶代碼


}


LPM3_EXIT; //退出中斷后退出低功耗模式。若退出中斷后要保留低功耗模式,將本句屏蔽


}


/*****************************************************************************


USART1發送中斷函數


******************************************************************************/


#pragma vector=USART1TX_VECTOR


__interrupt void Usart1Tx()


{


//以下填充用戶代碼


LPM3_EXIT; //退出中斷后退出低功耗模式。若退出中斷后要保留低功耗模式,將本句屏蔽


}


/*****************************************************************************


USART1接收中斷函數


******************************************************************************/


#pragma vector=USART1RX_VECTOR


__interrupt void Ustra1Rx()


{


//以下填充用戶代碼


LPM3_EXIT; //退出中斷后退出低功耗模式。若退出中斷后要保留低功耗模式,將本句屏蔽


}


/*****************************************************************************


端口1中斷函數


多中斷中斷源:P1IFG.0~P1IFG7


進入中斷后應首先判斷中斷源,退出中斷前應清除中斷標志,否則將再次引發中斷


******************************************************************************/


#pragma vector=PORT1_VECTOR


__interrupt void Port1()


{


//以下為參考處理程序,不使用的端口應當刪除其對于中斷源的判斷。


if((P1IFG&BIT0) == BIT0)


{


//處理P1IN.0中斷


P1IFG &= ~BIT0; //清除中斷標志


//以下填充用戶代碼


}


else if((P1IFG&BIT1) ==BIT1)


{


//處理P1IN.1中斷


P1IFG &= ~BIT1; //清除中斷標志


//以下填充用戶代碼


}


else if((P1IFG&BIT2) ==BIT2)


{


//處理P1IN.2中斷


P1IFG &= ~BIT2; //清除中斷標志


//以下填充用戶代碼


}


else if((P1IFG&BIT3) ==BIT3)


{


//處理P1IN.3中斷


P1IFG &= ~BIT3; //清除中斷標志


//以下填充用戶代碼


}


else if((P1IFG&BIT4) ==BIT4)


{


//處理P1IN.4中斷


P1IFG &= ~BIT4; //清除中斷標志


//以下填充用戶代碼


}


else if((P1IFG&BIT5) ==BIT5)


{


//處理P1IN.5中斷


P1IFG &= ~BIT5; //清除中斷標志


//以下填充用戶代碼


}


else if((P1IFG&BIT6) ==BIT6)


{


//處理P1IN.6中斷


P1IFG &= ~BIT6; //清除中斷標志


//以下填充用戶代碼


}


else


{


//處理P1IN.7中斷


P1IFG &= ~BIT7; //清除中斷標志


//以下填充用戶代碼


}


LPM3_EXIT; //退出中斷后退出低功耗模式。若退出中斷后要保留低功耗模式,將本句屏蔽


}


/*****************************************************************************


定時器A中斷函數


多中斷中斷源:CC1~2 TA


******************************************************************************/


#pragma vector=TIMERA1_VECTOR


__interrupt void TimerA1()


{


//以下為參考處理程序,不使用的中斷源應當刪除


switch (__even_in_range(TAIV, 10))


{


case 2:


//捕獲/比較1中斷


//以下填充用戶代碼


break;


case 4:


//捕獲/比較2中斷


//以下填充用戶代碼


break;


case 10:


//TAIFG定時器溢出中斷


//以下填充用戶代碼


break;


}


LPM3_EXIT; //退出中斷后退出低功耗模式。若退出中斷后要保留低功耗模式,將本句屏蔽


}


/*****************************************************************************


定時器A中斷函數


中斷源:CC0


******************************************************************************/


#pragma vector=TIMERA0_VECTOR


__interrupt void TimerA0()


{


//以下填充用戶代碼


LPM3_EXIT; //退出中斷后退出低功耗模式。若退出中斷后要保留低功耗模式,將本句屏蔽


}


/*****************************************************************************


AD轉換器中斷函數


多中斷源:摸擬0~7、VeREF+、VREF-/VeREF-、(AVcc-AVss)/2


沒有處理ADC12TOV和ADC12OV中斷標志


******************************************************************************/


#pragma vector=ADC_VECTOR


__interrupt void Adc()


{


//以下為參考處理程序,不使用的中斷源應當刪除


if((ADC12IFG&BIT0)==BIT0)


{


//通道0


//以下填充用戶代碼


}


else if((ADC12IFG&BIT1)==BIT1)


{


//通道1


//以下填充用戶代碼


}


else if((ADC12IFG&BIT2)==BIT2)


{


//通道2


//以下填充用戶代碼


}


else if((ADC12IFG&BIT3)==BIT3)


{


//通道3


//以下填充用戶代碼


}


else if((ADC12IFG&BIT4)==BIT4)


{


//通道4


//以下填充用戶代碼


}


else if((ADC12IFG&BIT5)==BIT5)


{


//通道5


//以下填充用戶代碼


}


else if((ADC12IFG&BIT6)==BIT6)


{


//通道6


//以下填充用戶代碼


}


else if((ADC12IFG&BIT7)==BIT7)


{


//通道7


//以下填充用戶代碼


}


else if((ADC12IFG&BIT8)==BIT8)


{


//VeREF+


//以下填充用戶代碼


}


else if((ADC12IFG&BIT9)==BIT9)


{


//VREF-/VeREF-


//以下填充用戶代碼


}


else if((ADC12IFG&BITA)==BITA)


{


//溫度


//以下填充用戶代碼


}


else if((ADC12IFG&BITB)==BITB)


{


//(AVcc-AVss)/2


//以下填充用戶代碼


}


LPM3_EXIT; //退出中斷后退出低功耗模式。若退出中斷后要保留低功耗模式,將本句屏蔽


}


/*****************************************************************************


USART0發送中斷函數


******************************************************************************/


#pragma vector=USART0TX_VECTOR


__interrupt void Usart0Tx()


{


//以下填充用戶代碼


LPM3_EXIT; //退出中斷后退出低功耗模式。若退出中斷后要保留低功耗模式,將本句屏蔽


}


/*****************************************************************************


USART0接收中斷函數


******************************************************************************/


#pragma vector=USART0RX_VECTOR


__interrupt void Usart0Rx()


{


//以下填充用戶代碼


LPM3_EXIT; //退出中斷后退出低功耗模式。若退出中斷后要保留低功耗模式,將本句屏蔽


}


/*****************************************************************************


看門狗定時器中斷函數


******************************************************************************/


#pragma vector=WDT_VECTOR


__interrupt void WatchDog()


{


//以下填充用戶代碼


LPM3_EXIT; //退出中斷后退出低功耗模式。若退出中斷后要保留低功耗模式,將本句屏蔽


}


/*****************************************************************************


比較器A中斷函數


******************************************************************************/


#pragma vector=COMPARATORA_VECTOR


__interrupt void ComparatorA()


{


//以下填充用戶代碼


LPM3_EXIT; //退出中斷后退出低功耗模式。若退出中斷后要保留低功耗模式,將本句屏蔽


}


/*****************************************************************************


定時器B中斷函數


多中斷源:CC1~6 TB


******************************************************************************/


#pragma vector=TIMERB1_VECTOR


__interrupt void TimerB1()


{


//以下為參考處理程序,不使用的中斷源應當刪除


switch (__even_in_range(TBIV, 14))


{


case 2:


//捕獲/比較1中斷


//以下填充用戶代碼


break;


case 4:


//捕獲/比較2中斷


//以下填充用戶代碼


break;


case 6:


//捕獲/比較3中斷


//以下填充用戶代碼


break;


case 8:


//捕獲/比較4中斷


//以下填充用戶代碼


break;


case 10:


//捕獲/比較5中斷


//以下填充用戶代碼


break;


case 12:


//捕獲/比較6中斷


//以下填充用戶代碼


break;


case 14:


//TBIFG定時器溢出中斷


//以下填充用戶代碼


break;


}


LPM3_EXIT; //退出中斷后退出低功耗模式。若退出中斷后要保留低功耗模式,將本句屏蔽


}


/*****************************************************************************


定時器B中斷函數


中斷源:CC0


******************************************************************************/


#pragma vector=TIMERB0_VECTOR


__interrupt void TimerB0()


{


//以下填充用戶代碼


LPM3_EXIT; //退出中斷后退出低功耗模式。若退出中斷后要保留低功耗模式,將本句屏蔽


}


/*****************************************************************************


不可屏蔽中斷函數


******************************************************************************/

[1] [2]
關鍵字:MSP430  學習筆記 引用地址:430學習筆記之我見

上一篇:基于MSP430單片機的CPU卡模板程序(一)
下一篇:MSP430看門狗程序

推薦閱讀

? ?Galaxy S9系列發布之后,下半年的Galaxy Note 9便成為很多人關注的一款三星新機之一。最新消息顯示,三星已經在哥倫比亞提交Galaxy Note 9的商標申請,提交日期為3月12日,Note 9預計會在8月份發布?! ∪绻悴⒉淮蛩阗徺I三星最新發售的Galaxy S9/S9 Plus,那Note 9到的確可以期待下。首先,Note 9肯定會改進其標志性的S Pen手寫體驗,...
為什么要追蹤人臉?大概,是想要實現什么大膽的想法吧。比如加個貼緊臉部的特技:來自Face Maker應用有個叫做Niko的程序猿,發布了擁有81個關鍵點的面部檢測工具:NikoNiko說,他在Dlib庫68個關鍵點的基礎上加了13個,把前額也包含在追蹤范圍里。那樣,就可以加上更豐富的特技了。比如,帶個帽子:來自Tommy Palladino,并非Niko成果介紹一下先來仔細看...
近日,小米官方宣布3月1日起啟動小米服務月活動,內含免費清潔和消毒、免費貼膜以及49元換電池。有細心的用戶發現,換電池活動中并不包括小米6,官方稱超過三年的老產品備料很困難,但經過努力,官方終于帶來了小米6換電池活動。雷軍表示,49元換電池,希望大家能繼續堅持3年! 小米手機...
專注于引入新品的全球電子元器件授權分銷商貿澤電子 (Mouser Electronics) 即日起備貨ams的AS7038xB生命體征傳感器和AS7030B生命體征模塊。這些小型傳感器適用于多種新型醫療可穿戴設備和遠程診斷設備,例如用于測量血氧飽和度(SpO2) 和心電圖 (ECG) 的一次性貼片。 貿澤電子分銷的ams AS7038RB和AS7038GB傳感器以及AS7030B傳感器模塊基于兩種常見的心率...

史海拾趣

問答坊 | AI 解惑

新技術使電容儲能增加一倍

根據美國亞特蘭大州佐治亞理工學院有機光電中心(Center for Organic Photonics and Electronics)的研究人員介紹,一種創新的封裝技術將使用具有高介電常數特性的鈦酸鋇(BaTiO3)納米級微粒子來制造電容器,該技術能使電容器儲存的能量提高一倍。 ...…

查看全部問答∨

弱問 wince怎么用directdraw,想把yuv的格式顯示出來

如題,就是有些不懂幫忙科普下,上網貌似搜不到什么…

查看全部問答∨

{轉載}51單片機 Keil C 延時程序的簡單研究

51單片機 Keil C 延時程序的簡單研究 by: InfiniteSpace Studio/isjfk, 1.21.2004 任何人都可以在注明原作者和出處的前提下隨意轉載這篇文章,但不得用于商業目的。   應用單片機的時候,經常會遇到需要短時間延時的情況。需要的延時時間很短 ...…

查看全部問答∨

386是否采用流水線設計?

一些介紹硬件的書上說486是第一個真正采用流水線設計的Intel X86處理器。包括新浪網上也是這樣說的 http://tech.sina.com.cn/h/2007-03-23/15421431097.shtml 但是我最近看——《16位、32位微機原理》中國科技大學出版(中科院考研指定用書)上說8 ...…

查看全部問答∨

100分求stc89c51 實驗板原理圖,不夠在加

請問哪位大俠有stc89c51 實驗板原理圖 我的郵箱 cr-gxw@tom.com 或 crgxw@tom.com 小弟萬分感謝!…

查看全部問答∨

1A鋰電充電IC(TP4056)--南京拓微

       TP4056 是一款完整的單節鋰離子電池采用恒定電流/恒定電壓線性充電器。其底部帶有散熱片的SOP8/MSOP8封裝與較少的外部元件數目使得TP4056成為便攜式應用的理想選擇。TP4056 可以適合USB電源和適配器電源工作 ...…

查看全部問答∨

傳說I+2+C=I2C

I2C的工程應用 本工程基于LM3S8962的I2C總線來模擬EEPROM(CAT24C02)傳輸協議的操作過程,系統簡單實用,可以移植到所有的LM3Sxxx系列的MCU上。 在PROGRAM中,采用INT的方式進行數據傳輸過程的處理和實現,工程的功能實現都是在中斷函數中進行的。 ...…

查看全部問答∨

談談你模電生涯的心酸歷程

在學生時代,讓人頭疼的課程系列之模擬電子,越想越糾結。尤其是我們這種還處于學生的硬件愛好者來說,其酸甜苦辣,我們的感觸自然深刻~~ 不知道那些已經在此領域有一定成就的大哥哥、大姐姐們,是如何練就那身本領的?望硬件界的精英們為我們這些 ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 韶山市| 象州县| 平泉县| 观塘区| 神池县| 河曲县| 钟山县| 陇西县| 潜江市| 阳原县| 德昌县| 柘城县| 无锡市| 疏勒县| 嵊州市| 成都市| 霸州市| 通江县| 鹤岗市| 合江县| 莫力| 邹城市| 石柱| 福州市| 延川县| 北宁市| 雷山县| 酉阳| 文水县| 肇州县| 衡阳县| 万盛区| 宜良县| 康乐县| 霸州市| 鹿泉市| 集贤县| 宁安市| 牙克石市| 鱼台县| 靖安县|