调试串口数据正常,但是stm32单片机自主运行时串口数据不对(包括hal库使用printf重映射内容)

今天调stm32发现这样的问题。调试串口数据正常,但是stm32单片机自主运行时串口数据不对。

用的stm32F4和ads1256模块,发送ADC电压采集数据。

问题可能原因如下:

1、模块SPI通讯问题,检查单片机时钟主频,SPI clock在模块要求的2MHz以下,没有问题,排除。

2、模块初始化没有给合适的延时,通过增加延时时间后发现并非该原因。

最终经过学长提醒,发现原因如下:串口打印时用了printf,使用了标准库<stdio.h>,然后keil里需要专门设置一个地方保证单片机系统对标准库的支持。

首先讲解使用printf的重映射步骤。

1、加上printf的标准库#include <stdio.h>

2、进行重映射,在main.c文件里编写 fputc(int ch, FILE *f)的函数,其中huart2改为单片机对应的串口。

int fputc(int ch, FILE *f)
{
 uint8_t temp[1] = {ch};
 HAL_UART_Transmit(&huart2, temp, 1, 2);
 return ch;
}

3、正常调用printf函数 

Adc = ADS1256ReadData( (i << 4) | ADS1256_MUXN_AINCOM);
Volts = Adc*0.000000598;
printf(" %.4fV  ",Volts);

4、也就是我遇到的问题的根源,进行Use MicroLIB的配置

如图,按照上述步骤勾选Use MicroLIB就可以解决打印问题了~

希望对大家有帮助!

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32G0系列单片机可以使用HAL库提供的函数来将变量写入Flash中。 以下是一个示例代码,将一个16位的整数写入Flash中: ```c #include "stm32g0xx_hal.h" #define FLASH_USER_START_ADDR ADDR_FLASH_PAGE_31 // 定义 Flash 起始地址,这里选择了倒数第二个扇区 #define FLASH_USER_END_ADDR ADDR_FLASH_PAGE_31 + FLASH_PAGE_SIZE - 1 // 定义 Flash 结束地址 uint16_t data = 1234; // 要写入 Flash 的数据 // 函数声明 void WriteToFlash(uint32_t address, uint16_t data); int main(void) { HAL_Init(); // 写入数据到 Flash WriteToFlash(FLASH_USER_START_ADDR, data); while (1) { // 程序执行其他任务 } } // 将数据写入 Flash void WriteToFlash(uint32_t address, uint16_t data) { HAL_StatusTypeDef status = HAL_OK; uint32_t pageError = 0; // 擦除 Flash 扇区 FLASH_EraseInitTypeDef eraseInitStruct; eraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES; eraseInitStruct.PageAddress = FLASH_USER_START_ADDR; eraseInitStruct.NbPages = 1; status = HAL_FLASHEx_Erase(&eraseInitStruct, &pageError); if (status != HAL_OK) { // 发生错误,处理错误 return; } // 写入数据到 Flash status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, address, data); if (status != HAL_OK) { // 发生错误,处理错误 return; } } ``` 在这个示例代码中,我们首先定义了要写入 Flash 的数据 `data`,然后调用 `WriteToFlash()` 函数将数据写入 Flash。该函数首先使用HAL库提供的 `HAL_FLASHEx_Erase()` 函数擦除 Flash 扇区,然后使用 `HAL_FLASH_Program()` 函数将数据写入 Flash。在写入数据之前,我们需要定义要写入的 Flash 起始地址,并且要确保不会写入到 Bootloader 或其他重要数据的位置。此外,还需要注意的是,STM32G0系列单片机的Flash只能写入半字(16位),因此在这个示例中,我们使用 `FLASH_TYPEPROGRAM_HALFWORD` 来指定写入半字。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值