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_第1张图片

2.使用外部晶振:
1.freertos应用系列之cubemx创建freertos_第2张图片

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

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

1.freertos应用系列之cubemx创建freertos_第5张图片
1.freertos应用系列之cubemx创建freertos_第6张图片

6.配置测试GPIO:

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

1.freertos应用系列之cubemx创建freertos_第7张图片

添加freertos组件

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

8.保存工程
1.freertos应用系列之cubemx创建freertos_第9张图片
1.freertos应用系列之cubemx创建freertos_第10张图片
1.freertos应用系列之cubemx创建freertos_第11张图片

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

添加串口功能代码

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_第12张图片

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

#include 

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

测试所创建的任务

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

烧录运行

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

最后编译完成就可以烧录了,烧录之前先连接好串口,打开串口软件
1.freertos应用系列之cubemx创建freertos_第17张图片
接着烧录看串口信息
1.freertos应用系列之cubemx创建freertos_第18张图片
以上可以看出任务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_第19张图片
代码逻辑与示波器捕获到的时间一致,两个为互补信号


源码地址

Github:

你可能感兴趣的:(FreeRTOS应用,单片机,stm32,物联网,c语言)