啰嗦两句背景
由于公司里嵌入式设备功能复杂度逐渐增加,原有的裸机堆砌出的程序已经变成了一个无法修改的怪物,就像叠叠高(经典的桌面游戏,就是木条摞在一起,一根一根抽出来的游戏)走到了最后的阶段,谁也不敢对这堆处在微妙平衡中木条有任何的冒犯,只能说一句:对不起,打扰了…
遂起了重构的想法,经过一轮嵌入式系统的筛选,最后选定了FreeRTOS,因为它的商用上没有啥限制,而且又发现了STM32CubeMX这种傻瓜式的神器竟然能够直接生成代码,于是就愉快地开始了FreeRTOS的入坑之路。
环境配置
之前一直用的是Keil4,这里尝试了一下,发现CubeMX生成的代码好像无法读取,简单查了一下资料好像需要Keil5才能打开,果断直接升级。
安装keil5时遇到的小问题
基本和安装keil4的流程一样,只有一点需要注意一下,keil5的版本最好选择5.24之后的版本,否则使用最新的pack有可能会造成程序打开的时候报错
File : H:\Keil_v5\ARM\PACK\Keil\STM32F0xx_DFP\2.0.0\Keil.STM32F0xx_DFP.pdsc
Sequence : CheckID
Context : Item #1: <control if="jep106id != 0x20">
Item #0: <block>::Line 2
Expression : " Message(2, "Not a genuine ST Device! Abort connection.");"
----------------------------^
E203 : Undefined identifier - function 'Message'
具体解决方案在这:https://blog.csdn.net/u012849371/article/details/85195280
小福利:很多人的keil只激活到2020年,分享一个能到2032年的Keygen
使用STM32CubeMX生成模板
傻瓜式神器,哪里需要勾哪里,让我这个初级程序员感动的无以复加,妈妈再也不用担心我搭建新工程了。
大家还没有感受过的自行体会吧。
勾选FreeRTOS选项
正式进入FreeRTOS
第一步 hello world!
按照惯例先打印个helloworld来试试。
【1】CubeMx中勾选USART1并添加发送DMA,使能中断;生成代码;
有一点要注意的地方:再生成代码之前可以选择使用HAL或者LL库,这里选择的是LL库,原因是LL库更像之前的标准库,没有像HAL库一样把很多的实现和检查写入库函数中,整体的执行效率相对较高,对RAM/ROM的占用也比较小。
【2】打开工程,添加用户代码;
void MX_USART1_UART_Init(void)
{
LL_USART_InitTypeDef USART_InitStruct = {
0};
LL_GPIO_InitTypeDef GPIO_InitStruct = {
0};
/* Peripheral clock enable */
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1);
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);
/**USART1 GPIO Configuration
PA9 ------> USART1_TX
PA10 ------> USART1_RX
*/
GPIO_InitStruct.Pin = LL_GPIO_PIN_9;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LL_GPIO_PI