STM32 CubeMX FreeRtos系统 基于lwRB通用环形缓冲区的串口非阻塞发送

预到问题:

FreeRtos是一个实时系统,调试时经常遇到printf打印日志,一般都是将日志通过串口等发送出去,但是串口发送是一个比较慢的外设,一般使用串口都是采用fputc重定向,但是这个函数是

int fputc(int ch, FILE *f)
{
		/* 发送一个字节数据到USART1 */
		HAL_UART_Transmit(&huart1, (uint8_t *)&ch,1 ,1000);
		return (ch);
}

一个阻塞函数,这就导致printf不能用于中断函数,复杂的要求实时高的系统是不允许的,所以为了能在中断中使用printf函数,除了自己写一个printf,还可以将fputc写成非阻塞函数。

但是这个fputc在printf中是循环调用的只发送1个字节,当然有个办法就是先将挨个保存起来,最后直接整体输出,这就有个问题,咱们不知道printf内最后一次调用这个函数是啥时候,调用了几次整体保存后要整体发送的字节数不知道,所以要设置一个变量保存调用次数。还有就是针对多线程还要保证线程安全,中断安全。因为种种原因大佬开源了神器  LwRB  通用FIFO,它不仅支持线程安全(原子操作),而且还支持DMA

移植

嵌入式开源组件——LwRB(RingBuffer)的移植和应用-CSDN

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

qq_43175613

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

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

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

打赏作者

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

抵扣说明:

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

余额充值