上点复位信号 :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默认的文件夹中,“”存在于自己的项目文件当中
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.确认有按键按下以后,需要进入确定具体为哪一个按键按下的过程,思路为:依次将行线置为低电平,并检测列线的输入,将行和列信号配合即可检测出按键按下的情况
上一篇:MSP430F169 Timer_A原理(一)----定时器的四个模式
下一篇:MSP430F149——定时器
推荐阅读最新更新时间:2024-11-17 01:04
设计资源 培训 开发板 精华推荐
- MQB宝来自动启停关闭器
- esp8266+pca9685的32路舵机扩展板
- 黄淮学院创客空间立创杯电子设计大赛-单高朝-1001906A
- 【航顺训练营】基于HK32F030M的智能门禁系统
- 【训练营】陪伴是最长情的告白
- CL320 的典型应用,3 通道 20mA 线性 LED 驱动器,降低 CL320 功耗:齐纳二极管
- LDK120PU08R 0.8V低压降稳压器典型应用(可调版)电路
- MIKROE-3060, MCP2518FD Click Board 基于 MCP2518FD CAN FD 控制器,带 SPI 接口
- LTC3630MPDHC 5V 至 65V 输入至 5V 输出、高效率、500mA 稳压器的典型应用电路
- sw6208