现在电机头有个蓝牙芯片,管体里面为msp430主控电机,之间通过串口连接。用以实现电机的蓝牙控制。
现在想做无线升级,构想是通过蓝牙的无线升级功能,蓝牙芯片读取msp430的升级包,通过串口,实现对msp430FR2433的程序升级。
以下需要支持,谢谢!
1、msp430FR2433串口升级功能的实现,是否有串口升级的DEMO程序。
2、串口升级对msp430芯片的程序空间大小要求,目前使用的为msp430fr2433,共15k,电机控制程序已使用10K。
现在电机头有个蓝牙芯片,管体里面为msp430主控电机,之间通过串口连接。用以实现电机的蓝牙控制。
现在想做无线升级,构想是通过蓝牙的无线升级功能,蓝牙芯片读取msp430的升级包,通过串口,实现对msp430FR2433的程序升级。
以下需要支持,谢谢!
1、msp430FR2433串口升级功能的实现,是否有串口升级的DEMO程序。
2、串口升级对msp430芯片的程序空间大小要求,目前使用的为msp430fr2433,共15k,电机控制程序已使用10K。
您好,我想将存在430中的数据从10进制转换成二进制放入数组中,我用的下面这个函数在c语言的编辑器中可以使用,但是在ccs里我查看参数不论怎么数组都是0.我还另外定义了一个式子e=n+i;结果也是0,不知道是什么原因
我现在正在用MSP430FR5043做一个项目,需要用到BSL功能。在TI官方文档中提到了BSL必需运行在8MHz的主频率以下,但是我在板子上调试的结果是如果芯片一直运行再8MHz频率以内,包括8MHz,那么BSL毫无问题。但是如果芯片先运行在16MHz的频率,然后在BSL之前降低到8MHz以内,那么BSL就会失败,表现为在发送default password的时候显示:[ACK_ERROR_MESSAGE]Unknown ACK value!
请问如何解决这个问题?谢谢
int main()
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
//初始化看门狗
WDTCTL = WDT_ARST_1000; // Set Watchdog Timer timeout 1s
while(1)
{
//喂狗
WDTCTL = WDTPW | WDTCNTCL;
}
}
您好,我想利用msp430f5529的flash存储数据,一共有3000个4位的16进制数据,但是我从0x1800地址开始load memory,好像存储空间不够,只能存储大概200个左右数据,但是我看5529flah应该可以存储的,我应该怎么设置才能存进这些数据
参考
https://dev.ti.com/tirex/explore/node?node=AIsx3essEcHIyKbkidrtgQ__IOGqZri__LATEST
重复序列采样A0 - A3
但是传感器的电压信号是持续不断的,这样就会一直触发ADC的采样中断,无法进行正常程序。
我想每个10s进行一次采样,其他时间正常使用板卡进行其他操作。
请问有什么方法不进行中断就可以adc采样或者可以采样完成后跳出中断,进行完其他程序再进行中断
您好!
我在使用MSP430自带的BSL进行升级时遇到了固件传输问题。430从机进入BSL后的rx_password写入正常,id读取正常,固件大小约6kB。从下载地址0xC000开始传输到0xC0f0时一切传输正常,但在地址0xc0f4时,出现IIC通信超时,且之后一直无法正常通信。使用示波器捕获波形后发现SDA电平一直为低,只有MSP430断电重启后才能恢复。
我尝试过:
(1)将IIC通信频率从200k一直降低到1k,;
(2)将每包固件从200bytes减少到4bytes.
(3)在每次IIC写入后添加10~1000ms的延时。
以上方法均未能解决此问题,且当我以每包4btes固件传输时,通信总是在地址0xcof4这一包出现失败。
请问通过IIC使用BSL对430进行升级还有什么必须注意的地方吗?这个问题可以提供一些解决方法吗?谢谢!
您好,我在使用timer_A计时器输出一个数组m[10],每次中断输出a[k] (k从0到9),我想当k=10时,关闭中断,重新从内存中读取新的数值赋给数组a,不清楚如何关闭定时器a的中断,并在数组重置赋值后打开
void TIMEB_init( void )
{
//P4.7 为时钟输入,P4.0为上下沿捕捉
TB0CTL = TBSSEL_0 + ID_0 + TBCLR ; //TB0CLK输入,不分频,自动清0和分频参数
TB0CCTL0 = CM_3 | CAP | CCIE | CNTL_0 | CCIS_0 ;
//上下沿捕捉,捕捉模式,有中断, 16位模式,P4.0输入,必须是异步捕捉
//P4.0 :1K频率的方波输入
P4DIR &= ( ~BIT0 ); // P4.0 input
P4SEL |= BIT0 ; // P4.0 配为TB0.0输入
/ /P4.7 : 156K的信号计数输入
P4DIR &= ( ~BIT7 ); // P4.0 input
P4SEL |= BIT7 ; // P4.7 配为 TB0CLK 输入
TB0CTL |= MC_2 ; //增计数模式,到65535
TB0R = 0 ; //初始化计数值
}
//TIMERB 口中断服务程序,U8_1Q中断程序
#pragma vector = TIMER0_B0_VECTOR
__interrupt void timer_b0_isr(void)
{
if( TB0CCTL0 & CCI ){ //捕捉到高电平 数据
Counter_156K = TB0CCR0 ; //保存数据
}else{ //捕捉到低电平
TB0CTL |= TBCLR ; //计数器清0
}
TB0CCTL0 &= (~CCIFG) ; //清中断标志
}
程序目的:捕捉的信号是P4.0,上下沿都捕捉,并且产生中断信号,当捕捉到P4.0的上升沿时,把此刻的P4.7输入的方波信号的计数值保存起来
结论: 有时保存的计数值会不正确,大部分是正确的。
请问什么情况下,会不正确。
我把中断程序修改成下面的程序时,计数就正确了,没发现计数错误。
//TIMERB 口中断服务程序,U8_1Q中断程序
#pragma vector = TIMER0_B0_VECTOR
__interrupt void timer_b0_isr(void)
{
if( TB0CCTL0 & CCI ){ //捕捉到高电平 数据
Counter_156K = TB0R ; //保存数据,采用了计数寄存器,而不是捕捉寄存器
}else{ //捕捉到低电平
TB0CTL |= TBCLR ; //计数器清0
}
TB0CCTL0 &= (~CCIFG) ; //清中断标志
}
请问:我修改后的中断程序,这样来捕捉计数值,可以吗?会有什么问题,谢谢
程序目的:捕捉的信号是P4.0,上下沿都捕捉,并且产生中断信号,当捕捉到P4.0的上升沿时,把此刻的P4.7输入的方波信号的计数值保存起来
void TIMEB_init( void )
{
//P4.7 为时钟输入,P4.0为上下沿捕捉
TB0CTL = TBSSEL_0 + ID_0 + TBCLR ; //TB0CLK输入,不分频,自动清0和分频参数
TB0CCTL0 = CM_3 | CAP | CCIE | CNTL_0 | CCIS_0 ;
//上下沿捕捉,捕捉模式,有中断, 16位模式,P4.0输入,必须是异步捕捉
//P4.0 :1K频率的方波输入
P4DIR &= ( ~BIT0 ); // P4.0 input
P4SEL |= BIT0 ; // P4.0 配为TB0.0输入
/ /P4.7 : 156K的信号计数输入
P4DIR &= ( ~BIT7 ); // P4.0 input
P4SEL |= BIT7 ; // P4.7 配为 TB0CLK 输入
TB0CTL |= MC_2 ; //增计数模式,到65535
TB0R = 0 ; //初始化计数值
}
下面是P4.0信号的中断程序,下面是中断程序的两种写法,请问:有什么不同,都可以正确运行吗?
///////////////////////////////////////////// 第一种写法 /////////////////////////////////////////////////////
//TIMERB 口中断服务程序,U8_1Q中断程序
#pragma vector = TIMER0_B0_VECTOR
__interrupt void timer_b0_isr(void)
{
if( TB0CCTL0 & CCI ){ //捕捉到高电平 数据
Counter_156K = TB0CCR0 ; //保存数据,采用了捕捉寄存器
}else{ //捕捉到低电平
TB0CTL |= TBCLR ; //计数器清0
}
TB0CCTL0 &= (~CCIFG) ; //清中断标志
}
///////////////////////////////////////////// 第二种写法 /////////////////////////////////////////////////////
//TIMERB 口中断服务程序,U8_1Q中断程序
#pragma vector = TIMER0_B0_VECTOR
__interrupt void timer_b0_isr(void)
{
if( TB0CCTL0 & CCI ){ //捕捉到高电平 数据
Counter_156K = TB0R ; //保存数据,采用了计数寄存器,而不是捕捉寄存器
}else{ //捕捉到低电平
TB0CTL |= TBCLR ; //计数器清0
}
TB0CCTL0 &= (~CCIFG) ; //清中断标志
}
///////////////////////////////////////////// 测试结论 /////////////////////////////////////////////////////
我测试时,发现,第一种写法,有时计数不正确,误差会有3个方波左右,计数出错时,往往是输入的时钟信号,发生跳变的时候,这时刚好进入中断。
void TimrA1Init_captrue(void)
{
undefined
TA0CTL = TASSEL0+TACLR+TAIE+MC1; //时钟信号选择MCLK,计数模式为连续增计模式
TA0CCTL1 = CM1+SCS+CAP+CCIE; //输入下降沿捕获,CCI1A为捕获信号源
P1SEL |=BIT2; //设置P1.2端口为功能模块CCI1A输入捕获
}
unsigned int TimeGap=0;
#pragma vector=TIMER0_A1_VECTOR //定时器A中断处理
__interrupt void timer_a(void)
{
switch(TA0IV) //向量查询
{
case 2:
TimeGap=TA0R;//获取脉冲间隔
TA0R=0;
break;
default:
break;
}
}
请问:
TimeGap=TA0R;//获取脉冲间隔,这个正确吗?还是下面的语句是正确的:
TimeGap = TA1CCR0 ;
Timer B使用了捕捉功能,设置成上升沿捕捉,下面是中断程序的两种写法:
///////////////////第一种/////////////////////
#pragma vector = TIMER0_B0_VECTOR
__interrupt void timer_b0_isr(void)
{
if( TB0CCTL0 & CCI ){ //捕捉到低电平
//进行处理
TB0CCTL0 &= (~CCIFG) ; //清中断标志
}
}
///////////////////第二种/////////////////////
#pragma vector = TIMER0_B0_VECTOR
__interrupt void timer_b0_isr(void)
{
//进行处理
TB0CCTL0 &= (~CCIFG) ; //清中断标志
}
请问:
如果设置成只有上升沿捕捉,在中断程序里面,就可以不用再判断了,直接进行处理就可以了?也就是说,可以不使用 if( TB0CCTL0 & CCI ),这个语句了?谢谢