一、实验内容
涉及硬件:DShanMCU-F103开发板(STM32F103C8T6、OLED屏幕)
涉及软件:STM32CubeMX、Keilv5、
实现功能:同时实现板上LED灯的闪烁和OLED屏幕显示
二、操作过程
1.使用STM32CubeMX创建模组驱动文件
在STM32CubeMX选择STM32F103C8T6芯片
来到新工程界面,始时钟是操作系统的核心部分,控制着任务的调度和时间管理,先配置时钟。在system core中选定RCC勾选高速外部时钟源晶振
设置MCU最高时钟频率72MHz
2.配置FreeRTOS
在中间件选项中选择FreeRTOS,应用CMSIS_V2,参数配置方面先用的默认
3.创建新工程
选择好芯片、配置好FreeRTOS参数接下来创建新工程,在project manager设置好,点击create code
4.功能实现的代码编译
a)板上LED灯的闪烁
通过电路原理图,板上LED灯由PC13控制,将这个端口设置成GPIO输出口:GPIO_OUTPUT,再次点击生成代码
用keil打开CubeMX生成的工程文件,将相关的包括.c 和.h的LED的驱动代码添加入工程中,还要将驱动文件所在地址加入工程的目录当中防止编译器找不到文件
在freertos.c文件中,有一段创建工程时的一个默认任务,现在在里面进行功能实现的代码编写
void Led_Test(void)
{
Led_Init();
while (1)
{
Led_Control(LED_GREEN, 1);
mdelay(500);
Led_Control(LED_GREEN, 0);
mdelay(500);
}
}
最终实现板上LED闪烁
b)OLED显示内容
OLED屏幕使用I2C1通道,具体使用PB6、PB7分别作为SCL、SDA引脚,接下来在CubeMX进行配置,都使用默认参数,生成代码
相同地添加LCD相关驱动文件和字库文件ascii_font.c,这个文件只加入工程路径而不加入工程也可以
void LCD_Test(void)
{
OLED_Test();
}
void OLED_Test(void)
{
OLED_Init();
// 清屏
OLED_Clear();
while (1)
{
// 在第0列第2页打印一个字符串"Hello World!"
OLED_PrintString(0, 2, "Hello World!");
}
}
最终实现oled屏幕显示 Hello World! 。
5.创建多任务程序
上面已经分别实现板上LED等的闪烁和OLED屏幕的显示,现在要将两个死循环同时实现,就必须使用RTOS多任务系统。在刚刚,已经在默认任务void StartDefaultTask(void *argument)中实现OLED屏幕的测试,现在添加新的函数用来实现LED闪烁
void MyTask(void *argument){
while(1){
Led_Test();
}
}
然后创建一个新的任务
xTaskCreate(MyTask, "mytask", 128, NULL, osPriorityNormal, NULL);
各参数说明:
BaseType_t xTaskCreate(
TaskFunction_tp vTaskCode,
const char * constpcName,
unsigned short usStackDepth,
void *pvParameters,
UBaseType_t uxPriority,
TaskHandle_t *pvCreatedTask
);
最后经过整合,在默认任务void StartDefaultTask(void *argument)中实现OLED屏幕的测试,在新创建的任务MyTask()实现了LED灯的闪烁。