yg776

  • 2019-03-17
  • 回复了主题帖: 求教一下MSP430的RAM分配问题。

    谢谢你的回答!

  • 2019-03-16
  • 回复了主题帖: 求教一下MSP430的RAM分配问题。

    本帖最后由 yg776 于 2019-3-16 16:02 编辑 谢谢你回答我的问题。我上面的问题的确问得很不好,没把问题写清楚。且变量的类型都没给出来。 1.这个算式是16位ADC的处理程序。所以get是unsigned int型,但是因为尽量不用小数,所以我改成了unsigned long,但是仔细想想430是16位的,我还是有点担心直接用32位的unsigned long。 2.要把小数再乘以10000是因为我发现我使用的ccs在我使用sprintf(val,"%d",get);的时候,对于get的类型。编译器只让我使用%d,我如果换成%u或者%f它都会报错。如果不报错我就直接输出不会再去乘以10000了。 对于会超出FRAM的问题,我得出的结论是我芯片选型的错误。这程序是老师给的一个课题里面的。我随便选了一个430单片机。结果这款单片机只要一些浮点数的计算都会爆内存。但是我除了这个ADC的处理程序,后序还有开2次方根。所以这款单片机满足不了我的需求。我已经把单片机换成了F5529。 再次感谢你能回答我的问题:congratulate: 如果可以的话,大神能不能分享一些关于430单片机在CCS编译器下的内存分配的经验。以前一直写程序,但是我发现解决内存分配也是非常重要的。

  • 发表了主题帖: 求教一下MSP430的RAM分配问题。

      单片机:msp430fr2111    编译器:CCS v8.3.0      因为我最近在写一个关于msp430fr2111单片机的程序,写着写着,系统就提示我爆了FRAM内存。最后检查出来是因为一串有小数的计算公式捣的鬼:get = get/65535.0*4.096*10000;  可能因为是小数占的位数太多了,就提示了爆内存。之后我想了其他方式解决。可是系统一直会在我这一行算法提示一行信息:recommend moving them to RAM during run time or not using as there are processing/power intensive.   因为以前都是单纯地写程序,没考虑过内存的分配问题。求大佬指点一下。

  • 2019-03-07
  • 回复了主题帖: 使用MSP430FR2000的一些心得与例程

        P1SEL0 |= BIT6 | BIT7;     UCA0CTLW0 = UCSWRST;     UCA0CTLW0 |= UCSSEL__ACLK  ;     UCA0BR0 = 3;     UCA0BR1 = 0x00;     UCA0MCTLW = 0x9200;     UCA0CTLW0 &=~ UCSWRST;     UCA0IE |= UCRXIE; 以上的程序是FR2111在32768HZ情况下发送9600波特率的串口设置。已经验证能正常使用。

  • 2019-03-05
  • 发表了主题帖: MSP430FR2111无法发送出数据的问题

    串口的初始化: void USART_Init(void) {    P1SEL0 |= BIT2 + BIT3;    P1SEL1 &= ~(BIT2 + BIT3);    UCA0CTLW0 = UCSWRST;    UCA0CTLW0 |= UCSSEL__ACLK + UCPEN  +UCPAR ;    UCA0BR0 = 3;    UCA0BR1 = 0x00;    UCA0MCTLW = UCBRS3 + UCBRF0;    UCA0CTLW0 &=~ UCSWRST;    UCA0IE |= UCRXIE; } 发送: void Uart1send(u8 cm) { while(!(UCA0IFG & UCTXIFG)); UCA0TXBUF = cm; } void Uart1sendcom(u8 *cmd) {     register u8 *string = cmd;     while(*string != '\0')     {     Uart1send(*string++);     } } 主程序: void main(void) {     WDTCTL = WDTPW | WDTHOLD;               // Stop watchdog timer     PM5CTL0 &= ~LOCKLPM5;                   // Disable the GPIO power-on default high-impedance mode                                             // to activate previously configured port settings     CLK_init();     //PWM_Init();     USART_Init();     while(1)     {         Uart1send('1');         Uart1send('7');     } } 求助下各位大神,这程序是我照着F5529单片机写的,后面我又对比了网上的FR系列的串口程序,并没有很大的差别啊,可是串口的P1.3引脚的TXD我用示波器看就是没有波形,之前说可能是我端口的输出配置有问题,但是我查了芯片手册 DIR不需要配置,只需要把SELX配置成01就可以了,我觉得理论上我已经检查不出有什么问题了,求大佬能帮忙看看。

  • 2019-03-02
  • 回复了主题帖: 关于msp430fr2000的内存FRAM的问题!!

    这个msp430fr2000的内存实在是太小了,我现在已经删掉了这2个数组。只保留了一个必须用的TIME【3】的全局变量。它的FRAM还是超过了它预先在CMD里面的0x180长度,我现在优化到极致只能保持0x2d7的长度,但是还是超过了。 而且还有个问题是,只要主函数使用了ds1302里面的函数,编译就会不通过。而且使用不同的函数还会带来不同的FRAM长度的不同,就是他的意思就是我不能全局变量 且 我不能使用过多的函数,我觉得不管这个芯片有多老,它也不应该连一个全局变量都不能放啊...... 反正主函数里面不可以放ds1302的函数,因为ds1302里面的函数提到了TIME【3】,使用的函数次数越多,fram就越大。 以下是我的三个主函数需要用到的函数。:time: void Ds1302_Init(void) {     uchar n;     Ds1302Write(0x8E,0X00);      //禁止写保护,就是关闭写保护功能     if(Ds1302Read(0xc1) != 0xaa)     {     for (n=0; n<3; n++)//写入7个字节的时钟信号:分秒时日月周年     {         Ds1302Write(0x80 + n*2,TIME[n]);     }     Ds1302Write(0xc0,0xaa);      //打开写保护功能 //  Ds1302Write(0x8E,0x80);      //打开写保护功能 } } void important_Init(void)                //这是用于修改了时间后 对寄存器进行的重新赋值 {     uchar n;     Ds1302Write(0x8E,0X00);      //禁止写保护,就是关闭写保护功能     for (n=0; n<3; n++)//写入7个字节的时钟信号:分秒时日月周年     {         Ds1302Write(0x80 +n*2,TIME[n]);     }     Ds1302Write(0x8E,0x80);      //打开写保护功能 } void Ds1302ReadTime(void) {     uchar n;     for (n=0; n<3; n++)//读取7个字节的时钟信号:分秒时日月周年     {         TIME[n] = Ds1302Read(0x81 + n*2);     } }

  • 回复了主题帖: 关于msp430fr2000的内存FRAM的问题!!

    懒猫爱飞 发表于 2019-3-2 08:44 1) 如楼上所说,如果RAM太小,程序空间还有空间,可以定义成常量数组或宏定义(宏定义也是常量的一种形式) ...
    我现在都已经这样了 void Ds1302ReadTime(void) {     uchar n; //    for (n=0; n<3; n++) //    { //        TIME[n] = Ds1302Read(READ_RTC_ADDR[n]); //    }     TIME[0] = Ds1302Read(0x81);     TIME[1] = Ds1302Read(0x83);     TIME[2] = Ds1302Read(0x85); } 数组也不要了,直接写地址,它还是不通过。。。。

  • 回复了主题帖: 关于msp430fr2000的内存FRAM的问题!!

    tiankai001 发表于 2019-3-2 07:22 这两个数组是常量吗,如果是,定义成常量,就不占RAM空间了
    改成了 const uchar  READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; const uchar  WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c}; 结果还是不通过

  • 回复了主题帖: 关于msp430fr2000的内存FRAM的问题!!

    懒猫爱飞 发表于 2019-3-2 08:44 1) 如楼上所说,如果RAM太小,程序空间还有空间,可以定义成常量数组或宏定义(宏定义也是常量的一种形式) ...
    我之前直接把全局变量的这2个数组拿到函数里面去过,还是不通过。 方法二。定义为常量数组, 我改成了 const uchar  READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; const uchar  WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c}; 因为这是2个地址数组,只读就行。我就想让他不占那么多空间。结果还是编译报错。 方法三,宏定义法。 我像这样宏定义了一下 //#define READ_RTC_ADDR[0] 0x81 //#define READ_RTC_ADDR[1] 0x83 //#define READ_RTC_ADDR[2] 0x85 //#define READ_RTC_ADDR[3] 0x87 //#define READ_RTC_ADDR[4] 0x89 //#define READ_RTC_ADDR[5] 0x8b //#define READ_RTC_ADDR[6] 0x8d 但是不能直接用,因为使用这2个数组的函数的形参是uchar形,所以编译就也是不能通过的。 我再尝试看看宏定义法,改一下函数。

  • 2019-03-01
  • 发表了主题帖: 关于msp430fr2000的内存FRAM的问题!!

    我在使用MSP430FR2000的时候,因为是内存小,价格便宜,引脚少。我们才选择了他,但是现在遇到了他的内存的问题。 我在写程序的时候,引入了ds1302的头文件,但是问题就随之而来了。因为这个单片机的fram只有0.5K.     FRAM                    : origin = 0xFE00, length = 0x180 ds1302里面有2个地址数组: static uchar  READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; static uchar  WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c}; 只要有这2个数组在程序里面,编译就是不通过。提示:profram will not fit into available memory,placement with alignment fails for section "ALL_FRAM" size 0x376. 我百度过,网上的解决方法好像是手动修改CMD文件里面的FRAM的长度。但是我真不知道该怎么该,有点懵。 我还试过把这个全局变量放到要用的函数里面。也不行,解决不了。 求求大佬帮忙看一下 编译软件是CCSV8.3

  • 回复了主题帖: 使用MSP430FR2000的一些心得与例程

    懒猫爱飞 发表于 2019-2-27 23:16 1) 实时总结,这个习惯,很好!希望您能一直坚持下去,也希望您能多在坛子里多总结一些东西^_^ 2) 给点 ...
    谢谢你,我会注意的。

  • 回复了主题帖: 使用MSP430FR2000的一些心得与例程

    tiankai001 发表于 2019-2-28 09:17 串口发不出东西,用示波器看看串口发送端有无数据。 430数据手册有一句话:端口即使被设为第二功能,端口 ...
    的确我只是复用了 没有设置输出输入方向 我学长给我提到过这个问题,但是我没注意 谢谢

  • 2019-02-27
  • 发表了日志: 使用MSP430FR2000的一些心得与例程

  • 发表了主题帖: 使用MSP430FR2000的一些心得与例程

      前段时间,因为项目原因我接触了MSP430FR2000单片机。因为以前多数时间用的是MSP430F5529,所以在上手这款单片机时虽然比较简单,但是还是有一定的困难,因为FR2000与F5529的寄存器差别还是存在,网上又查不到相应的一些例程。只有自己看着以前的5529去写。以下是一些成功的程序: PWM模块: void PWM_Init(void) {     P2DIR |= BIT0 ;     P2SEL0 |= BIT0 ;     TB0CCR0 = 1000;     TB0CCTL1 = OUTMOD_7;     TB0CCR1 = 500;     TB0CTL |= MC_1 + TBSSEL__ACLK + TBCLR; } 时钟初始化模块: void CLK_init(void) {     CSCTL3 |= FLLREFDIV__1 + SELREF_1;              //1分频 , 参考时钟REFCLK     __bis_SR_register(SCG0);//关闭FLL     CSCTL0 = 0x00;     CSCTL1 |= DCORSEL_2 + 0;     CSCTL2 |= FLLD__1 + 31;     __bic_SR_register(SCG0);//开启FLL     CSCTL4 |= SELMS__REFOCLK + SELA__REFOCLK ;     CSCTL5 |= DIVM__1 + DIVS__1 + DIVA__1;     CSCTL8 = 0; } 串口模块(按道理说,我觉得这个是没问题的,但是串口发不出东西): void USART_Init(void) {    P1SEL0 |= BIT2 + BIT3;    UCA0CTLW0 = UCSWRST;    UCA0CTLW0 |= UCSSEL__ACLK ;    UCA0BR0 = 3;    UCA0BR1 = 0x00;    UCA0MCTLW = UCBRS3 + UCBRF0;    UCA0CTLW0 &=~ UCSWRST;    UCA0IE |= UCRXIE; } void Uart1send(u8 cm) { while(!(UCA0IFG & UCTXIFG)); UCA0TXBUF = cm; } void Uart1sendcom(u8 *cmd) {     while(*cmd != '\0')     {     Uart1send(*cmd);     cmd++;     } } 还有一点非常非常重要的,因为我在选型这款单片机的时候就是看见了他的芯片手册写了RTC功能,但是在我把芯片买了板子打出来准备写RTC程序时,才发现这款单片机的RTC的真实名字是RTC_COUNTER,仅仅是用作计数器的RTC模块(注意:这里不是实时时钟RTC)。所以并不能满足我的需要。这就造成了时间与精力上的浪费,希望大家别像我一样。

最近访客

< 1/1 >

统计信息

已有14人来访过

  • 芯币:43
  • 好友:--
  • 主题:4
  • 回复:9
  • 课时:--
  • 资源:--

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言