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
实验使用平台:
- ART-PI(STM32H750XB)
- 板载ST-LINK
- STM32CubeMX 6.6.1
- KEILv5.27
- 示波器优利德UTD2102CEX+
1.选择所要支持的芯片:
2.使用外部晶振:
3.选择系统时基:
4.配置系统时钟(直接开最大):
5.配置串口:
PI9 ------> UART4_RX
PA0 ------> UART4_TX
6.配置测试GPIO:
PB2 ------> OUTPUT
PB0 ------> OUTPUT
7.添加freertos组件:这里添加了两个任务,优先级相同
8.保存工程
生成工程之后编译下是否报错,无报错进行下一步,有报错大多都是有中文路径和中文名
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)
{}
添加进去之后编译会报错,还需要在usart.h中添加头文件
#include
如下:
这时候我们就可以在任务中直接使用printf了
10.在freertos.c中以下位置添加测试代码printf
如下,这里添加了一个串口打印并更改了阻塞时间20个心跳节拍
并在freertos.c添加usart.h如下:
11.打开串口软件,烧录查看串口打印信息
最后编译完成就可以烧录了,烧录之前先连接好串口,打开串口软件
接着烧录看串口信息
以上可以看出任务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 */
}
编译烧录到示波器中如下:
代码逻辑与示波器捕获到的时间一致,两个为互补信号
Github: