在HAL库中的使用printf()函数和sprintf()函数

在HAL库中的使用printf()函数和sprintf()函数


运行环境为:HAL库。

1.printf();

如果想要在串口中使用printf函数,就需要将这个函数重定向。

#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART */
	huart1.Instance->DR = (uint8_t) ch;
 
  /* Loop until the end of transmission */
	while(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TC) == RESET){}
 
  return ch;
}

调用实例:

#include <stdio.h>
unsigned int value=3000;//12位ADC的值

printf("\r\n %.3f",value*3.3/4096);	
//在Windows中 \r\n 才是回车

此外:
在这里插入图片描述

2.sprintf():

C 库 : int sprintf(char *str, const char *format, …)

str:指向 格式转换完后存储的 字符数组的指针
format:%[flags][width][.precision][length]specifier
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

调用实例:

#include <stdio.h>
char TxData[10]={0};
unsigned int value=3000;//12位ADC的值

sprintf(TxData,"%.3f",value*3.3/4096);
HAL_UART_Transmit(&huart1,(unsigned char *)TxData,5,0xffff);
//(unsigned char*)是强制转换 无符号的指针类型。
//相反,(char*)是强制转换 有符号的指针类型。如果大于127即0x7F的数就是负数了,使用%x格式化输出,系统自动进行了符号扩展。

输出: 2.417

  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
为了将STM32用作手表,您需要使用DS1302时钟模块和DS18B20温度传感器。您可以使用HAL库来编写代码。以下是实现此目标的步骤: 1. 配置RTC(实时时钟)和GPIO(通用输入/输出)模块。您可以使用STM32CubeMX进行配置。确保您已正确配置时钟和引脚。 2. 初始化DS1302时钟模块。您可以使用DS1302库函数来初始化时钟模块。确保您已正确连接DS1302模块并将其与STM32通信。 3. 读取DS1302时钟模块的时间。您可以使用DS1302库函数来读取时间。将读取的时间存储在变量以供后续使用。 4. 初始化DS18B20温度传感器。您可以使用DS18B20库函数来初始化温度传感器。确保您已正确连接DS18B20传感器并将其与STM32通信。 5. 读取DS18B20温度传感器的温度。您可以使用DS18B20库函数来读取温度。将读取的温度存储在变量以供后续使用。 6. 将读取的时间和温度显示在LCD上。您可以使用LCD库函数来显示时间和温度。确保您已正确连接LCD并将其与STM32通信。 以下是示例代码: ```c #include "stm32f1xx_hal.h" #include "ds1302.h" #include "ds18b20.h" #include "lcd.h" RTC_HandleTypeDef hrtc; void SystemClock_Config(void); int main(void) { HAL_Init(); SystemClock_Config(); // 配置RTC和GPIO模块 // ... // 初始化DS1302时钟模块 ds1302_init(); // 读取DS1302时钟模块的时间 RTC_TimeTypeDef time; ds1302_get_time(&time); // 初始化DS18B20温度传感器 ds18b20_init(); // 读取DS18B20温度传感器的温度 float temperature = ds18b20_read_temp(); // 将读取的时间和温度显示在LCD上 lcd_init(); lcd_print("Time: %02d:%02d:%02d", time.Hours, time.Minutes, time.Seconds); lcd_print("Temp: %.2f C", temperature); while (1) { } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); } } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值