stm32cubeMX+FreeRTOS(1)——USART 串口打印

一、STM32CubeMX配置RTOS+USART

1.配置RTOS

默认前面的SYS和RCC配置完成
10

2.配置USART

1

二、printf重定向

#include “stdio.h”
#include "usart.h"
#define DEBUG_UART_TIMEOUT 500

/**
  * 函数功能: 重定向c库函数printf到DEBUG_USART1
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, DEBUG_UART_TIMEOUT);
  return ch;
}

/**
  * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USART1
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
int fgetc(FILE *f)
{
  uint8_t ch = 0;
  HAL_UART_Receive(&huart1, &ch, 1, DEBUG_UART_TIMEOUT);
  return ch;
}

注意
1.一定要包含#include <stdio.h>头文件
2.在KEIL里勾选 Use MicroLIB
在这里插入图片描述

二、MicroLIB

使用MicroLIB,简化嵌入式开发操作,例如你用printf()函数的时候,就会从串口1输出字符串,当然也可以重定义到其他串口;
使用MicroLIB会优化代码空间,但会降低某些程序的执行效率(比如: memcpy()),效率换空间;
由于MicroLIB不支持浮点运算,所以在有FPU单元的MCU上,使用MicroLIB并开启FPU会让程序死机或跑飞。
Microlib不支持C++,在使用C++开发MCU时,首要条件是不能使用Microlib;

参考:https://blog.csdn.net/qq_35697978/article/details/120138859

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
您好!对于使用STM32CubeMXFreeRTOS来配置和使用串口,您可以按照以下步骤进行操作: 1. 打开STM32CubeMX并创建一个新的工程。 2. 选择您的目标STM32微控制器,并确保启用了FreeRTOS支持。 3. 在"Pinout & Configuration"选项卡中,选择您要使用的串口引脚。 4. 在"Configuration"选项卡中,配置串口的参数,例如波特率、数据位、停止位和奇偶校验等。 5. 在"Middleware"选项卡中,启用USART或UART的中断模式或DMA模式,具体取决于您的需求。 6. 生成代码并导出到您的开发环境(例如Keil、IAR或TrueSTUDIO等)。 7. 在生成的代码中,找到FreeRTOS任务的配置文件(通常是`freertos.c`或`main.c`),并添加一个任务来处理串口通信。 8. 在该任务中使用HAL库函数来初始化和控制串口。 以下是一个简单的示例代码,展示了如何在FreeRTOS任务中使用HAL库函数来发送和接收串口数据: ```c #include "stm32f4xx_hal.h" // FreeRTOS任务函数 void USART_Task(void *pvParameters) { // 初始化串口 USART_HandleTypeDef huart; huart.Instance = USART1; huart.Init.BaudRate = 115200; huart.Init.WordLength = UART_WORDLENGTH_8B; huart.Init.StopBits = UART_STOPBITS_1; huart.Init.Parity = UART_PARITY_NONE; huart.Init.Mode = UART_MODE_TX_RX; huart.Init.HwFlowCtl = UART_HWCONTROL_NONE; HAL_UART_Init(&huart); while (1) { // 发送数据 uint8_t data[] = "Hello, World!"; HAL_UART_Transmit(&huart, data, sizeof(data), HAL_MAX_DELAY); // 接收数据 uint8_t rxData[10]; HAL_UART_Receive(&huart, rxData, sizeof(rxData), HAL_MAX_DELAY); // 处理接收到的数据... // 任务延时 vTaskDelay(pdMS_TO_TICKS(1000)); } } int main(void) { // FreeRTOS任务创建 xTaskCreate(USART_Task, "USART_Task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL); // FreeRTOS内核启动 vTaskStartScheduler(); while (1) { // 如果任务创建失败,进入这里处理 } } ``` 请注意,上述代码仅为示例,您可能需要根据您的特定需求进行适当的修改。 希望这能帮到您!如有更多问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

君逸~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值