Quantcast
Channel: MSP 低功耗微控制器论坛 - 最近的话题
Viewing all 3634 articles
Browse latest View live

MSP430fr8972电压波动引起复位

$
0
0

芯片:MSP430FR6972

问题描述:

用MSP430驱动一个电磁铁翻转器件,会出现电压波动特别大(见下图),会导致单片机复位发生,该如何解决这问题呢?网上查资料说设置PMM 模块的SVSL值,但是我在6972手册里没找到设置这个的说明呀!

相关程序:

//要驱动电磁铁时先把G1关闭(用这开关就是怕驱动电磁铁导致复位),然后打开全桥电路开关,动作后再关闭,再打开G1(就是打开这个开关后产生的复位)

void Turn_Bowl_Set(void)

 P4OUT |= BIT2;
 
 P2OUT &= ~BIT1; 
 P3OUT |= BIT7;
 DelayMs(50);
 P2OUT |= BIT1; 
 P3OUT &= ~BIT7; 
 P4OUT &= ~BIT2; 
}

相关原理图:


MSP430FR5994 采样率能到多少?

$
0
0

各位大哥好:

    有个问题想请教:MSP430FR5994数控时钟DCO最大频率为24MHZ,选为SMLCK时钟源,AD采样时钟选择SMLCK,全为1分频,采样需要4个AD12LCK,转换需要14或者15个AD12lck,也就是采样一个点需要20个AD周期,采样频率应该可以到1M以上了,我这样理解对吗?

   手册上说转换频率最大200KSPS,(200-ksps maximum conversion rate at maximum resolution of 12 bits),这是为什么呢?

  新人求教,感激不尽。

CCS8.2.0 GRACE在哪里啊???

使用msp-430f5529lp开发板编译rtos例程不工作

$
0
0

如题,不用rtos的都可以运行。用ccs6和ccs8编译rtos的例程下载下去后,开发板没有任何反应。求教什么原因?

而且运行界面暂停按钮是没法点的。

编译下载没有错误。

MSP430F449

$
0
0

1、我们在售后的时候发现有使用MSP430F449芯片的部分产品,单片机系统电源为3.0V,在应用过程中会出现有些程序FLASH乱掉的问题,造成设备无法启动。。有的FLASH区全部变为FF,有的中断向量区数据变化但非FF,整区数据情况未知

2、还有些单片机死机的情况,单片机死机后只有重新上电才能复位,RST都无法复位

3、电源是24V电源和电池两个电源,24V转5V然后和电池利用二极管接入HT7330

MSP430无法进入低功耗LPM3

$
0
0

本人正在做基于MSP430的低功耗项目,配合CC1101无线模块。CC1101通过IO口模拟跟CPU连接。为了降低功耗,通过无线模块接收到数据,触发CPU的外部中断来唤醒CPU

现在遇到的问题是,通过IAR调试查看寄存器状态看到 CPUOFF=1,SCG0=1,SCG1=1, OscOFF=0,手册上说前三者为1的时候即使LPM3模式,但是实际测得系统在休眠状态的电流15mA,判断并未真正进入低功耗,反而发现当数据发送完毕刹那检测到系统电流是1mA,不知道问题出在哪里。附上程序:

 

main()

{

   INT8U i, Dataleng = 7;       // 8字节

   unsigned char chksum;   //CRC校验和

           

   WDTCTL = WDTPW + WDTHOLD; //禁止看门狗

   InitSys();

   halSpiInit();

   InitTimeA();

   _EINT();                //打开总中断

   P3OUT |=(BIT4+BIT5+BIT6+BIT7);

   ReadClientAddress();     //确定下位机地址编码

   TestBuf[0]=ClientAddress;

   RF1100_IO_set();         //CC1101初始化

   SysTmie = 0;

   while(SysTmie < 10);

   POWER_UP_RESET_CC1100();

   SysTmie = 0;

   while(SysTmie < 50);

   halRfWriteRfSettings();

   halSpiWriteBurstReg(CCxxx0_PATABLE, PaTabel, 8);

  setRxMode();

   while(1)

   { SysTmie = 0;

     switch(DeviceStep)

     {     

       case 0:    {        //步骤0,数据接收

         if(halRfReceivePacket(RxBuf,&Dataleng)) {      //判断是否接收到数据

           DeviceStep = 1;}

        break; }

       case 1: {      //步骤1,数据校验

         if(RxBuf[2]==ClientAddress){        // 判断指令地址和药框号是否匹配 

             GreenLedTwinkle(2);

             DeviceStep = 2; }                 //指令地址和药框号匹配,顺序进入下个步骤

         else  {

             DeviceStep = 0;}

         break; }

       

       case 2:   {  //步骤2,数据处理,闪灯

           for(i=0;i<7;i++)  {      

           TxBuf[i] = RxBuf[i];  }   //填充数据

         if(RxBuf[5]==0xC0||RxBuf[5]==0xC8)

         {  GreenLedTwinkle(16); }    //需要保留

         if(RxBuf[5]==0x40||RxBuf[5]==0x48)

         {

           RedLedTwinkle(16);  }   //需要保留

         DeviceStep = 3;

         break; }

       case 3:   {  //步骤3,数据回传

         Delay_1ms(5);//延迟

         halRfSendPacket(TxBuf,7);

         DeviceStep = 4;

         setRxMode();

         CC1101_InitWOR(2200);

         break;  }

       case 4:   { //步骤4,进入低功耗模式

         P2SEL &=~ BIT5; //选择P2.5口  // GDO2(P2.5) 配置P2.5口接收中断来唤醒MCU

         P2DIR &=~ BIT5; //配置P2.5口为输入

         P2IES |= BIT5; //下降沿触发

         P2IE |= BIT5;   //P2.5中断使能

         P2IFG &= ~BIT5; //中断标志位清零

         GreenLedTwinkle(16);   //进入低功耗模式前绿灯闪烁提示

         _BIS_SR(LPM3_bits + GIE);   //MCU进入LPM3低功耗模式

         DeviceStep = 0;

         break;   }

     }

     while(SysTmie < 15);

   }

}

//===============================GDO0中断唤醒MCU=============================//

#pragma vector = PORT2_VECTOR

__interrupt void GDO_2()

{

if(P2IFG&BIT5)   {              //如果P2.5口触发中断

_DINT(); // 关闭中断响应

LPM3_EXIT;

DeviceStep = 0;  

}

P2IFG &= ~BIT5; //清除P2.5引脚中断标志位

SysTmie = 0;

_EINT();

}

void InitTimeA(void)   // Timer_A初始化

{

CCR0 = 500; // 需要延时的时间 CCR0为TACCR0

TACTL |= TASSEL_2 + ID_3 + TAIE; // Timer_A的时钟源为SMCLK,8分频(对于定时器的设置还有待考虑 2015-03-22 21:44)

TACTL |= MC_1; // Timer_A定时模式选择UP,定时器从0递增到TACCR0的值后触发中断,然后重新从0递增

}

#pragma vector=TIMERA1_VECTOR   // 定时器A中断处理函数

__interrupt void Intimer_A(void)

{

TACTL &= ~BIT0; // 清除中断标志位

SysTmie++;

}

MSP430F2274-EP jtag

$
0
0

新做的板子,jtag借口 用MSP-FET430UIF烧写器进行程序烧写,出现如下错误,麻烦ti工程师看下是什么问题

MSP430: Error connecting to the target: The Debug Interface to the device has been secured

求MSP430V16.9编译器下载

$
0
0

导入工程时报错:
  Error: Import failed for project 'UIBOARD_TEST' because its compiler definition is not available. Please install the MSP430v16.9 compiler before importing this project - click 'View > CCS App Center' to check if compiler updates are available, or install the compiler manually and register it with CCS through 'Preferences > CCS > Build > Compilers'.


超声波气体计量

$
0
0

请问MSP430FR6043什么时候正式发布?

MSP430FR6043的EVM板在哪里可以申请?

MSP430FR6043目前在气体计量上性能怎么样?

MSP430F169怎么定位死机位置

$
0
0

现在程序死机像是随机的,有时候跑半个小时死机,有时候能跑几个小时,随机性的死机,排查了一遍能导致死机的问题都没能解决,我就想做一个看门狗中断,能否获取哪个堆栈指针之类的,定位到是哪个位置导致看门狗溢出的???求助!

定时器中断的退出为何DA输出还是不对的?

$
0
0

串口接收参数后通过定时器控制DA输出波形,脉冲产生都是正常的,关闭的时候是这样:

串口收到h后关闭定时器,将DA输出为1.25V

实际结果是收到h后DA输出定时器的第二个中断里的值,不是DA的设置值:DAC_H_AL=0000,收到h后输出的是0000而不是串口里的DAC12_0DAT = 0x800;

烦请各位大佬帮我看看怎么修改,谢谢

定时器初始化:

void TAstart(void)//高频使用的定时器TA
{
TACTL = TASSEL_2 + MC_1 + TAIE + ID_3; //默认的smclk为8m,3分频后1m,一个tick为1us
TACCTL1 |= CCIE;
TA0CCR1 = H_WH; //计时到脉冲持续时间结束,case ccr1 输出正脉冲
TACCTL0 |= CCIE;
TA0CCR0 = H_WH + H_WL; //周期时间=正脉宽+负脉宽,ccro对应 TIMERA0_VECTOR

}

定时器中断:

#pragma vector = TIMERA0_VECTOR //ccr0的周期定时时间到
__interrupt void Timer_A0(void)
{
DAC12_0DAT = DAC_H_AH;
}
#pragma vector = TIMERA1_VECTOR
__interrupt void Timer_A1(void)
{
switch(TAIV) //需要判断第几个定时中断
{
case 2: DAC12_0DAT = DAC_H_AL;break;
default: break;
}
}

串口接收中断回调里的停止标记:

case 'h': //高频停止输出

TA0CCR0 = 0;                  //这里试过很多关定时器的方法都是一样的结果
TACTL = MC_0; //停止模式
TACTL &= ~(TAIE + TAIFG);


DAC12_0DAT = 0x800; //输出1.25V

Print_Str("TA H DAC0 STOP!\r\n");
break;

 

MSP430G2230 SBW烧录失败

$
0
0

1. 使用设备:

1)烧写器: MSP-FET430 UIF;

2)MCU: MSP430G2230

3)De-bug程序: CCS8.3.0

2. 连接方式:

 1)所有连接均用跳线完成;

 2)C2/C3未使用;

 3)使用烧写器给MCU供电。

3. 问题:

 在CCS界面按下F11进入de-bug模式,出现下图所示错误

 1)通过其他硬件平台,已确认烧写器是可以正常工作的;

 2)通过示波器抓取TCK/TDO两路信号,可以看到在configuring debugger 这一步中这两路上是有信号通过的。

请问该如何解决上述问题?

新手求助:CapTouch在CapTIvateDesignCenter中调试后,如何将更新后的代码重新载入Ccstudio中?

$
0
0

我使用的是MSP-CAPT-FR2633开发板,

按照官网的视频教程一步步做:

在CapTIvateDesignCenter中建立项目做好基本的配置后生成代码,然后利用CCS调试后下载到开发板;

然后再在CapTIvateDesignCenter中做实时调试,再更新源代码;

接下来就不知道怎么做了,如何把更新的源代码再载入到CCS中呢?

当前CCS中的代码是CapTIvateDesignCenter调试前的代码,试过删掉原来的project再重新导入,发现是灰色的无法导入了。

各位大神请帮帮忙,谢谢!

MSP430FR5994 相关数字带通滤波器代码样例

$
0
0

请教TI工程师:

     我正在使用MSP430FR5994单片机,需要对采样后的ADC数据进行数字带通滤波,请问有相关的软件代码样例吗?  谢谢~~  着急咨询

【求助】MSP430G2553疑似丢失固件

$
0
0

最近用G2553做一个小项目,串口通信,调试运行了几次后串口失效,复位也没用,重新上电后依旧没反应,重新下载程序后恢复正常,有没有遇到过这种情况的??求助!!


关于MSP430F169的使用

$
0
0

我用MSP430的DAC输出一个锯齿波电压,然后用ADC进行单通道多次采样,可是这两部分进行初始化的时候都会对ADC12CTL0进行设置,会不会互有影响,下面是部分程序。

#include <msp430x16x.h>
#include "Config.h" //开发板配置头文件,主要配置IO端口信息
#include <stdio.h>

uint TEMP=0; //ADC值暂存变量
uchar count=0;

//***********************************************************************
// DAC初始化
//***********************************************************************

void DAC12_Init(void)
{
DAC12_0CTL |= DAC12CALON; //启动校验DAC
while((DAC12_0CTL & DAC12CALON) != 0){_NOP();}//等待校验完成

ADC12CTL0 = REFON + REF2_5V; // 参考电压为内部2.5v
DAC12_0CTL = DAC12AMP_5 + DAC12IR + DAC12LSEL_0;//控制寄存器设置,自动更新数据,内基准为满量程
DAC12_0CTL |= DAC12SREF_0;
DAC12_0CTL |= DAC12ENC; // 启动DAC模块(DAC12LSEL_0时此句可以省,这里设置为1)
DAC12_0DAT = 0x0000; //DAC初值为0,更新这个寄存器就可以更改DAC输出数据
}

//*************************************************************************
// ADC初始化程序,用于配置ADC相关寄存器
//*************************************************************************
void ADC_Init()
{
P6SEL|=0x01; //选择ADC通道
ADC12CTL0|= ADC12ON+ MSC + SHT0_2 + REF2_5V + REFON; //ADC电源控制开,16个CLK,内部基准2.5V
ADC12CTL1|= SHP + CONSEQ_2 + ADC12SSEL1 + ADC12SSEL0; //SMCLK做时钟源
ADC12MCTL0= SREF0 + INCH_0; //参考控制位及通道选择,这里选择通道0
ADC12IE|= 0x01; //中断允许
ADC12CTL0|= ENC; //使能转换器
}

//*************************************************************************
// ADC中断服务程序
//*************************************************************************
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR(void)
{uchar buf[10];
uchar j;
uint result[10];

result[count]=ADC12MEM0; //读取ADC转换值,存入暂存区
count++;
while(count>10)
{
count=0;
for(j=0;j<10;j++)
{
TEMP+=result[j]; //求和,10次转换的结果相加
}
TEMP=TEMP/10; //求平均值
//读取ADC转换值

sprintf((char*)buf,"%d\r\n",TEMP);
Print_Str(buf);

}
}

//*************************************************************************
// 主程序
//*************************************************************************

void main(void)
{ uchar buf[10];
uint i;
WDT_Init(); //看门狗初始化
Clock_Init(); //时钟初始化
Port_Init(); //端口初始化,用于控制IO口输入或输出

ADC_Init(); 
DAC12_Init(); //初始化DAC12 //初始化ADC配置

_EINT(); //使能中断

ADC12CTL0 |= ADC12SC; //开启转换
while(1)

for(i=300;i<1930;i=i+5) //连续转换,输出电压从小到大

// P5OUT &= ~BIT4; //DAC片选信号置低

DAC12_0DAT = i; //数据写入寄存器,写入激活DAC转换

delay_ms(5);//验证是否是阶梯型




}

【求助】各位大侠有没有msp430AFE253的AD24的例程,直接测试可用的那种

$
0
0

各位大侠有没有msp430AFE253的AD24的例程,直接测试可用的那种,能贴一个给我不,学习一下,先谢过

msp430F413 请问喂狗语句

$
0
0
 你好,关于喂狗语句 ,问题如下,谢谢!
1、  MCU是msp430F413,使用外部晶振32K,看门狗定时器设为1S一次,请问喂狗语句是这句:WDT_ARST_1000,是吗?
      部分程序如下:
  WDTCTL = WDT_ADLY_1000;  //   // WDT 1 s, ACLK, interval timer
  __bis_SR_register(LPM3_bits + GIE);       // Enter LPM3 w/interrupt
  while(1)
  {
     WDT_ARST_1000;   /* 1000ms  " */
  }
2、WDT 定时设置与对应喂狗语句,是不是这样?
  (定时设置)                      (喂狗语句)
 WDT_ADLY_1000    :   WDT_ARST_1000
 WDT_ADLY_250   :    WDT_ARST_250
 WDT_ADLY_16    :    WDT_ARST_16
 WDT_ADLY_1_9  :    WDT_ARST_1_9

msp430fr6047 老版本uss lib如何获取

$
0
0

最近网站更新了msp430fr6047的uss lib库到2.20.00.15,在测试中发现存在一些问题,如何能获取上一版本2..10.00.07的版本以及EVM对应的USS 1.71.02.02版本?

MSP430F5529 UART接受数据弄不出来。。

$
0
0

弄了一天了,实在弄不出来,代码是各种合起来的。早上弄出来可以发送所接收到内容的UART程序,可是后来不管怎么发,都没有回应。当然这个是在试探,最终目的是通过uart发送指令给小车,让其转弯。请大家帮帮忙看看,不胜感激!代码如下

【这是main.c】

#include <msp430f5529.h>
#include "clk.h"
#include "pwm.h"
#include "pwm_servo.h"
#include "uart.h"

void main(void) {

WDTCTL = WDTPW+WDTHOLD; //关看门狗

P2SEL |= BIT2;
P2DIR |= BIT2;//测量SMCLK用

XT2_Init(); //时钟初始化
PWM_Init(); //PWM初始化
PWM_servo_Init();//舵机电机PMW初始化
TA0_PWM_setpermill(800);//稳定输出轮子电机的PWM
USCI_A0_Init();
__enable_interrupt(); //使能单片机中断
while(1);
}


#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
switch(UCA0RXBUF)
{
case '1':
TA2_PWM_servo_setpermill(300);break;//左转
case '2':
TA2_PWM_servo_setpermill(750);break;//回正
case '3':
TA2_PWM_servo_setpermill(1200);break;//右转

}
}

[这是CLK.h]

#ifndef CLK_XT2_H_
#define CLK_XT2_H_

void XT2_Init();

#endif /* CLK_XT2_H_ */

void XT2_Init()
{
P5SEL |= BIT2|BIT3; //将IO配置为XT2功能
UCSCTL6 &= ~XT2OFF; //使能XT2

UCSCTL4 = UCSCTL4&(~(SELA_7))|SELA_1; //先将ACLK配置为VLOCLK
UCSCTL3 |= SELREF_2; //将REFCLK配置为REFCLK

while (SFRIFG1 & OFIFG){
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); // 清除三类时钟标志位
// 这里需要清除三种标志位,因为任何一种
// 标志位都会将OFIFG置位
SFRIFG1 &= ~OFIFG; // 清除时钟错误标志位
}
UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_5|SELM_5; //将SMCLK和MCLK时钟源配置为XT2
}

[uart.c]

#include <msp430f5529.h>
#include "uart.h"

/***********************************
* USCI串口初始化
* 输入:P3.4-Rx
* 输出:P3.3-Tx
**********************************/
void USCI_A0_Init()
{
P3SEL |= BIT3+BIT4; // P3.3和P3.4选择UART通信功能
UCA0CTL1 |= UCSWRST; // 复位寄存器设置
UCA0CTL0 = 0x00;
UCA0CTL1 |= UCSSEL_2; // SMCLK,为系统时钟4MHz
UCA0BR0 = 34; // 4MHz 115200
UCA0BR1 = 0; // 4MHz 115200
UCA0MCTL |= UCBRS_6 + UCBRF_0; // 调制器设置
UCA0CTL1 &= ~UCSWRST; // 完成USCI_A0初始化设置
//UCA0IE |= UCTXIE;
UCA0IE |= UCRXIE;
_bis_SR_register(LPM0_bits + GIE);//进低功耗状态
}

/***************************/
void USCI_A0_PutChar(char Chr)
{
UCA0TXBUF = Chr;
while (!(UCA0IFG&UCTXIFG)); //等待上一个字节发送完毕
}
/****************************
* 字符串发送函数
* 输入:s-字符串
***************************/
void USCI_A0_PutString(unsigned char *s)
{
while(*s !='\0')
{
USCI_A0_PutChar(*s++);
}
}
/***************************
* 向PC发送字符
* 输入:数据
**************************/
void USCI_A0_To_PC(unsigned int Chr)
{
USCI_A0_PutChar(Chr/1000+'0');
USCI_A0_PutChar(Chr%1000/100+'0');
USCI_A0_PutChar(Chr%100/10+'0');
USCI_A0_PutChar(Chr%10+'0');
USCI_A0_PutString("\n");
}

[uart.h]

/*
* uart.h
*
* Created on: 2018年11月26日
* Author: LENOVO
*/

#ifndef UART_H_
#define UART_H_
/***************************/
void USCI_A0_Init(void);
void USCI_A0_PutChar(char Chr);
void USCI_A0_PutString(unsigned char *s);
void USCI_A0_To_PC(unsigned int Chr);
void USCIA0_receivechar(void);

#endif /* UART_H_ */

[pwm_servo.c]

/*
* pwm_servo.c
*
* Created on: 2019年1月24日
* Author: Dadaist
*/
#include "pwm_servo.h"

/***********************************
* PWM_servo初始化
**********************************/
void PWM_servo_Init()
{
P2DIR |= BIT4;
P2SEL |= BIT4; //将P2.4引脚配置为比较输出(TA2.1)
//初始化定时器
TA2CTL |= TASSEL_2 + TACLR+ID_3;
TA2CCTL1 = OUTMOD_7;
TA2CTL |=MC_1;
TA2CCR0 =10000 ;/*Period*///Change me
TA2CCR1 =5000 ;/*Duty*///Change me
}

/***********************************
* 设置PWM_servo占空比
* 输入:(0~10000)
**********************************/
void TA2_PWM_servo_setpermill(unsigned int dty)//设置占空比
{
unsigned long int pcnt=dty;
if(pcnt>10000) pcnt=10000;
TA2CCR1=pcnt*TA2CCR0/10000;

[pwm_servo.h]

/*
* pwm_servo.h
*
* Created on: 2019年1月25日
* Author: Dadaist
*/
#include <msp430f5529.h>
#ifndef PWM_SERVO_H_
#define PWM_SERVO_H_

void PWM_servo_Init();
void TA2_PWM_servo_setperiod(unsigned long period);
void TA2_PWM_servo_setpermill(unsigned int dty);

#endif /* PWM_SERVO_H_ */

[pwm.c]

/*
* pwm.c
*
* Created on: 2018年11月26日
* Author: LENOVO
*/
#include "pwm.h"

/***********************************
* PWM初始化
**********************************/
void PWM_Init()
{
P2DIR |= BIT0;
P2SEL |= BIT0; //将P2.0引脚配置为比较输出(TA1.1)
//初始化定时器
TA1CTL |= TASSEL_2 + TACLR+ID_0;
TA1CCTL1 = OUTMOD_7;
TA1CTL |=MC_1;
TA1CCR0 =1000 ;/*Period*///Change me
TA1CCR1 =500 /*Duty*/; //Change me
}

/***********************************
* 设置PWM占空比
* 输入:(0~1000)
**********************************/
void TA0_PWM_setpermill(unsigned int duty)//设置占空比
{
unsigned long int precent=duty;
if(precent>1000) precent=1000;
TA1CCR1=precent*TA1CCR0/1000;
}

[pwm.h]

/*
* pwm.h
*
* Created on: 2018年11月26日
* Author: LENOVO
*/
#include <msp430f5529.h>

#ifndef PWM_H_
#define PWM_H_

void PWM_Init();
void TA0_PWM_setperiod(unsigned long period);
void TA0_PWM_setpermill(unsigned int duty);


#endif /* PWM_H_ */

Viewing all 3634 articles
Browse latest View live