今天晚上開始學習MSP430G2系列的單片機,這是一個低功耗的16位單片機,仍是比較有意思的。先看了一下手冊,基本的架構,感受挺無聊的,就直接上手老師介紹的那本書開始學習了。編程
第一天架構
第一章主要講的是口袋實驗版的硬件結構,學到了一些有趣的知識。好比說,以前覺得在對運放供電的時候,雙電源供電方式中的負電源很好實現。其實否則,這裏面仍是有很大的學問的。下面就是產生負電源的一種方式,電荷泵原理:eclipse
原理比較易懂,如今就來介紹下,當$Q_1$和$Q_3$ MOS管打開的時候,電源$V_1$給電容$C$充電,1 3與2 4開關的狀態一定是相反的,所以當$Q_2,Q_4$打開的時候電容$C$給電容$C_F$充電,致使電容的極板是下正上負,因此輸出的電源就是負電源了。(負電源的資料明天看老師給的資料)學習
咱們用的這個型號的板子封裝是20引腳的,感受和51的沒啥優點啊~還好,在拓展板上提供了I2C芯片拓展了IO口的數量,總體來講,採用的是TAC6416A芯片,一共有16個引腳(芯片手冊還沒看。。)。板子用了四個輸入(鍵盤),和個做爲輸出口用於控制 8個LED,4個做爲輸出口用於控制LCD驅動器。spa
ADC和DAC以及濾波器功放之後學的時候再詳說吧。code
而後就開始了CCS編程,這個CCS。。。怎麼說呢,速度確實很慢,畢竟是基於eclipse開發的,可是界面仍是十分滿意的。(不喜歡的能夠使用IAR for MSP 430,很不錯)工程怎麼建的就很少說了,玩過51的都會。。。而後,就開始很坑的找錯階段,我按照書上的代碼寫了下面一段程序:
blog
#include <MSP430G2553.h> /* * main.c */ void Blink_LED(); int main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer P1DIR = BIT6; while(1) { Blink_LED(); } } void Blink_LED() { _delay_cycles(1000000); P1OUT^ = BIT6; }
乍一看,沒有啥錯誤,可是一Debug,出現下面的結果:ip
找了半天,沒發現錯誤,換一種方式照樣能夠是LED燈閃爍,可是這到底是錯在哪了呢?緣由是我寫代碼的習慣,在賦值的時候不自覺的喜歡多打一個空格使代碼看上去更整潔,錯誤就在這,取反符號「^」後面不能有空格,刪了以後就沒有錯誤了。=-=開發
最後,看一下這個代碼的含義,其實很簡單,看下declaration就知道了。很簡單P1OUT就是個1通道的IO口,8位的特殊功能寄存器。io
SFR_8BIT(P1OUT); /* Port 1 Output */
怎麼肯定各個通道的狀態呢?看下宏定義,很簡單,十六位嘛,一次定義各個管腳爲1就好了。(和微機外接8053相似)
#define BIT0 (0x0001) #define BIT1 (0x0002) #define BIT2 (0x0004) #define BIT3 (0x0008) #define BIT4 (0x0010) #define BIT5 (0x0020) #define BIT6 (0x0040) #define BIT7 (0x0080) #define BIT8 (0x0100) #define BIT9 (0x0200) #define BITA (0x0400) #define BITB (0x0800) #define BITC (0x1000) #define BITD (0x2000) #define BITE (0x4000) #define BITF (0x8000)