前言
(1)FreeRTOS是我一天过完的,由此回忆并且记录一下。个人认为,如果只是入门,利用STM32CubeMX是一个非常好的选择。学习完本系列课程之后,再去学习网上的一些其他课程也许会简单很多。
(2)本系列课程是使用的keil软件仿真平台,所以对于没有开发板的同学也可也进行学习。
(3)叠甲,再次强调,本系列课程仅仅用于入门。学习完之后建议还要再去寻找其他课程加深理解。
STM32CubeMX操作
创建工程
(1)创建一个一个STM32F103标准工程。
配置RCC
(1)一般的STM32F103开发板都是有一个8MHZ的高速外部晶振,所以我们需要使能Crystal/Ceramic Resonator,让STM32F103性能达到最佳状态。
配置SYS
(1)
Debug
这个一定要记得配置,不然你的芯片只能烧录一次程序,之后就变砖头了(哭笑)。
<1>Debug
一般我们都是选则的Serial Wire
,因为这样只需要占用SWDIO
和SWCLK
引脚。其他几种Debug模式占用引脚太多,就不选择了。
<2>如果实在是忘记配置Debug
了,就让开发板上的boot0和boot1都接高电平,进入内置SRAM启动模式,重新烧录程序。然后再让开发板上的boot0和boot1都接低电平,进入主闪存存储器模式。
(2)Timebase Source
是HAL时基配置,如果是裸机就默认SysTick
,但是FreeRTOS
会占用SysTick
,所以这里随便选一个定时器TIM4。如下为详细解释:
<1>裸机运行时只需要维护一个时基就可以了,也就是HAL时基。在加上操作系统时我们需要提供第二个时基来保证操作系统同时运行,也就是OS时基。
<2>在裸机中SYS一般默认使用SysTick
滴答定时器作为HAL时基。但是开启FreeRTOS
后,FreeRTOS
会占用SysTick
(用来生成1ms
定时,用于任务调度),所以需要其他总线提供另外的时钟源。
<3>听完上面的,你是不是懵逼了。哈哈哈哈,这堆术语一下来,大部分都得懵逼,最多是一知半解不懂装懂。首先,我们我们来讲讲HAL时基是什么。
<4>在裸机开发中,我们延时函数有两种写法,第一种是软件延时,让CPU执行无效语句进行空转。第二种就是利用硬件定时器延时。软件延时效果并不精准,所以大多数时候,我们都是使用硬件定时器延时。因为M3
内核的芯片自带了一个SysTick
滴答定时器,所以很多时候我们都用SysTick
作为硬件定时器延时,也就是HAL时基。讲完这些,一定还有同学依旧懵逼,能不能来点实例呢?
<5>实例来了,当我们使用HAL_Delay()
函数的时候,他底层就是调用的HAL时基单元。如果是裸机程序,那么就是默认的SysTick
。
<6>现在我们知道了HAL时基本质就是给一些时间有关的函数提供时间的功能,那么OS时基又是什么呢?这个时候我就推荐你看一下嵌入式裸机设计思想——时间片轮裸机开发架构+状态机+定时器调度机制这篇博客的时间片轮裸机开发架构部分。这个就是一个操作系统的雏形,这篇博客的OS时基就是SysTick
。如果看不懂就记住吧,代码都摆出来的,还不理解,就是基础问题了。我不想过多赘述。
(3)STM32F103的最佳工作频率是72MHZ,所以我们选择72MHZ。
配置FreeRTOS
(1)
FreeRTOS
版本问题:STM32CubeMX
已经将FreeRTOS
集成到工具中,并且将RTOS
的接口进行了封装CMSISRTOS V1/V2
。V2
的内核版本更高,功能更多,在大多数情况下V1
版本的内核完全够用。但是V2
版本的API
的兼容性更高,为了将来的开发和移植,建议开发者使用V2
版本的API
。
配置GPIO
(1)为了方便验证我们的程序是否好了,所以我们让一个PC13做输出口用于检测程序。
生成工程
(1)按照下图步骤,生成工程,并且打开工程即可。
keil中进行的配置
编写程序
(1)在
freertos.c
中的StartDefaultTask
函数加入如下代码。
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
for(;;)
{
// osDelay(1);
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
HAL_Delay(100);
}
/* USER CODE END StartDefaultTask */
}
配置keil仿真器
(1)配置部分建议直接复制粘贴我的,一旦写错了,会有问题。
DARMSTM.DLL
pSTM32F103C8
测试结果
(1)打开调试界面
(2)选择逻辑分析仪,检测
PC13
引脚。为什么下面输入的是PORTC.13
,原因很简单,格式为PORTx.y
,x表示端口,y表示具有引脚数值,注意’.'必须是英文的!
(3)开始仿真,发现逻辑分析仪上有方波。
参考
(1)STM32CubeMX环境安装(保姆级);
(2)STM32CubeMX新建工程并点亮一个LED;
(3)STM32滴答定时器SysTick精准延时,兼容HAL库和标准库;
(4)嵌入式裸机设计思想——时间片轮裸机开发架构+状态机+定时器调度机制;