本文通过CubeMX配置F103RCT6的FreeRTOS和串口。
1 引入
拿到一个STM32控制器,在啥也没有的情况下从零开始写软件,博主习惯于先配置FreeRTOS操作系统和串口打印。本文就以博主在网上买的小车控制板为例,对其进行最基本的时钟及串口打印配置,并且写一些代码测试一下串口。
2 配置过程
2.1 配置时钟过程
1)首先,新建一个工程,选择MCU型号;
2)在弹出的型号面板中选择自己购买的开发板上的主芯片型号,这里博主是F103RCT6;
3)在SYS中配置Sys Debug方式为Serial wire,Timebase Source配置为Tim1;
4)开发板上的PD0和PD1接了8MHz的晶振,所以选择Crystal/Ceramic Resonator,即使用外部晶振作为HSE的时钟源。
5)时钟树配置如下图;
后续的外设会参考到这里的总线时钟。
2.2 配置FreeRTOS过程
1)在Middleware中选择FreeRTOS,
2)新建一个SerialTask任务,用于执行串口相关代码;
3)在Config Parameter中使能软件定时器;
接着新建一个20ms的软件定时器,设置好回调函数名称和周期调度。
2.3 配置串口过程
将串口配置为如下所示;
3 生成工程代码
1)配置生成代码的IDE为STM32CubeIDE;
2)生成代码配置;
这里博主勾选了只拷贝必要的库文件,以及生成独立的.c/.h文件,看个人习惯。
4 测试串口
1)点击右上角的Generate Code,并Open Projectp;参考网上其他博客,在uart.c中加上重定向函数,这样就可以用printf函数打印数据;
/* USER CODE BEGIN 1 */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart4,(uint8_t*)&ch, 1, 0xFFFF);
return ch;
}
/* USER CODE END 1 */
注意,该函数加在哪里都可以,并且如果是手写代码,最好加在 USER CODE BEGIN 1 这种注释之间,这样的话下次用CubeMX生成代码就不会被覆盖掉。
2)在MX_FREERTOS_Init函数中启动软件定时器
/* USER CODE BEGIN RTOS_TIMERS */
/* start timers, add new ones, ... */
osTimerStart(Timer20msHandle, 20);
/* USER CODE END RTOS_TIMERS */
3)在StartSerialTask函数中用串口发送,并进行2000ms延时;
/* USER CODE BEGIN Header_StartSerialTask */
/**
* @brief Function implementing the SerialTask thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartSerialTask */
void StartSerialTask(void const * argument)
{
/* USER CODE BEGIN StartSerialTask */
/* Infinite loop */
for(;;)
{
printf("int:%d\r\n",100U);
printf("float:%f\r\n",22.3F);
osDelay(2000);
}
/* USER CODE END StartSerialTask */
}
4)在工程配置中勾选下面两项,激活浮点数的打印功能;
6)编译软件,刷到开发板中,通过串口调试助手就可以看到打印的数据;
5 总结
本文记录了CubeMX配置FreeRTOS及串口打印的过程,这是玩转开发板的第一步。