这是由TI公司推出的一款比较单片机, 相对stm32来说简单些, 因为它是16位的, 所以我们在学习中可能也会像51一样, 直接操纵寄存器.
TI设计这款单片机的初衷是, 让它用于低功耗的嵌入式设备中.
Reduced instruction set computing, or RISC (pronounced 'risk'), is aCPU design strategy based on the insight that a simplifiedinstruction set (as opposed to a complex set) provides higher performance when combined with amicroprocessor architecturecapable of executing those instructions using fewermicroprocessor cycles per instruction
以上是MSP430使用的精简混合指令集 wiki解释, 也是为了降低功率
MSP430也使用了集成模拟外设, 能够降低功耗,提高启动速度
单片机的自动运行与时钟系统分不开,始终系统通常需要满足4个条件:
1.高频率 用于快速响应
2.低频性 用于降低电流消耗
3. 稳定的频率 满足定时需求 如 RTC real-time clock
4.多时钟源 允许单片机在不同的频率下工作,可以同时使用外部晶振和内部振荡器,例如 DCO
MSP430内部有3个时钟, 用于应对不同系统最小化能量消耗
MCLK 主时钟
SMCLK副时钟
ACLK辅助时钟
The MSP430 features 3 clocks which can run at maximum of 16MHz depending upon the conditions. The reason we have three clocks instead of just one or even two is to compromise between systems that need speed and the ability to minimize power consumption, which is what the msp430 was designed for. These three clocks are:-
- MCLK: This stands for Master Clock, and is the one that drives the processor most of the time.
- 由DCO产生 ,也可由外部振荡器产生, 启动需要6us, 一般用于CPU 和高速外设
- SMCLK: The Sub-Main Clock is a secondary clock which is used by other peripherals particularly the internal peripherals.
- 外设选择时钟源的时候使用
- ACLK: The Auxiliary Clock is usually timed outside the MSP430 and is typically used for peripherals.
- 一般用于低俗外设,可以设置
开始一个工程的开头必然是配置时钟了
DCO是digital controled Oscillator, 数字晶振, 它没有外部竞争准确, 但是控制的范围已经很广了, 一定够用.
DCO可以控制时钟, 它由两个寄存器操作
Apart from a versatile clock system, we have 4 different sources to control these three clocks. We will have a look at them at the correct time, however for now one of is theDCO. It’s the digitally controlled oscillator which might not be as accurate or stable while compared to external crystals, but still is quite good and can operate over a wide range of frequencies.
Lets’ move onto the DCO. The advantage with the DCO is that it requires no external parts and can be fully controlled by the software. There are only two registers should be configured to change yourDCO frequency and that areDCOCTL and BCSCTL1.
这两句话用寄存器把DCO设置为1MHZ;
basic clock select controller
- BCSCTL1=CALBC1—1MHZ;
- DCOCTL=CALDCO—1MHZ;
复制代码设置MCLK
BCSCTL2 |= SELM——1+DIVM_3;
讲一讲引脚Pin的寄存器
每一个Pin都有几个寄存器
PxDIR 数据方向, 如果选择复用功能这个不用管
- P1DIR=0xff 将P1作为输出
- P1OUT=0x20 P1输出20
- P1DIR=0x00
- data=P1IN 读取输入值
复制代码PxIES 0为上升沿中段,1 为下降沿中断
PxREN 上拉下拉电阻使能寄存器
PxIn Px Out 输入输出的数据
PxSEL(2) 复用选择
PxIFG interrupt Flag register 中断标志位, 使用后需要清理
要想打开中断呢, 一般就是 _EINT();
关闭就是 _DINT();
- void main(void)
- { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
- P1DIR |= BIT0; // Set P1.0 to output direction
- P1IES |= BIT3; // P1.3 下降沿
- P1IFG &= ~BIT3; // P1.3 中断标志清除
- P1IE |= BIT3; // P1.3 中断使能
- _BIS_SR(LPM4_bits + GIE); // 进入低功耗模式,开启全局中断
- }
- // Port 1 interrupt service routine
- #pragma vector=PORT1_VECTOR
- __interrupt void Port_1(void) //中断服务程序
- {
- if (P1IFG & BIT3)
- {
- P1OUT ^= BIT0; // P1.0 led灯闪烁
- P1IFG &= ~BIT3; // P1.3 清除中断标志
- }
- }
复制代码再说说FLL+
frequency-locked loop (FLL+) clock
这个独特的模块就是 时钟了... 包含我前面说的几个
Timer
增计数模式下,
CCR0 代表周期 范围65535
TAR代表counter
- void zengjishu()
- {
- TACTL=TASSEL1+TACLR; //选择计数时钟为ACLK,将计数器TAR清零
- CCTL0=CCIE; //使能中断
- CCR0=200; //计数终值,方波频率为:32768/200/2
- TACTL|=MC_1; //选择Timer_A为增计数模式
- P1DIR|=BIT0; //P1.0作为输出
- _EINT(); //使能总中断
- }
- #pragma vertor =TIMERA0_VECTOR
- __interrupt void Timer_A(void)
- {
- P1OUT^=0X01; //P1.0取反
- }
复制代码capture compare
当CCTLx中的CAP=1时进入capture模式, 检测到设定的脉冲沿,TAxR会被写入TAxCCRx 并且CCIFG置位
CM1 CM0 可以选择捕获条件, 有 禁止 捕获 上升沿 下降沿 上升下降沿
但是中断请求 必须要 GIE CCIE都允许才可以
当CCTLx中的CAP=0时进入compare模式,
TAxR记数到TAxCCRn时 CCIFG置位 EQUx =1
??? EQUx根据输出模式影响输出
输入信号TAxCCI 被封锁到 SCCI中
Ø每个捕获/比较模块都包含一个输出单元,用于产生输出信号。
Ø
Ø每个输出单元有8种工作模式,可产生基于EQUx的多种信号。
Ø
Ø除模式0外,其他模式的输出都在定时器时钟上升沿时发生变化。
Ø
Ø输出模式2,3,6,7不适合输出单元0,因为EQUx=EQU0。
Ø
Ø输出单元在输出控制位OUTMODx的控制下,有8种输出模式输出信号。这些模式与TAxR、TACCTLx、TAxCCR0的值有关,如下表所示。
OUTMODx | 模式 | 说明 |
000 |
输出模式0:
输出
| 输出信号取决与寄存器 TACCTLx 中的 OUT位。当 OUT位更新时,输出信号立即更新。 |
001 |
输出模式1:
置位
| 输出信号在TAxR等于TAxCCRn时置位,并保持置位到定时器复位或选择另一种输出模式为止。 |
010 |
输出模式2:
翻转/复位
| 输出在TAxR的值等于TAxCCRn时翻转,当TAxR的值等于TAxCCR0时复位。 |
011 |
输出模式3:
置位/复位
| 输出在TAxR的值等于TAxCCRn时置位,当TAxR的值等于TAxCCR0时复位。 |
100 |
输出模式4:
翻转
| 输出电平在TAxR的值等于TAxCCRn时翻转,输出周期是定时器周期的2倍。 |
101 |
输出模式5:
复位
| 输出在TAxR的值等于TAxCCRn时复位,并保持低电平直到选择另一种输出模式。 |
110 |
输出模式6:
翻转/置位
| 输出电平在TAxR的值等于TAxCCRn时翻转,当TAxR值等于TAxCCR0时置位。 |
111 |
输出模式7:
复位/置位
| 输出电平在TAxR的值等于TAxCCRn时复位,当TAxR的值等于TAxCCR0时置位。 |
PWM实例
- void timerA1_init(){
- TA1CTL = TASSEL_2 + TACLR + MC_1; //SMCLK as clock, up mode
- TA1CCTL1 = OUTMOD_7; //Compare module 0 is set to Output Mode 7(PWM)
- TA1CCR0 = 200;
- TA1CCR1 = 100;
- }
- void PWM_update(float dew){
- uchar buffer;
- TA1CCR1 = (uchar)((dew+60)/75*180); // dew+15
- }
复制代码 串口设置一般步骤
1、选择串口模块(USCI_A0、USCI_B0)。
USCI_A0 :
P1SEL = BIT1 + BIT2;
P1SEL2 = BIT1 + BIT2; //设置IO口,P1.2为发送TXD,P1.1为接收RXD
2、在SWRST=1时,设置串口。
UCA0CTL=UCSWRST; // 复位USART,并设置串口
3、选择波特率发生器时钟。
UCA0TCTL1=UCSSEL1; //UCLK=MCLK
4、使能发送、接收。
ME2=UCA0TXE1+UCA0RXE1; //使能RXD TXD
5、设置字符长度。
UCA0CTL=CHAR; //设置字符长度为8位,默认时为7位
6、设置波特率。 注:UCA0BR=UCA0BR0+UCA0BR1; 其值应大于3
UCA0BR0=8; //存放波特率分频因子的整数部分的低字节
UCA0BR1=0; //存放波特率分频因子的整数部分的高字节
UCA0MCTL= UCBRS2 + UCBRS0; //设置波特率为115200
7、SWRST=0,串口设置完毕。
UCA0CTL&=~UCSWRST; //在SWRST为1之前设置串口
8、使能中断。
IE2=UCA0RXIE1; //使能接收 中断
SPI
- void Configure_SPI(){
- //--- Initialization of SPI Commuinication (USCI_B) -------------------------
- P1SEL |= BIT5 + BIT6 + BIT7; // P1.5 6 7
- P1SEL2 |= BIT5 + BIT6 + BIT7; // P1.5 6 7
- // IE2 |= UCB0TXIE;
- UCB0CTL0 |= UCCKPH + UCMSB+ UCMST+ UCMODE_0 + UCSYNC; // 3-pin, 8-bit SPI mstr, MSb 1st
- UCB0CTL1 |= UCSSEL_2; // SMCLK
- UCB0BR0 = 0x01;
- UCB0BR1 = 0;
- UCB0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
- }
•void TFT_SendData(uint8_t bdata)
•{
•// uint8_t mask;
• ST7735_NCS_CLR();
• ST7735_DC_SET();
• /* for(mask=0x80;mask;mask>>=1){ // IO 模拟SPI。
• ST7735_SCL_CLR();
• if(bdata&mask)ST7735_SDA_SET();
• else ST7735_SDA_CLR();
• ST7735_SCL_SET();
• }*/
• UCB0TXBUF = bdata;
• while((UCB0STAT & UCBUSY)==0x01);
• ST7735_NCS_SET();
•}
复制代码 ADC
1、 10位转换精度。
2、有多种时钟源可供选择,内带时钟发生器。
3、配有6个外部通道和2个内部通道。
4、内置参考电源,并且参考电压Vref有8种组合。
5、采样速度快,最快200Ks/s。
6、四种工作模式:
1、单通道单次转换模式: CONSEQ_0。
2、单通道多次转换模式: CONSEQ_2。
3、序列通道单次转换模式:CONSEQ_1 。
4、序列通道多次转换模式:CONSEQ_3。
- P1SEL&=0x20; //使能A/D通道A5;
-
- ADC10CTL0 = ADC10SHT_1+ ADC10ON+SREF_1+REF2_5V+REFON+MSC;
- // 打开ADC10内核,确定采样周期为8*ADC10OSC/2,选择内部参考电压为2.5v 选择时钟;
-
- ADC10CTL1 = INCH_5+ADC10DIV_1+CONSEQ_2;
- // input A5模拟信号输入选择通道A5即P1.5,设置为单通道多次转换模式,分频因子为2
-
- ADC10AE0 |= BIT5; // 使P1.5允许AD模拟输入信号
-
- ADC10CTL0|=ENC; //使能转换;
-
- ADC10CTL0|=ADC10SC; //开始转换;
复制代码 LowPowerMode
- "msp430g2553.h"
- #define LPM0 _BIS_SR(LPM0_bits) /* Enter Low Power Mode 0 */
- #define LPM0_EXIT _BIC_SR_IRQ(LPM0_bits) /* Exit Low Power Mode 0 */
- #define LPM1 _BIS_SR(LPM1_bits) /* Enter Low Power Mode 1 */
- #define LPM1_EXIT _BIC_SR_IRQ(LPM1_bits) /* Exit Low Power Mode 1 */
- #define LPM2 _BIS_SR(LPM2_bits) /* Enter Low Power Mode 2 */
- #define LPM2_EXIT _BIC_SR_IRQ(LPM2_bits) /* Exit Low Power Mode 2 */
- #define LPM3 _BIS_SR(LPM3_bits) /* Enter Low Power Mode 3 */
- #define LPM3_EXIT _BIC_SR_IRQ(LPM3_bits) /* Exit Low Power Mode 3 */
- #define LPM4 _BIS_SR(LPM4_bits) /* Enter Low Power Mode 4 */
- #define LPM4_EXIT _BIC_SR_IRQ(LPM4_bits) /* Exit Low Power Mode 4 */
复制代码
MSP430 具有一种运行模式及5 种可利用软件来选择的低功耗操作模式。一个中断事件能够将器件从任一低功耗
模式唤醒、处理请求、并在接收到来自中断程序的返回信号时恢复至低功耗模式。
以下6 种操作模式可利用软件来配置:
1、激活模式(AM)
– 所有时钟处于激活状态
2、低功耗模式0 (LPM0)
– CPU 被禁用
– ACLK 和SMCLK 仍然有效,MCLK 被禁用
3、低功耗模式1 (LPM1)
– CPU 被禁用
– ACLK 和SMCLK 仍然有效,MCLK 被禁用
– 如果DCO 不是在激活模式下被使用,则DCO 的dc 生成器被禁用
3、低功耗模式2 (LPM2)
– CPU 被禁用
– MCLK 和SMCLK 被禁用
– DCO 的dc 生成器保持启用
– ACLK 保持激活
4、低功耗模式3 (LPM3)
– CPU 被禁用
– MCLK 和SMCLK 被禁用
– DCO 的dc 生成器保持启用
– ACLK 保持激活
5、低功耗模式4 (LPM4)
– CPU 被禁用
– ACLK 被禁用
– MCLK 和SMCLK 被禁用
– DCO 的dc 生成器保持启用
– 晶体振荡器被停止
- void main(void)
- {
- WDT_init(); // initialize Watchdog Timer
- while(1)
- {
- __bis_SR_register(LPM3_bits + GIE); // Enter LPM3, enable interrupts
- activeMode(); // in active mode. Do stuff!
- }
- }
-
- #pragma vector=WDT_VECTOR
- __interrupt void watchdog_timer (void)
- {
- __bic_SR_register_on_exit(LPM3_bits); // Clear LPM3 bits from 0(SR), Leave LPM3, enter active mode
- }
复制代码