uc/os3多任务与实时日历
嵌入式第12周作业
1. (简答题)
1. 学习嵌入式实时操作系统(RTOS),以uc/OS为例,将其移植到stm32F103上,构建至少3个任务(task):其中两个task分别以1s和3s周期对LED等进行点亮-熄灭的控制;另外一个task以2s周期通过串口发送“hello uc/OS! 欢迎来到RTOS多任务环境!”。记录详细的移植过程。
参考:
1) STM32F103C8T6移植uC/OS-III基于HAL库超完整详细过程
2) STM32F103C8移植uCOSIII(HAL库)
3) STM32F103C8T6移植uCOS基于HAL库
2. 了解实时时钟RTC的原理。STM32芯片自带RTC,因此不须像其他MCU需外接RTC模块。请编程实现STM32的日历读取、设置和输出。要求:
1)读取RTC初始时间,验证是否为 1970年1月1日零分零秒;
2)将RTC时间调整为当前时间,并以 2021年x月x日x分x秒的格式从串口输出(或输出到OLED屏),每1s改变一次;
3)如果输出内容中需加入“星期x”,请修改代码。
参考:
[STM32系列]HAL库STM32CubeMX教程十三—RTC时钟
【STM32】HAL库 STM32CubeMX教程十三—RTC时钟
3. 在上述实验中,在掌握Keil的仿真调试代码功能之外,也学习使用仪器对代码运行进行故障排查和功能调测。
1) 练习使用示波器去观察LED输出电平和串口通信的波形,分析故障;
2) 分别使用Keil虚拟仿真逻辑仪和 真实逻辑仪(SaleaeLogic16)抓取LED输出电平和串口通信的波形,进行协议分析。
目录
一、将uc/OS移植到stm32F103上
1.建立HAL库
-
建立工程
-
选择芯片
-
配置RCC
-
配置SYS
-
配置系统时钟为72M
-
将与LED相连的端口PC13配置为GPIO_Output
-
设置串口USART1
-
Project
-
勾选
-
Open Project
-
在main函数下的while中添加
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
HAL_Delay(500);
- 编译并烧录看到灯闪烁。
2.移植
1.准备
-
ucosIII源码
官网http://micrium.com/downloadcenter/
-
新建uC-BSP和uC-CONFIG文件夹
-
为uC-BSP文件夹新建bsp.c和bsp.h文件
-
将uCOS相关文件复制到HAL工程的MDK-ARM文件夹下
-
将uCOS文件添加到项目
2.移植
- 导入文件路径
-
CPU-Add 选择uC-CPU下的
RealView下的
-
LIB-Add uC-LIB下的
RealView下的
-
PORT-Add RealView下的
-
SOURCE-Add Source下的
-
CONFIG-Add uc-CONFIG下的
-
BSP-Add uc-BSP下的
-
在path中添加
-
将启动文件的PendSV_Handler和Systick_Handler改为
OS_CPU_PendSVHandler
和OS_CPU_SysTickHandler
-
app_cfg.h
#define APP_CFG_SERIAL_EN DEF_ENABLED 改为#define APP_CFG_SERIAL_EN DEF_DISABLED
#define APP_TRACE BSP_Ser_Printf 改为
#define APP_TRACE (void)
-
includes.h
在#include <bsp.h> 后面加上
#include “gpio.h”
#include “app_cfg.h”
将#include <stm32f10x_lib.h> 改为
#include “stm32f1xx_hal.h”
-
lib_cfg.h
#define LIB_MEM_CFG_HEAP_SIZE 5u * 1024u改为
#define LIB_MEM_CFG_HEAP_SIZE 5u * 1024u
-
bsp.c代码
// bsp.c
#include "includes.h"
#define DWT_CR *(CPU_REG32 *)0xE0001000
#define DWT_CYCCNT *(CPU_REG32 *)0xE0001004
#define DEM_CR *(CPU_REG32 *)0xE000EDFC
#define DBGMCU_CR *(CPU_REG32 *)0xE0042004
#define DEM_CR_TRCENA (1 << 24)
#define DWT_CR_CYCCNTENA (1 << 0)
CPU_INT32U BSP_CPU_ClkFreq (void)
{
return HAL_RCC_GetHCLKFreq();
}
void BSP_Tick_Init(void)
{
CPU_INT32U cpu_clk_freq;
CPU_INT32U cnts;
cpu_clk_freq = BSP_CPU_ClkFreq();
#if(OS_VERSION>=3000u)
cnts = cpu_clk_freq/(CPU_INT32U)OSCfg_TickRate_Hz;
#else
cnts = cpu_clk_freq/(CPU_INT32U)OS_TICKS_PER_SEC;
#endif
OS_CPU_SysTickInit(cnts);