首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在STM32上使用浮点、snprintf、sprtinf的几个问题

在STM32上使用浮点、snprintf、sprtinf的几个问题
EN

Stack Overflow用户
提问于 2021-03-24 12:48:11
回答 1查看 230关注 0票数 0

我想告诉您,我为STM32L151C8微控制器创建了软件,通过I2C PCF85176驱动程序控制LCD段显示。

设计:

  • 电池动力
  • 附加蓝牙模块可配置,并在EEPROM / FLASH中保持配置值​​
  • 脉冲计在中断上,并在闪存中保持值,装置插入电池后不重置。
  • 通过简单的数学运算(加法、乘法)在液晶显示脉冲值​​上显示

我的问题:

使用snprintf / sprintf函数将浮点数转换为char数组-它使用了大量内存?使用浮点(这个MCU没有FPU,我应该使用uint,并且只在LCD上添加点?)我为这个应用选择了好的MCU?

代码语言:javascript
复制
void LCD_Update(void) {
    uint8_t msg[2+20];
    uint8_t *display_mem=msg+2;
    msg[0]=CMD_OPCODE_DEVICE_SELECT | 0 | CMD_CONTINUE;
    msg[1]=CMD_OPCODE_LOAD_DATA_POINTER | 0;
    memset(display_mem, 0, 20);

    int i,j;
    for(i=0;i<8;i++) {
        for(j=0;j<4;j++) {
            uint8_t nibble=(display_digits[i]>>(4*j))&0xf;
            uint8_t nibbleaddr=digit_addrs[i][j];
            uint8_t byteaddr=nibbleaddr>>1;
            nibbleaddr&=1;
            display_mem[byteaddr]|=nibble<<(4*nibbleaddr);
        }
    }
    HAL_I2C_Master_Transmit(&hi2c1, PCF8576_ADDR, msg, sizeof(msg), 100);
}
 
void LCD_Clear(void) {
    for(int i=0;i<=8;i++) {
        display_digits[i]=0;
    }
    LCD_Update();
}
 
void LCD_Print(char* str) {
    int idx=0;
    for(int i=0;i<=8;i++) {
        char c=str[i];
        if(c>='A' && c<='Z') {
            display_digits[idx]=alpha[c-'A'];
        }
        else if (c=='.') {
            display_digits[idx-1]=numsDot[str[i-1]-'0'];
            idx--;
        }
        else if(c>='0' && c<='9') {
            display_digits[idx]=nums[c-'0'];
        }
        idx++;
    }
    LCD_Update();
}
 
void LCD_PrintInt(int value) {
    char str[8];
    sprintf(str, "%d", value);
    LCD_Print(str);
}
 
void LCD_PrintFloat(float value, uint8_t length) {
    char str[length];
    snprintf(str, length + 1, "%f", value);
    LCD_Print(str);
}

以上是我的程序片段,用来控制LCD。

EN

回答 1

Stack Overflow用户

发布于 2021-03-24 16:37:22

为了回答你们两个问题:

1/浮点计算是在单片机没有FPU的情况下通过软件实现的。是的,会有更多的代码,所以使用更多的内存。但我相信这对你的申请来说已经足够了。你可以用你现在的单片机。

2/您可以使用sprintf家族函数直接打印浮点,并在您的LCD上打印。默认情况下,这是禁用在STM32编译器。您需要向链接器中添加-u _printf_float标志以启用此功能。您可以参考这个论坛。这在另一个话题中也得到了回答。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66781383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档