MSP430单片机个人学习笔记

发布者:mb5362443最新更新时间:2022-10-08 来源: csdn关键字:MSP430  单片机  学习笔记 手机看文章 扫描二维码
随时随地手机看文章

上点复位信号 :POR(Power On Reset)

上电清除信号 :PUC (Power Up Clear)


CPU产生条件:


POR产生时

启动看门狗时,看门狗定时器计满。

看门狗写入错误安全参数值

片内Falsh写入错误的安全参数

POR与PUC都会引发复位


复位后初始状态:


/RST引脚被设置为复位模式

所有I/O引脚被设置为输入

外围模块被初始化

状态寄存器SR复位

看门狗激活,进入工作模式

程序计数器PC装入0xFFFEH处的地址,从此地址开始执行程序。

内部RC振荡器

系统复位后内部RC振荡器磨人为系统时钟,但精度比较差,不适合使用诸如串口通信场合波特率会随温度和电压变化而变化,不建议使用(约800KH)


低功耗设计原则


电压宜低就不高

系统宜静就不动

时钟宜慢就不快

低功耗设计


延时程序用定时中断实现

采用键盘扫描方式时,扫描程序可以纳入外部中断服务

尽量减少CPU抗干扰中的冗余指令及软件陷阱

看门狗与电呀侦测功能应尽量取消

用中断代服务替查询

尽量减少CPU的运算量

IO间隙运行

低功耗模式配置方法

IAR软件操作


专门的低功耗操作语句

BIS_SR(LPM3_bits+GIE);//进入

_BIC_SR_IRQ(LPM#_bits);//退出

IAR基础设置(Other勾选)

在这里插入图片描述
在这里插入图片描述

软件仿真

在这里插入图片描述

链接硬件

在这里插入图片描述
<>表示头文件在IAR默认的文件夹中,“”存在于自己的项目文件当中

<>表示头文件在IAR默认的文件夹中,“”存在于自己的项目文件当中


MSP430开发板灯光闪烁代码


#include


#define uchar unsigned char         //定义数据类型


#define CPU_F ((double)32768)    //内部延时函数所需要的时钟频率大小,单位为Hz

#define delay_ma(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) //ms级延时函数

#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) //us级延时函数


#define LED8PORT P2OUT          //P2口接入8个LED灯

#define LED8SEL  P2SEL

#define LED8DIR  P2DIR


//********************************************************************

//                  MSP430单片机内部看门狗初始化函数

//********************************************************************

void WDT_Init()

{

  WDTCTL = WDTPW + WDTHOLD;    //关闭内部看门狗

}


//********************************************************************

//                  端口初始化函数

//********************************************************************

void Port_Init()

{

  LED8SEL = 0x00;      //设置P2口为普通IO口模式

  LED8DIR = 0xFF;      //设置P2口输出模式

  LED8PORT = 0xFF;     //P2口初始值输出为0xFF

}


//********************************************************************

//                  时钟配置函数,初始化配置为内DC0

//********************************************************************

void Clock_Init_DCO()

{

  DCOCTL = DCO0 +DCO1 + DCO2;   //DCO选择最大频率

  BCSCTL1 |= XT2OFF;            //关闭XT2 

  BCSCTL1 = RSEL0 + RSEL1 + RSEL2;  //最大时钟频率,大概5MHz

  

}


//********************************************************************

//                  时钟配置函数,初始化配置为外部高频晶振

//********************************************************************

void Clock_Init()

{

  uchar i;

  BCSCTL1 &= ~XT2OFF;       //打开XT2晶振,XT20FF写0

  BCSCTL2 |= SELM1+SELS;    //MCLK=SMCLK=XT2,8MHZ


  do{

    IFG1 &=~OFIFG;         //清除OFIFG标志位

    for(i=0;i<100;i++)

      _NOP();

  }

  while((IFG1 & OFIFG)!=0);  //等待晶振稳定

  IFG1 &=~OFIFG;             //清除标志位

}



//********************************************************************

//                  主函数

//********************************************************************

void main(void)

{

   WDT_Init();   //看门狗初始化函数

   

   Clock_Init();   //系统时钟初始化配置函数

   Port_Init();    //端口初始化函数,用于控制与LED灯链接的IO口初始化

   

   while(1)

   {

     LED8PORT = 0x00;      //LED灯点亮

     delay_ms(500);        //延时500ms

     LED8PORT = 0xFF;      //LED灯关闭

     delay_ms(500);        //延时500ms 

   }

}


低功耗模式运行小灯


#include


#define uchar unsigned char         //定义数据类型

#define uint unsigned int    //定义数据类型


#define CPU_F ((double)32768)    //内部延时函数所需要的时钟频率大小,单位为Hz

#define delay_ma(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) //ms级延时函数

#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) //us级延时函数


#define LED8PORT P2OUT          //P2口接入8个LED灯

#define LED8SEL  P2SEL

#define LED8DIR  P2DIR 


uint i;


//*********************************************************

//                      主函数

//*********************************************************

void main(void)

{

  BCSCTL1 |= DIVA_2;     //设置ACLK时钟,四分频

  WDTCTL = WDT_ADLY_1000;   //看门狗定时器工作在内部定时器模式,定时时间为1000ms

  IE1 |= WDTIE;         //使能看门狗中断

  

  LED8DIR = 0xFF;

  LED8PORT = 0xFF;    //先关闭全部LED灯

  

  while(1)

  {

    _BIS_SR(LPM3_bits + GIE);   //进入LPM3低功耗模式,并开启全局中断

    LED8PORT = 0x00;            //点亮LED灯

    for(i=5000;i>0;i--);

    LED8PORT = 0xFF;            //关闭LED灯

    for(i=5000;i>0;i--);

    

  }

  

}

//*********************************************************

//               看门狗定时器中断服务程序

//*********************************************************

#pragma vector = WDT_VECTOR

__interrupt void Watchdog_Timer(void)

{

  _BIC_SR_IRQ(LPM3_bits);   //退出低功耗模式

}


通过段码表控制数码管

数码管段位表

#include

#include "Config.h"


//MSP430IO口初始化

void Port_Init()

{

  LED8SEL = 0x00;          //设置IO口为普通I/O模式。

  LED8DIR = 0xFF;          //设置IO口方向为输出

  LED8PORT = 0xFF;         //P2口初始设置为FF

  

  DATASEL = 0x00;          //设置IO口味普通I/O模式

  DATADIR = 0xFF;          //设置IO口方向为输出

  DATAPORT = 0xFF;         //P2口初始化为FF

  

  CTRSEL = 0x00;           //设置IO口为普通I/O模式

  CTRDIR = BIT3 + BIT4;    //设置IO口方向为输出,控制口在P63,P64

  CTRPORT = 0xFF;          //P6口初始化设置为FF

}

//74HC573控制数码管动态扫描并显示数据

void Display(uchar show_num)

{

  uchar j;

  

  j=0x01;                  //用来控制位选

  DCTR1;                   //控制数码管段数据的74HC573的LE管脚配置

  WCTR1;                   //控制数码管位的74HC573的LE管脚置高

  DATAPORT = ~j;           //设置要显示的位,也就是哪个数码管亮

  WCTR0;                   //锁存位数据,下面送上段数据以后,就显示出来了

  DATAPORT = table[show_num]; //要显示的数据,就是段数据,如显示0送的就是0x3f

  DCTR0;                   //锁存段数据,数码管亮一个时间片刻

  delay_ms(1);             //显示一个时间片刻,会影响亮度和闪烁性

  

}


//主程序


void main(void)

{

  uchar k;

  WDT_Init();               //看门狗初始化

  Clock_Init();             //时钟初始化

  Port_Init();              //端口初始化,用于控制IO口输入或输出

  while(1)

  {

    for(k=0;k<10;k++)

    {

      Display(k);            //调用显示函数,依次显示1~7

      delay_ms(500);

    }

  }

}


按键反转法对应关系

我们给P1赋值0x0f,即00001111,假设0键按下了,则这时P1口的实际值为00001110

我们给P1在赋值0xf0,即11110000,如果0键按下了,则这时P1口的实际值为11100000、我们把两次P1口的实际值想加得11101110,即为0xee

在这里插入图片描述

逐行扫描法

1.首先置4行全部为低电平,4列全部设置了上拉电阻(高电平),按键未按下时,为高电平,此时如果有按键按下,那么对应的该键所在的列的电平将会被拉低

2.确认有按键按下以后,需要进入确定具体为哪一个按键按下的过程,思路为:依次将行线置为低电平,并检测列线的输入,将行和列信号配合即可检测出按键按下的情况


关键字:MSP430  单片机  学习笔记 引用地址:MSP430单片机个人学习笔记

上一篇:MSP430F169 Timer_A原理(一)----定时器的四个模式
下一篇:MSP430F149——定时器

推荐阅读最新更新时间:2024-11-17 01:04

基于MC9S12D64单片机的直流无刷电机控制系统设计
由于无刷直流电动机既具备交流电动机的结构简单、运行可靠、维护方便等系列优点,又具有结构简单、体积小、重量轻、效率高、启动扭矩大、惯量小和响应快等其他种类直流电机无法比拟的优点,故广泛应用于宇航、军事、石油装备及工业和民用领域。这里给出了基于飞思卡尔MC9S12D64单片机的无刷直流电动机控制系统设计方案。 1 无刷直流电动机控制原理 无刷直流电动机系统由电动机、转子位置传感器、电子开关线路和驱动电路等4部分组成。其工作原理图如图1所示。 直流电源通过驱动和开关电路向电动机的定子绕组供电,提供励磁电流,位置传感器随时检测到转子位置,并根据转子的位置信号控制开关管的导通和截止,从而实现电子换向。随着电动机转子永磁体的转
[单片机]
基于MC9S12D64<font color='red'>单片机</font>的直流无刷电机控制系统设计
联电推出40奈米SST嵌入式闪存制程 东芝的MCU将采用
联华电子今宣布,该公司推出40奈米结合Silicon Storage Technology(SST)嵌入式SuperFlash非挥发性内存的制程平台。 新推出的40nm奈米SST嵌入式快闪记忆,较量产的55奈米单元尺寸减少20%以上,并使整体内存面积缩小了20-30%。 东芝电子组件&存储产品公司已开始评估其微处理器(MCU)芯片于联电40奈米SST技术平台的适用性。 东芝电子组件&存储产品公司混合信号芯片部门副总松井俊也表示:「我们期待采用联电40奈米SST技术有助于提升我们MCU产品的性能。 与联电合作,透过稳定的制造供应及配合我们的生产需求提供灵活的产能,亦将使我们能够保持强劲的业务连续性计划 (BCP)。 」 已有超过20
[半导体设计/制造]
NI Multisim下如何进行SPICE模型和8051 MCU的协同仿真
Multisim是基于SPICE的电路仿真软件,SPICE(Simulation Program with Intergrated Circuit Emphasis)是“侧重于集成电路的模拟程序”的简称,在1975年由加利福尼亚大学伯克莱分校开发。在Multisim9中,需要另安装MultiMCU进行单片机仿真。NI(National Instruments) Multisim10 将MuitiMCU称为MCU Module,不需要单独安装,可以与Multisim中的SPICE模型电路协同仿真,支持Intel/Atmel的8051/8052 和 Microchip的 PIC16F84a,典型的外设有RAM和ROM,键盘,图形和文字
[单片机]
NI Multisim下如何进行SPICE模型和8051 <font color='red'>MCU</font>的协同仿真
基于FRAM的MCU为低功耗应用提高安全性
  安全性在包括智能手机配件、智能仪表、个人健康监控、遥控以及存取系统等各种应用中正在变得日益重要。要保护收益及客户隐私,OEM 厂商必须采用安全技术加强系统的防黑客攻击能力。对于大量这些应用而言,将要部署数百万的器件,工程师面临的挑战是在不严重影响系统成本或可靠性的同时,确保最佳安全平衡。主要注意事项包括保护敏感数据的传输,防止 MCU 应用代码及安全数据被读取,防止 MCU 遭到物理攻击,最大限度提高电源效率,以及支持安全升级,确保设备能够应对未来安全威胁等。   安全设备必须能够像银行保险库一样有效地安全存储敏感信息。这类信息包括交换的实际数据(比如客户的信用卡号或者何时用了多少电的记录等)以及任何确保通信通道安全的加密数据
[单片机]
基于FRAM的<font color='red'>MCU</font>为低功耗应用提高安全性
基于8098单片机的脉冲测量仪的研制
1测量原理   8098单片机具有性能十分优良的高速输入输出通道,HSO0~HSO5为高速输出通道,能产 生输出宽度与周期均可调的脉冲波(PWM)。HSI0~HSI3为高速输入通道,CPU通过它们可 以同时接受来自外部的4个脉冲信号,并且随时记录脉冲信号中的高、低电平出现的时间, 非常适用于对脉冲参数的检测。   以高速输入通道HSI为例,HSI部件有自己的中断功能,当控制寄存器IOC1,7=1时,F IFO存储区装满事件后发出中断请求,如果IOC1,7=0,则保持寄存器在装入事件后发 出中断请求,两种原因引起的中断请求可通过查询状态寄存器IOS1而鉴别:如果FIFO 存储区满时,IOS1,6=1,反之,IOS1,6=0;如果保持
[单片机]
基于8098<font color='red'>单片机</font>的脉冲测量仪的研制
51单片机的键盘检测原理
一、独立键盘检测 1、按键的检测原理 单片机的I/O口既可以作为输出也可以作为输入使用,检测按键时用的是输入功能。把按键的一端接地,另一端与单片机的某个I/O口相连,开始时先给该I/O口赋一个高电平,然后让单片机不断地检测该I/O口是否变成了低电平,当按键闭合时,相当于该I/O口通过按键与地相连,变成低电平,程序一旦检测到I/O口变为低电平就说明按键被按下,然后执行相应的指令。 2、实验板原理图 独立按键S2,S3,S4,S5分别连接单片机的P3^4,5,6,7。 3、去抖动操作 由于使用的是弹性小按键,就是一个机械触点的器件。在按下时会有微观上的机械抖动,反应到电平就是高,低,高,低,抖动的长短与机械特性有关,一般在5~
[单片机]
51<font color='red'>单片机</font>的键盘检测原理
51单片机-代码对比
1.延时函数退出舞台 有了上一讲的理论讲解,代码的实现就比较简单了,实验现象就是高6位的6盏灯不停流水,我们用K4按键控制LED2的亮灭,并且途中并没有影响到6盏流水灯的运行。 我们知道以前流水灯是需要延时才能看得到流水现象的,那么现在再用延时函数的话,按键就没有意义了。比如流水灯的跳变需要间隔50ms才看得出是一个灯一个灯的亮,如果在死循环里使用“delay_ms(50);”,那么不支持连按代码里的times要加1都需要过了50ms才行,这样显然行不通,我们只能从流水灯的代码去思考了。 其实一次死循环里不一定就要求灯实现跳变,可以等到过了很多次死循环再去执行灯的跳变的,所以我们在死循环里让变量x每次加1,死循环了300
[单片机]
8位、16位、32位MCU技术特点及其发展轨迹
8位MCU:处在主流的地位 自20世纪70年代初面世以来,8位微控制器(MCU)已成为电子行业广为应用的器件。目前,8位MCU仍然处在主流的地位,占据全球MCU市场近一半的销售额。 主打优势: 低成本、技术的特性化和应用的专用化。 应用市场:( 小)家电、电子玩具和一些低端汽车电子产品等。同时由于中国已经成为了空调、电冰箱、洗衣机为代表的白色家电和彩色电视、家庭剧院、组合音响等黑色家电的生产基地,未来几年中国白色家电以及黑色家电用品也将是8位MCU大有作为的地方。 发展趋势 :8位 MCU一方面在价格上继续挤压4位 MCU的市场空间; 另一方面通过改善性能:1、加入越来越多的模拟电路2、同时提升内核的主频,3、将8位MCU
[焦点新闻]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved