目录
一、STM32CubeMX安装
二、创建项目
三、开启时钟配置外设
3.1配置时钟
3.2配置USART1
3.3配置SYS
3.4freertos配置和任务添加
四、代码生成
4.1重写串口程序并通过软件调试进行测试
4.1调试程序
这是我第一次做开源项目,因为某些原因需要学习FreeRtos的知识,在自己学习的同时,也记录一下过程和开发的心得,读者共勉,有不足的地方希望大家可以指出来,相互学习。
要使用FreeRTOS当然可以通过移植源码,创建任务的方式去做,事在人为,我选择用CubeMX的原因还是觉得这个工具在初始化一些硬件和创建进程是比较便捷的,用起来也比较舒服。废话不多说,开始安装。
首先需要下载STM32CubeMX,下载的方式比较多,可以参考其他博主的博文。我这里直接用的是我一直用的,软件分享链接:http://链接:https://pan.baidu.com/s/1gU6ObwIAORT8t7Lmv12miA 提取码:0927
下载解压后可以看到有两个主要的,一个是java环境,没错cubemx是需要java环境的,自行安装即可,第三个就是CubeMX本体双击打开:
然后开始安装
然后等待安装完成后,双击打开:
点击HELP->manage mebedded...选择你所需要的芯片类型,后续如果需要添加芯片类型也可以在此处添加。
选择Start My project from mcu->ACCESS TO MCU SELECTOR 选择你需要使用的MCU类型
在Part number窗口搜索你所需要的MCU类型,然后再MCUs/MPUs List1处打开
等待新建完成,如下
Categories按照芯片的功能分类,可以选择你需要的功能。或者可以点击PinoutView中芯片的引脚去设置芯片的状态。在此之前,我的习惯是先设置Project manager里面的内容,在project目录配置生成工程的名称、代码路径、Toolchain。。路径等等。
在code Generator中选择Generate Peripheral initialization as .....将外设初始化生成为每个外设的一对 .c.h 文件.
因为我用的电路板是自己画的,所以为了节省成本等等一系列的问题,我选择了C8T6的48角MCU外接8MHz的晶振。通过选择RCC的HSE告诉时钟的外部时钟。开启MCU的时钟。
然后配置时钟,在ClockConfiguration里面配置APB1/APB2等外设的时钟,设置APB1为最大36MHz,APB2最大为72MHz。
开启串口USART1,用于调试时打印串口信息。
然后开启SYS的时钟,我选择的是TIM3,因为TIM2和TIM4用来捕获时钟等功能,不开启有警告发生,具体什么,感兴趣的可以试一下。
其实现在就可以生成HAL库去做裸机实验了,我要学习的是加上操作系统FreeRtos的配置主要目的是学习操作系统的生成和使用。所以,配置FreeRtos。
选择Freertos interface 的CMSIS_V1。接下来添加你需要的进程即可。在Configuration的Tasks and Queues中添加。
添加自己需要的进程,平衡车,第一需要的肯定是数据采集进程,根据上图的解释可以简单添加一下任务的名称、优先级、入库口函数、栈大小等。先使用默认即可,后面如若需要更大的栈也可回来自己修改。然后点击添加PID获取的进程。如下:
至此,配置就告一段落。点击右上角的GENRATE CODE即可生成代码。可能会有点慢,等他生成就可以用了。生成以后会弹出一个窗口,点击Open Project,就可以通过MDK打开。
编译完成后可以看到MX_FREERRTOS_Init()等一系列的初始化函数。
打开后该文件后可以看见创建的任务和两个任务具体要干的事情(需要自己去写)。
我们在配置好以后,就需要重写fputc函数,目的是通过Printf打印信息。代码如下。
//fputc重定义目的是为了使用printf通过串口打印出来
int fputc(int ch, FILE *fp)
{
while(!(USART1->SR & (1<<7)));
USART1->DR = ch;
return ch;
}
本质上也是调用DR寄存器,有个点需要注意,就是在使用FILE时要添加stdio.h的头文件。不然会unkown type name ’FILE'报错。
写好后在两个进程中分别添加打印信息,看看是否能正常运行到进程中。可以先通过软件测试的方式。代码如下:
/* USER CODE END Header_StartGetDataTask */
void StartGetDataTask(void const * argument)
{
/* USER CODE BEGIN StartGetDataTask */
/* Infinite loop */
for(;;)
{
osDelay(200);
printf("数据采集任务\r\n");
}
/* USER CODE END StartGetDataTask */
}
/* USER CODE BEGIN Header_Start_GetPIDTask */
/**
* @brief Function implementing the myTask_GetPID thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_Start_GetPIDTask */
void Start_GetPIDTask(void const * argument)
{
/* USER CODE BEGIN Start_GetPIDTask */
/* Infinite loop */
for(;;)
{
osDelay(200);
printf("PID采集任务\r\n");
}
/* USER CODE END Start_GetPIDTask */
}
也需要在该文件夹下添加stdio.h文件,不然会有隐式申明警告,然后编译。
然后配置魔术棒里面的软件调试先软件调试是否能打印。
要注意的是需要修改 Dialog DLL中的信息将DCM.DLL修改为DARMSTM.DLL,Parameter中的-pCM3修改为-pSTM32F103ZE即可。然后进行调试,在main函数里打断点。然后开启软件串口1
View->serail windos 选择UART#1
然后全速运行,观察是否有对应的信息
可以看到,进程执行是没有问题的,因为我的板子打样还没回来,所以烧录等一系列的实验后续再出,时间关系,就到这!!!欢迎各位大佬指出不足。