[MSP430]入门之中的一个 总体认识-程序员宅基地

技术标签: 嵌入式  

这是由TI公司推出的一款比較单片机, 相对stm32来说简单些, 由于它是16位的,  所以我们在学习中可能也会像51一样,  直接操纵寄存器.

TI设计这款单片机的初衷是, 让它用于低功耗的嵌入式设备中.

Reduced instruction set computing, or RISC (pronounced 'risk'), is aCPU design strategy based on the insight that a simplified instruction set (as opposed to a complex set) provides higher performance when combined with amicroprocessor architecture capable 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.
  •              一般用于低俗外设,能够设置

開始一个project的开头必定是配置时钟了

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**
  }
<div><div>•void TFT_SendData(uint8_t bdata)
</div><div>•{
</div><div>•//  uint8_t mask;
</div><div>•  ST7735_NCS_CLR();
</div><div>•  ST7735_DC_SET();
</div><div><span style="color:#BF0000;">•</span><span style="color:#BF0000;"> </span>/* for(mask=0x80;mask;mask>>=1){  // IO <span style="color:#BF0000;">模拟</span><span style="color:#BF0000;">SPI</span><span style="color:#BF0000;">。
</span></div><div><span style="color:#BF0000;">•</span><span style="color:#BF0000;">    </span>ST7735_SCL_CLR();
</div><div><span style="color:#BF0000;">•</span><span style="color:#BF0000;">    </span>if(bdata&mask)ST7735_SDA_SET();
</div><div><span style="color:#BF0000;">•</span><span style="color:#BF0000;">    </span>else ST7735_SDA_CLR();
</div><div><span style="color:#BF0000;">•</span><span style="color:#BF0000;">    </span>ST7735_SCL_SET();
</div><div><span style="color:#BF0000;">•</span><span style="color:#BF0000;">  </span>}*/
</div><div>• UCB0TXBUF = bdata;
</div><div>•  while((UCB0STAT & UCBUSY)==0x01);
</div><div>•    ST7735_NCS_SET();
</div><div>•}
</div></div> 

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
}






















版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34218890/article/details/85885223

智能推荐

攻防世界_难度8_happy_puzzle_攻防世界困难模式攻略图文-程序员宅基地

文章浏览阅读645次。这个肯定是末尾的IDAT了,因为IDAT必须要满了才会开始一下个IDAT,这个明显就是末尾的IDAT了。,对应下面的create_head()代码。,对应下面的create_tail()代码。不要考虑爆破,我已经试了一下,太多情况了。题目来源:UNCTF。_攻防世界困难模式攻略图文

达梦数据库的导出(备份)、导入_达梦数据库导入导出-程序员宅基地

文章浏览阅读2.9k次,点赞3次,收藏10次。偶尔会用到,记录、分享。1. 数据库导出1.1 切换到dmdba用户su - dmdba1.2 进入达梦数据库安装路径的bin目录,执行导库操作  导出语句:./dexp cwy_init/[email protected]:5236 file=cwy_init.dmp log=cwy_init_exp.log 注释:   cwy_init/init_123..._达梦数据库导入导出

js引入kindeditor富文本编辑器的使用_kindeditor.js-程序员宅基地

文章浏览阅读1.9k次。1. 在官网上下载KindEditor文件,可以删掉不需要要到的jsp,asp,asp.net和php文件夹。接着把文件夹放到项目文件目录下。2. 修改html文件,在页面引入js文件:<script type="text/javascript" src="./kindeditor/kindeditor-all.js"></script><script type="text/javascript" src="./kindeditor/lang/zh-CN.js"_kindeditor.js

STM32学习过程记录11——基于STM32G431CBU6硬件SPI+DMA的高效WS2812B控制方法-程序员宅基地

文章浏览阅读2.3k次,点赞6次,收藏14次。SPI的详情简介不必赘述。假设我们通过SPI发送0xAA,我们的数据线就会变为10101010,通过修改不同的内容,即可修改SPI中0和1的持续时间。比如0xF0即为前半周期为高电平,后半周期为低电平的状态。在SPI的通信模式中,CPHA配置会影响该实验,下图展示了不同采样位置的SPI时序图[1]。CPOL = 0,CPHA = 1:CLK空闲状态 = 低电平,数据在下降沿采样,并在上升沿移出CPOL = 0,CPHA = 0:CLK空闲状态 = 低电平,数据在上升沿采样,并在下降沿移出。_stm32g431cbu6

计算机网络-数据链路层_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏8次。数据链路层习题自测问题1.数据链路(即逻辑链路)与链路(即物理链路)有何区别?“电路接通了”与”数据链路接通了”的区别何在?2.数据链路层中的链路控制包括哪些功能?试讨论数据链路层做成可靠的链路层有哪些优点和缺点。3.网络适配器的作用是什么?网络适配器工作在哪一层?4.数据链路层的三个基本问题(帧定界、透明传输和差错检测)为什么都必须加以解决?5.如果在数据链路层不进行帧定界,会发生什么问题?6.PPP协议的主要特点是什么?为什么PPP不使用帧的编号?PPP适用于什么情况?为什么PPP协议不_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输

软件测试工程师移民加拿大_无证移民,未受过软件工程师的教育(第1部分)-程序员宅基地

文章浏览阅读587次。软件测试工程师移民加拿大 无证移民,未受过软件工程师的教育(第1部分) (Undocumented Immigrant With No Education to Software Engineer(Part 1))Before I start, I want you to please bear with me on the way I write, I have very little gen...

随便推点

Thinkpad X250 secure boot failed 启动失败问题解决_安装完系统提示secureboot failure-程序员宅基地

文章浏览阅读304次。Thinkpad X250笔记本电脑,装的是FreeBSD,进入BIOS修改虚拟化配置(其后可能是误设置了安全开机),保存退出后系统无法启动,显示:secure boot failed ,把自己惊出一身冷汗,因为这台笔记本刚好还没开始做备份.....根据错误提示,到bios里面去找相关配置,在Security里面找到了Secure Boot选项,发现果然被设置为Enabled,将其修改为Disabled ,再开机,终于正常启动了。_安装完系统提示secureboot failure

C++如何做字符串分割(5种方法)_c++ 字符串分割-程序员宅基地

文章浏览阅读10w+次,点赞93次,收藏352次。1、用strtok函数进行字符串分割原型: char *strtok(char *str, const char *delim);功能:分解字符串为一组字符串。参数说明:str为要分解的字符串,delim为分隔符字符串。返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。其它:strtok函数线程不安全,可以使用strtok_r替代。示例://借助strtok实现split#include <string.h>#include <stdio.h&_c++ 字符串分割

2013第四届蓝桥杯 C/C++本科A组 真题答案解析_2013年第四届c a组蓝桥杯省赛真题解答-程序员宅基地

文章浏览阅读2.3k次。1 .高斯日记 大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?高斯出生于:1777年4月30日。在高斯发现的一个重要定理的日记_2013年第四届c a组蓝桥杯省赛真题解答

基于供需算法优化的核极限学习机(KELM)分类算法-程序员宅基地

文章浏览阅读851次,点赞17次,收藏22次。摘要:本文利用供需算法对核极限学习机(KELM)进行优化,并用于分类。

metasploitable2渗透测试_metasploitable2怎么进入-程序员宅基地

文章浏览阅读1.1k次。一、系统弱密码登录1、在kali上执行命令行telnet 192.168.26.1292、Login和password都输入msfadmin3、登录成功,进入系统4、测试如下:二、MySQL弱密码登录:1、在kali上执行mysql –h 192.168.26.129 –u root2、登录成功,进入MySQL系统3、测试效果:三、PostgreSQL弱密码登录1、在Kali上执行psql -h 192.168.26.129 –U post..._metasploitable2怎么进入

Python学习之路:从入门到精通的指南_python人工智能开发从入门到精通pdf-程序员宅基地

文章浏览阅读257次。本文将为初学者提供Python学习的详细指南,从Python的历史、基础语法和数据类型到面向对象编程、模块和库的使用。通过本文,您将能够掌握Python编程的核心概念,为今后的编程学习和实践打下坚实基础。_python人工智能开发从入门到精通pdf