今天晚上开始学习MSP430G2系列的单片机,这是一个低功耗的16位单片机,还是比较有意思的。先看了一下手册,基本的架构,感觉挺无聊的,就直接上手老师介绍的那本书开始学习了。
第一天
第一章主要讲的是口袋实验版的硬件结构,学到了一些有趣的知识。比如说,之前以为在对运放供电的时候,双电源供电方式中的负电源很好实现。其实不然,这里面还是有很大的学问的。下面就是产生负电源的一种方式,电荷泵原理:
原理比较易懂,现在就来介绍下,当$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驱动器。
ADC和DAC以及滤波器功放以后学的时候再详说吧。
然后就开始了CCS编程,这个CCS。。。怎么说呢,速度确实很慢,毕竟是基于eclipse开发的,但是界面还是十分满意的。(不喜欢的可以使用IAR for MSP 430,很不错)工程怎么建的就不多说了,玩过51的都会。。。然后,就开始很坑的找错阶段,我按照书上的代码写了下面一段程序:
#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,出现下面的结果:
找了半天,没发现错误,换一种方式照样可以是LED灯闪烁,但是这究竟是错在哪了呢?原因是我写代码的习惯,在赋值的时候不自觉的喜欢多打一个空格使代码看上去更整洁,错误就在这,取反符号“^”后面不能有空格,删了之后就没有错误了。=-=
最后,看一下这个代码的含义,其实很简单,看下declaration就知道了。很简单P1OUT就是个1通道的IO口,8位的特殊功能寄存器。
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)