本工程皆在快速体验FreeRTOS所有常用API,不深究概念。
硬件:STM32F103C8T6最小系统、OLED
软件:FreeRTOS、OLED驱动、UART驱动
工具:STM32CubeMX、Keil、串口助手
本部分代码下载链接:
https://wwzr.lanzout.com/iyUvV1l75bja 密码:dqbd
建议直接使用该工程进行后续学习。
该代码尽量做到最简,不添加多余的、不规范的代码。
选择外部时钟源。
设置外部晶振输入值,我这块板子是8M。
然后手动输入最大时钟频率,然后回车让他自动配置时钟树。我这块板子是72M。
另外,本实验使用了FreeRTOS,FreeRTOS的时基使用的是Systick,而STM32CubeMX中默认的HAL库时基也是Systick,为了避免可能的冲突,最好将HAL库的时基换做其它的硬件定时器:
这次用的外设有:LED、串口调试、OLED显示。
配置板子LED引脚,推挽输出模式。我这块板子是 PC13。
使用串口1,波特率默认,异步通信。
OLED屏幕使用I2C1通道,I2C1使用PB6、PB7作为SCL、SDA引脚,配置如下:
STM32CubeMX已经将FreeRTOS集成到工具中,并且将RTOS的接口进行了封装CMSIS-RTOS V1/V2,相较之于V1版本的CMSIS-RTOS API,V2版本的API的兼容性更高,为了将来的开发和移 植,建议开发者使用V2版本的API:
选择CMSIS V2接口后,还要进一步配置FreeRTOS的参数和功能。
FreeRTOS的参数包括时基频率、任务堆栈大小、是否使能互斥锁等等,需要开发者根据自己对FreeRTOS的了解以及项目开发的需求,来定制参数。
使用默认参数不需要修改:
使用STM32CubeMX,可以手工添加任务、队列、信号量、互斥锁、定时器等等。但是本课程不想严重依赖STM32CubeMX,所以不会使用STM32CubeMX来添加这些对象,而是手写代码来使用这些对象。
使用STM32CubeMX时,有一个默认任务,此任务无法删除,只能修改其名称和函数类型,如下图所示:
使用默认参数不需要修改:
点击生成代码
打开keil工程
选择下载器类型,我用的是DAP。点击后面的Setting。
进入后勾选自动复位,表现为每次下载程序后单片机自动复位运行程序。
设置完点击OK。
因为要使用printf
,勾选:
STM32CubeMX只是帮我们初始化了所配置的硬件模块,你要实现什么功能,需要自己添加代码。
添加MCU-F103等用户自己的代码,包含LED、UART、OLED驱动等。
修改 默认任务 的代码为下图,用于测试LED、UART、OLED程序。