C 中浮点转换为整型是截断的,直接将后面的小数去掉,而不是四舍五入。
如:uint16_t(12.89)=12,而不是13。
项目中写了个小函数,将浮点数输入后,直接用7段译码管显示,用上述方法转换为整型后发现有显示误差。解决方法如下:
1、定义一个四舍五入小数的宏
#define ROUND_TO_UINT16(x) ((uint16_t)(x)+0.5)>(x)? ((uint16_t)(x)):((uint16_t)(x)+1) //将浮点数x四舍五入为uint16_t
2、使用例程
下面即可将数据四舍五入为整型数
disp_num = ROUND_TO_UINT16(num);
ROUND_TO_UINT16(12.89)=13!
关键字:STM32 浮点数 四舍五入
引用地址:
STM32学习笔记7——浮点数四舍五入
推荐阅读最新更新时间:2024-03-16 16:24
STM32 上使用 printf 输出函数
如果要实现在串口 或者 LCD 上显示,必须重定义标准库函数里调用的与输出设备相关的函数。 如果使用 printf 输出到串口,需要将 fputc 里面的输出指向串口,这一过程就叫重定向。 那么如何让 STM32 使用 printf 函数呢?只需要将 fputc 里面的输 出指向 STM32 串口即可。 int fputc(int ch,FILE *p) //函数默认的,在使用 printf 函数时自动调用 { USART_SendData(USART1,(u8)ch); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); return ch;
[单片机]
如何采用STM32中的控制定时器Tim1实现计数器功能
STM32中的高级控制定时器(Tim1)是由一个16位的自动装载计数器组成,它由一个可编程预分频器驱动。 用途在于:测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较,PWM,嵌入死区时间的互补PWM等)。 使用定时器预分频器和RCC时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫秒的调节。 具体如下: 16位上下,自动装载计数器。 16位可编程预分频器,计数器时钟频率的分频率的分频系数为1-65535之间任意数值,4个独立通道: 输入捕获 输出比较 PWM生成 单脉冲模式输出 死区时间可编程的互补输出 使用外部信号控制定时器和定时器互连的同步电路 在指定数目的计数器周期之后更新定时器寄存器
[单片机]
STM32串口中断实验总结函数的初始化必须在变量的初始化之后
在进行串口的实验的时候,自己没有看教程,写了一段代码,但是进行编译之后发现一直有错误,就算我把代码更改之后还是一直有错误。对比了官方给的教程之后发现唯一的不同之处就是我的有一个函数的初始化是在变量的初始化之前,进行的初始化,在进行相应的知识查询之后,还有请教了师兄之后,发现了自己以前一直没有注意到的问题就是,函数的初始化必须放到变量的初始化之后,否则在使用keil也就是MDK进行建立工程的时候就会报错。 注意细节
[单片机]
STM32的通用定时器TIMx系统了解
通用定时器(TIMx) 一、TIMx简介 二、TIMx主要功能 三、TIMx功能描述 3.1 时基单元 3.2 计数器模式 3.3 时钟选择 3.4 捕获/比较通道 3.5 输入捕获模式 3.6 PWM输入模式 3.7 强置输出模式 3.8 输出比较模式 3.9 PWM 模式 3.10 单脉冲模式 四、简单例子理解TIMx 4.1 使得PB5-TIM3通道2产生频率为12.5Hz的方波,该方波控制LED1的闪烁 4.2 周期控制通用定时器3的2通道,实现1KHz的不同占空比波形,控制LED实现呼吸灯 本文涉及链接 一、TIMx简介 通用定时器是一个通过可编程预分频器驱动的16位自动装载
[单片机]
STM32 JTAG引脚复用设置
前奏 先来copy下 JTAG、SW接口的定义, JTAG:JTAG(Joint Test Action Group;联合测试工作组)是一种国际标准测试协议,主要用于芯片内部测试。现在多数的高级器件都支持JTAG协议,如DSP、FPGA器件等。标准的JTAG接口是4线:TMS、TCK、TDI、TDO,分别为模式选择、时钟、数据输入和数据输出线。 SWD:SW(Serial Wire Mode Interface),串行接口线模式。在串行线模式,只有针TCLK和TMS使用。TDO数据输出引脚是一个可选。 SWD下载调试 原理图: 从图中看到:板子使用SWD接口下载调试,即使用SWDIO、SWCLK(PA13、PA14);PB3–
[单片机]
keil 的stm32启动文件分析
;* 文件名 : startup_stm32f10x_hd.s ;* 库版本 : V3.5.0 ;* 说明: 此文件为STM32F10x高密度设备的MDK工具链的启动文件 ;* 该模块执行以下操作: ;* -设置初始堆栈指针(SP) ;* -设置初始程序计数器(PC)为复位向量,并在执行main函数前初始化系统时钟 ;* -设置向量表入口为异常事件的入口地址 ;* -复位之后处理器为线程模式,优先级为特权级,堆栈设置为MSP主堆栈 ;* Stack_Size EQU 0x00000200;定义堆栈的大小 ;AREA 命令指示汇编器汇编一个新的代码段或数据段。 ;段是独立的、指定的、不可见的代码或
[单片机]
如何将STM32单片机的JTAG口作为GPIO使用
使用STM32F系列,会遇到将JTAG口复用为SPI1或直接用做普通IO。 针对于F1系列,需要先禁止使能 JTAG,然后将其复用为其他口或者普通IO。 针对F4系列,STM32F4库函数中,已经取消了GPIO_*PinRemapConfig()函数,对于复用功能使用GPIO*_PinAFConfig()函数了! 但是在GPIO_PinAFConfig()函数已经没有禁止JTAG/SW等选项了,而是复用到AF0~AF15线上,其中AF0是系统功能(也是复位初始功能)。 其中调试接口就是系统功能,这样需要禁用JTAG功能只需把引脚复用到AF1~AF15中的一个就行了。 直接复用就可使用相应的复用功能,不用想着失能
[单片机]
基于STM32和CPLD的等精度测频设计
在电子工程、资源勘探、仪器仪表等相关应用中,频率测量是电子测量技术中最基本最常见的测量之一,频率计也是工程技术人员必不可少的测量工具。但是,传统的频率测量方法在实际应用中有较大的局限性,基于传统测频原理的频率计的测量精度将随被测信号频率的变化而变化,传统的直接测频法其测量精度将随被测信号频率的降低而降低,测周法的测量精度将随被测信号频率的升高而降低。本文中提出一种基于ARM与CPLD宽频带的数字频率计的设计,以微控器STM32作为核心控制芯片,利用CPLD可编程逻辑器件,实现闸门测量技术的等精度测频。 本设计的技术指标: 测频范围:1Hz~200MHz,分辨率为0.1Hz,测频相对误差百万分之一。 周期测量:信号测量范围与精
[嵌入式]