> 文章列表 > 1.freertos应用系列之cubemx创建freertos

1.freertos应用系列之cubemx创建freertos

1.freertos应用系列之cubemx创建freertos

freertos应用全系列(写完关联更新)

01.freertos应用系列之cubemx创建freertos 11.freertos应用系列之cubemx创建freertos
02.freertos应用系列之cubemx创建freertos 12.freertos应用系列之cubemx创建freertos
03.freertos应用系列之cubemx创建freertos 13.freertos应用系列之cubemx创建freertos
04.freertos应用系列之cubemx创建freertos 14.freertos应用系列之cubemx创建freertos
05.freertos应用系列之cubemx创建freertos 15.freertos应用系列之cubemx创建freertos
06.freertos应用系列之cubemx创建freertos 16.freertos应用系列之cubemx创建freertos
07.freertos应用系列之cubemx创建freertos 17.freertos应用系列之cubemx创建freertos
08.freertos应用系列之cubemx创建freertos 18.freertos应用系列之cubemx创建freertos
09.freertos应用系列之cubemx创建freertos 19.freertos应用系列之cubemx创建freertos
10.freertos应用系列之cubemx创建freertos 20.freertos应用系列之cubemx创建freertos


01.cubemx创建freeRTOS

实验使用平台:

  • ART-PI(STM32H750XB)
  • 板载ST-LINK
  • STM32CubeMX 6.6.1
  • KEILv5.27
  • 示波器优利德UTD2102CEX+

cubemx基本配置

1.选择所要支持的芯片:
1.freertos应用系列之cubemx创建freertos

2.使用外部晶振:
1.freertos应用系列之cubemx创建freertos

3.选择系统时基:
1.freertos应用系列之cubemx创建freertos
4.配置系统时钟(直接开最大):
1.freertos应用系列之cubemx创建freertos
5.配置串口:

PI9     ------> UART4_RX
PA0     ------> UART4_TX

1.freertos应用系列之cubemx创建freertos
1.freertos应用系列之cubemx创建freertos

6.配置测试GPIO:

PB2 ------> OUTPUT
PB0 ------> OUTPUT

1.freertos应用系列之cubemx创建freertos

添加freertos组件

7.添加freertos组件:这里添加了两个任务,优先级相同
1.freertos应用系列之cubemx创建freertos

8.保存工程
1.freertos应用系列之cubemx创建freertos
1.freertos应用系列之cubemx创建freertos
1.freertos应用系列之cubemx创建freertos

生成工程之后编译下是否报错,无报错进行下一步,有报错大多都是有中文路径和中文名

添加串口功能代码

9.完善串口功能代码,以使用printf

把以下代码添加进去usart.c中

/*
*function:	写字符文件函数
*param1:	输出的字符
*param2:	文件指针
*return:	输出字符的ASCII码
/
int fputc(int ch, FILE *f)
{HAL_UART_Transmit(&huart4, (uint8_t*)&ch, 1, 10);return ch;
}/*
*function:	读字符文件函数
*param1:	文件指针
*return:	读取字符的ASCII码
/
int fgetc(FILE *f)
{uint8_t ch = 0;HAL_UART_Receive(&huart4, (uint8_t*)&ch, 1, 10);return (int)ch;
}/ 添加如下代码,则不需要在工程设置中勾选Use MicroLIB
*/#pragma import(__use_no_semihosting)struct __FILE
{int a;
};FILE __stdout;
FILE __stdin;
void _sys_exit(int x)
{}

1.freertos应用系列之cubemx创建freertos

添加进去之后编译会报错,还需要在usart.h中添加头文件

#include <stdio.h>

如下:
1.freertos应用系列之cubemx创建freertos
这时候我们就可以在任务中直接使用printf了

测试所创建的任务

10.在freertos.c中以下位置添加测试代码printf
1.freertos应用系列之cubemx创建freertos
如下,这里添加了一个串口打印并更改了阻塞时间20个心跳节拍
1.freertos应用系列之cubemx创建freertos
并在freertos.c添加usart.h如下:
1.freertos应用系列之cubemx创建freertos

烧录运行

11.打开串口软件,烧录查看串口打印信息

最后编译完成就可以烧录了,烧录之前先连接好串口,打开串口软件
1.freertos应用系列之cubemx创建freertos
接着烧录看串口信息
1.freertos应用系列之cubemx创建freertos
以上可以看出任务1任务2交替执行,但为了严谨需要对freertos时间片进行验证,看看时钟配置是否存在错误,freertos的时间轮转在默认配置下是1ms

心跳节拍验证

12.将两个任务的代码进行稍微修改:
如下:

/* @brief  Function implementing the Task01 thread.* @param  argument: Not used* @retval None*/
/* USER CODE END Header_StartTask01 */
void StartTask01(void *argument)
{/* USER CODE BEGIN StartTask01 *//* Infinite loop */for(;;){HAL_GPIO_WritePin(GPIOB, PB0_OUT_Pin, GPIO_PIN_SET);osDelay(1);HAL_GPIO_WritePin(GPIOB, PB0_OUT_Pin, GPIO_PIN_RESET);osDelay(1);}/* USER CODE END StartTask01 */
}/* USER CODE BEGIN Header_StartTask02 */
/
* @brief Function implementing the Task02 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask02 */
void StartTask02(void *argument)
{/* USER CODE BEGIN StartTask02 *//* Infinite loop */for(;;){HAL_GPIO_WritePin(GPIOB, PB2_OUT_Pin, GPIO_PIN_RESET);osDelay(1);HAL_GPIO_WritePin(GPIOB, PB2_OUT_Pin, GPIO_PIN_SET);osDelay(1);}/* USER CODE END StartTask02 */
}

编译烧录到示波器中如下:
1.freertos应用系列之cubemx创建freertos
代码逻辑与示波器捕获到的时间一致,两个为互补信号


源码地址

Github: