/* MSP430的I/O口的驱动能力*/
每个I/O口最大输出或者吸收电流为6mA
所有I/O电流总和不超过48mA
// 晶振频率: 8.000200Mhz
/*MSP430的3V与5V逻辑兼容性问题*/
MSP430单片机的任何一个引脚输入电压不能超过VCC+0.3V,不能低于-0.3V,否则将启动内部泄放电路.泄放电路最大只能吸收2mA电流,超过2mA可能会损坏I/O口.
/* 发光二极管压降*/
红色的压降为2.0--2.2V
黄色的压降为1.8―2.0V
绿色的压降为3.0―3.2V。
正常发光时的额定电流均为20mA。
白色发光二极管的正向电压降约为3.5V左右,需要正向工作电流≥15mA左右时,才能使其正常发光。
/* 位操作*/
P2OUT |= BIT0; //P2.0置高
P2OUT &= ~BIT1; //P2.1置低
P2OUT ^= BIT2; //P2.2取反
MSP430可以定义代码段变量
/*----------------------------------------*/
/* -------------C430变量类型--------------*/
变量类型 字节数
char 1
unsigned char 1
int 2
unsigned int 2
long 4
unsigned long 4
long long 8
unsigned long long 8
float 4
double 4或者8 General Option 选型设置浮点指针长度
/*IO口*/
PxIES IO口中断触发掩选择 0=上升沿 1=下降沿
PxSEL IO口第二功能选择
PxOUT 复位初始值保持不变
退出中断时必须清除I/O口中断标志 PxIFG=0;
如果I/O口PxDIR设置为输入,那么I/O口的电平为低电平(0V)
/*系统时钟输出引脚*/
P5.4/MCLK //主系统时钟输出
P5.5/SMCLK //子系统时钟输出
P5.6/ACLK //辅助时钟输出
/*开总中断函数, 关总中断函数, 空操作函数*/
_EINT();
_DINT();
_NOP();
/* MSP-PRGS430烧录时"熔丝已烧断"的解决步骤*/
1.拔下430片子(或430片子所在的硬件电路板),重新上电,再烧,可能就好了.
2.提高MSP-PRGS430烧录时的电压再烧录,一次提高0.1伏,直到不能提高为止(F1121可提高到3.6伏)
3.用手紧紧按在430电源所在管脚附近,再烧录.(此法纯粹属于经验,无理论依据,但在我的电路中用于解决烧录问题相当灵验)
/*定时器*/
看门狗定时器: 看门狗模式 间隔定时器模式
例:设置看门狗工作在定时器模式,16ms中断一次
WDTCTL = WDT_ADLY_16; //设置内部看门狗工作在定时器模式,16ms中断一次
IE1 |= WDTIE; //使能看门狗中断
_EINT(); //打开全局中断
#pragma vector = WDT_VECTOR //看门狗中断服务程序
__interrupt void watchdog_timer(void)
{
}
/* --------------Timer_A------------ */
应用: 产生高分辨率且精确的周期性时基 精确定时 精确计时计数 产生PWM波形 产生脉冲 产生可变频率方波 测量脉宽 测量周期与频率
功能特点:
四种操作模式的16位计时/计数器
可选择和可配置的时钟源
计数模块:
TAR -- 计数数值模块
TASSELx -- 选择时钟源, IDx: 时钟源分频
MCx -- 计数模式选择
00=停止计时
01=增计数(从0计数到TACCR0, 共计数TACCR0+1次)
10=连续计数(从0计数到0FFFFh) 可以用来产生定时时间间隔,输出频率
11=增减计数(0->TACCRO->0)
TACTL |= TASSEL_x + MC_x + ID_x; //时钟源选择, 计数模式选择, 时钟源分频
捕获/比较模块:
CAP=1时,选择捕获模块. 捕获输入CCIxA CCIxB
CMx位,捕获边沿选择, 上升沿, 下降沿, 上升下降沿
捕获出现后: 当前复制TAR -->TACCRx, 置位CCIFG中断标志位
捕获模式输入引脚: CCI0A -- P1.1 CCI1A -- P1.2 CCI2A -- P1.3 CCI0B -- P2.2
CAP=0时,选择比较模式,用于产生PWM波, 产生间隔定时
当TAR == TACCRx时: CCIFG置位, EQUx=1, 产生输出波形,
比较模式输出引脚: P1.1/TA0 -- OUT0 P1.5/TA0 -- OUT0 P2.7/TA0 -- OUT0
P1.2/TA1 -- OUT1 P1.6/TA1 -- OUT1 P2.4/CA0/TA1 -- OUT1
P1.3/TA2 -- OUT2 P1.7/TA2 -- OUT2 P2.4/CA1/TA2 -- OUT2
输出单元:
中断:
TIMERA0_VECTOR: TACCR0中断向量 -- TACCR0.CCIFG
: TAIV中断向量 -- TACCR1.CCIFG TACCR2.CCIFG TAIFG(主计数器满)
/* TA3IV Definitions */
#define TAIV_TACCR1 (0x0002) /* TACCR1_CCIFG */
#define TAIV_TACCR2 (0x0004) /* TACCR2_CCIFG */
#define TAIV_TAIFG (0x000A) /* TAIFG */
产生中断: 对应CCIE置位, GIE被置位
TACCTLx |= CCIE; //允许捕获/比较模块x的中断
CCRx 计数器x的计数值
/*串口*/
串口通信引脚
P3.4/UTXD0
P3.5/URXD0
P3.6/UTXD1
P3.7/URXD1
/*-----------比较器A---------------*/
两个模拟量输入端CA0 CA1, 模拟比较器, 参考电压发生器, 输出滤波器
比较两个输入电压CA0和CA1的大小关系,然后设置输出信号CAOUT的值.如果CA0>CA1,则CAOUT=1;否则CAOUT=0.
四种参考电压: 0.5Vcc 0.25Vcc 三极管阈值电压 外部参考源
配置例程:
CACTL1 = CARSEL + CAREF0 +CAON; // 0.25Vcc连接到比较器的负端
CACTL2 = P2CA0; // 外部引脚信号连接到比较器的正端
比较器输入输出端口:
P2.2/CAOUT/TA0 通用数字I/O引脚;定时器A捕获CCIOB输入;比较器输出
P2.3/CA0/TA1 通用数字I/O引脚;定时器A比较OUT1输出; 比较器A输入
P2.4/CA1/TA2 通用数字I/O引脚;定时器A比较OUT2输出; 比较器A输入
/*--------------------------------------*/
/*--------------片内ADC12---------------*/
注意: 内部参考源可能不准确, 得测量. 用电源电压作为基准,我的板子电压电压3.3134sV,分辨率0.8mv
基准电压设置应该在ADC12CTL0 |= ENC之前.
功能模块:
带采样/保存功能的ADC内核
可控制的转换存储
可控制的参考电平发生器
可控制和选择的时钟源
可控制的采样及转换时序电路
特点: 200ksps转换速率,
12位0000h -- 0FFFh
Nadc = 4095 * (Vin - Vr-)/(Vr+ - Vr-);
2.5V基准电压, 分辨率为0.6mV
参考电压发生器:
REFON: REFON=1 开启参考电压发生器
REF2_5V: REF2_5V=1, 参考电压2.5V; REF2_5V=0, 参考电压1.5V
转换与存储:
16组-- ADC12MEMx ADC12MCTLx
SREFx 定义参考电压
INCHx 选择输入通道
EOS 定义序列采样的结束(使用序列模式)
CSTARTADDx 定义起始ADC12MCTLx(单通道和序列通道都使用)
转换模式:
CONSEQx 00=单通道单次转换 01=序列通道单次转换
10=单通道多次转换 11=序列通道多次转换
MSC 多重快速转换
中断:
ADC12IE 中断允许寄存器
ADC12IFG 中断标志寄存器
ADC12V 中断向量寄存器
ADC12IFGx 当转换结果被写入ADC12MEMx后,该位被置位
(ADC12IEx 和 GIE被置位, 才产生中断)
寄存器:
ACD12CTL0:
SHT1x SHT0x -- 采样保持需要的ADC12CLK的周期数
MSC -- 多重快速转换
ENC -- 允许转换
ADC12SC -- 软件开启转换, 触发源模式00
ADC12CTL1:
CSTARTADDx -- 定义起始ADC12MCTLx(单通道和序列通道都使用)
SHSx -- 触发源选择
SHP -- 采样保持模式选择
SHP=1,触发采样模式
ADC12SSELx -- 时钟源选择
CONSEQx -- 转换模式选择
00=单通道单次转换 01=序列通道单次转换
10=单通道多次转换 11=序列通道多次转换
ADC12MCTLx:
EOS -- 定义序列采样的结束(使用序列模式)
SREFx -- 参考电压选择
000 VR+ = AVCC and VR- = AVSS
001 VR+ = VREF+ and VR- = AVSS
010 VR+ = VeREF+ and VR- = AVSS
011 VR+ = VeREF+ and VR- = AVSS
100 VR+ = AVCC and VR- = VREF-/ VeREF-
101 VR+ = VREF+ and VR- = VREF-/ VeREF-
110 VR+ = VeREF+ and VR- = VREF-/ VeREF-
111 VR+ = VeREF+ and VR- = VREF-/ VeREF-
INCHx -- 采样通道选择
//ADC12配置实例
ADC12CTL0 |= SHT0_2 + ADC12ON; //设置采样保持时间, 开启ADC12内核
ADC12CTL1 |= ADC12SSEL_0 + SHP + CSTARTADD_0; //时钟源选择内部振荡器, 采样触发模式, 转换起始地址为ADC12MCTL0
ADC12MCTL0 |= SREF_0 + INCH_0; //使用基准源VR+ = AVCC(3.3135V) VR- = 0, 使用第0输入通道,P6.0
P6SEL |= BIT0; //开启P6.0的AD采集功能
P6DIR &= ~BIT0; //设置P6.0为输入
ADC12CTL0 |= ENC + ADC12SC; //转换开始
ADC12IE |= 0x01; //允许中断
_EINT(); //开启全局中断
// 从ADC12MEM0中读取结果
/*---------片内DAC12---------*/
特点: 12位,电压输出, 能够配置为8bit或者12bit, 能够和DMA结合使用, 内部参考源选择, 支持自校准
DAC12AMPx>0时,DAC12直接选择输出引脚,不管P6SELx和P6DIRx位.
DAC12SREFx选择参考电压, 内部参考源, 外部参考源.使用内部参考源必须配置ADC12模块的参考源.
ADC12CTL0 = REF2_5V + REFON; // Internal 2.5V ref on
DAC12LSELx位选择输出电压更新的触发源
DAC12CALON位启动DAC12输出运放偏压自动校正功能
DAC12IFG位, DAC12中断标志位, 必须软件手工清除, 与DMA的DMAIFG共用中断源, 使用时开启DAC12IE和GIE位.
/*-------液晶12864学习----------*/
128*64=8192
可以显示8*4个(16*16点阵汉字)
2M ROM提供8192个汉字(16*16点阵)
16K ROM(CGROM)提供128个字符(16*8点阵)
指令暂存器(IR)
数据暂存器(DR)
地址寄存器(AC)
忙标志(BF): BF=1表示模块正在进行内部操作,此时模块不接受外部指令和数据.
------------------------------------------------
RS,R/W 的配合选择决定控制界面的 4 种模式:
RS R/W 功能说明
L L MPU 写指令到指令暂存器(IR)
L H 读出忙标致(BF)及地址计数器(AC)的状态
H L MPU 写入数据到数据暂存器(DR)
H H MPU 从数据暂存器(DR)中读出数据
H H MPU 从数据暂存器(DR)中读出数据
-------------------------------------------------
字型产生 ROM(CGROM)
字型产生 ROM(CGROM)提供 8192 个此触发器是用于模块屏幕显示开和关
的控制.DFF=1 为开显示,DFF 的状态是指令 DISPLAY ON/OFF和 RST 信号控
制的。
显示数据 RAM(DDRAM)
最多控制4行16字(64字)的中文字
------------------------------------------------
DDRAM 地址表
列 1 列 2 列 3 列 4 列5 列6 列 7 列 8
行 1 80H 81H 82H 83H 84H 85H 86H 87H
行 2 90H 91H 92H 93H 94H 95H 96H 97H
行 3 88H 89H 8BH 8BH 8CH 8DH 8EH 8FH
行 4 98H 99H 9AH 9BH 9CH 9DH 9EH 9FH
-----------------------------------------------
字型产生RAM(CGRAM)
/************************************************************
* Interrupt Vectors (offset from 0xFFE0)
************************************************************/
#define DACDMA_VECTOR (0 * 2u) /* 0xFFE0 DAC/DMA */
#define PORT2_VECTOR (1 * 2u) /* 0xFFE2 Port 2 */
#define USART1TX_VECTOR (2 * 2u) /* 0xFFE4 USART 1 Transmit */
#define USART1RX_VECTOR (3 * 2u) /* 0xFFE6 USART 1 Receive */
#define PORT1_VECTOR (4 * 2u) /* 0xFFE8 Port 1 */
#define TIMERA1_VECTOR (5 * 2u) /* 0xFFEA Timer A CC1-2, TA */
#define TIMERA0_VECTOR (6 * 2u) /* 0xFFEC Timer A CC0 */
#define ADC12_VECTOR (7 * 2u) /* 0xFFEE ADC */
#define USART0TX_VECTOR (8 * 2u) /* 0xFFF0 USART 0 Transmit */
#define USART0RX_VECTOR (9 * 2u) /* 0xFFF2 USART 0 Receive */
#define WDT_VECTOR (10 * 2u) /* 0xFFF4 Watchdog Timer */
#define COMPARATORA_VECTOR (11 * 2u) /* 0xFFF6 Comparator A */
#define TIMERB1_VECTOR (12 * 2u) /* 0xFFF8 Timer B CC1-6, TB */
#define TIMERB0_VECTOR (13 * 2u) /* 0xFFFA Timer B CC0 */
#define NMI_VECTOR (14 * 2u) /* 0xFFFC Non-maskable */
#define RESET_VECTOR (15 * 2u) /* 0xFFFE Reset [Highest Priority] */
#define UART1TX_VECTOR USART1TX_VECTOR
#define UART1RX_VECTOR USART1RX_VECTOR
#define UART0TX_VECTOR USART0TX_VECTOR
#define UART0RX_VECTOR USART0RX_VECTOR
#define ADC_VECTOR ADC12_VECTOR
/*---------------Flash读写-------------------*/
MSP430存储空间分为三个区
最低端的是数据区: 寄存器与数据变量, 堆栈等, 属于RAM;
最高端的是主Flash存储器: 存放程序代码;
中间有个Flash区, 叫做信息Flash(InfoFlash), 用于掉电后保存少量数据
在Flash中, 段(Segment), 每次能够擦除的最小区块单位叫做段;
块(Block), 每次能够连续写入的最大区块单位叫做块;
程序存储段每段512字节
信息存储器每段128字节
Flash存储器可以按照字和字节写入,但是不能按照字和字节来擦除,只能整段擦除.
字/字节编程 和块编程两种
const标识符使变量在编译时分配在Flash中.