杨光宇 发表于 2024-8-8 21:27:23

浮点运算硬件和格式化浮点变量打印有冲突

32F12K54系列单片机,我出现的问题: 当使用 浮点运算单元 时格式化打印会出现问题,关闭浮点运算单元,格式化打印没有问题。
我的格式化打印函数为:

void print_uart3(volatile char *stringg, ...)
{
      volatile char stringx;//一个足够长的字符串
      va_list arg;
      va_start(arg,stringg);
      vsprintf(stringx,stringg,arg);
      va_end(arg);
      uart3_sendstr(stringx); //发送函数 可以是oled usart spi 。。。。字符串格式
}

uart3_sendstr是串口发送函数,可以替换为其他的字符串打印函数。

若我使用 print_uart3("%f\n",a); 将float类型变量a打印出来,将会使单片机不停重启。
若我使用 print_uart3("%d\n",a); 将int类型变量a打印出来,则单片机正常运行。
若我关闭浮点运算单元


则单片机正常打印浮点数。

我的问题代码在附件中
请求各位帮忙解决。

DebugLab 发表于 2024-8-8 22:23:28

FPMU库是不开源的,我也不知道什么原因,不要同时用就好了

杨光宇 发表于 2024-8-9 00:37:21

下图是我使用DMA串口发送数据的情况,发送的数据会时不时抖动以下,在到达某个值的时候突然出现一片乱码


我使用的是STC32F12K54单片机
若不使用DMA发送数据,改使用串口发送,数据就不会发送乱码
(百思不得其解)
代码打包好了,关于上一个问题,我把串口3输出改成串口1输出,浮点冲突不见了.


这两个是用于切换使用普通串口发送和使用DMA串口发送的代码.

杨光宇 发表于 2024-8-9 00:39:51

DebugLab 发表于 2024-8-8 22:23
FPMU库是不开源的,我也不知道什么原因,不要同时用就好了

我需要快速计算FOC的输出,通过串口观察驱动器的状态,如果没有DMA,发送数据会非常慢,会影响FOC的计算速度,而FOC的计算频率对电机控制有很大性影响.所以不得不把串口DMA和FPMU一起使用

llyymm 发表于 2024-8-9 08:14:07

这个问题有一定的代表性,我也关注一下

乘风飞扬 发表于 2024-8-9 11:13:40

keil C251编译器,用到lib库文件时,不要使用“REMOVEUNUSED”。
把“REMOVEUNUSED”删掉试试:

杨光宇 发表于 2024-8-9 22:19:09

本帖最后由 杨光宇 于 2024-8-10 14:56 编辑

乘风飞扬 发表于 2024-8-9 11:13
keil C251编译器,用到lib库文件时,不要使用“REMOVEUNUSED”。
把“REMOVEUNUSED”删掉试试:
...
我试试,没用,还是有乱码


soma 发表于 2024-8-9 23:40:38

闭源的东西调试起来很麻烦啊

杨光宇 发表于 2024-8-10 15:10:14

乘风飞扬 发表于 2024-8-9 11:13
keil C251编译器,用到lib库文件时,不要使用“REMOVEUNUSED”。
把“REMOVEUNUSED”删掉试试:
...

试过了,没用

神农鼎 发表于 2024-8-10 20:03:37

32F12K54设计改进中,尚未定型量产,请改PCB,
用速度实际更快的 8051U-34K64-LQFP48取代
页: [1] 2
查看完整版本: 浮点运算硬件和格式化浮点变量打印有冲突