uc/OS系统移植并观察波形

本文介绍了如何在STM32F103C8单片机上移植uc/OS-III操作系统,并通过逻辑分析仪观察波形。首先,使用CubeMX创建工程并配置RCC、SYS、管脚和USART。然后,从百度网盘下载uc/OS源码,导入工程,修改bsp.c、bsp.h和main.c等文件。接着,实现了三个任务,其中两个任务周期性控制LED灯,另一个任务通过串口发送信息。通过keil仿真和逻辑分析仪观察,验证了任务执行和串口通信的正确性。
摘要由CSDN通过智能技术生成

一、CubeMX创建工程

选择STM32F103C8芯片
在这里插入图片描述
配置RCC
在这里插入图片描述
配置SYS
在这里插入图片描述
配置管脚
PC13设置成GPIO_Output用于点亮LED灯
在这里插入图片描述
配置USART
在这里插入图片描述
设置工程
在这里插入图片描述
在这里插入图片描述
GENERATE CODE导出工程
在这里插入图片描述
打开KEIL工程,在main函数的while循环中添加以下代码

while (1)
  {
   
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		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);
  }
  /* USER CODE END 3 */

在这里插入图片描述
编译运行生成.hex文件,烧录进芯片,PC13管脚LED灯闪烁,证明代码没有问题
在这里插入图片描述

二、uc/OS-III源码及文件准备

百度网盘下载:https://pan.baidu.com/s/10RqsDRecbmVteWmDv2oUNQ
提取码:1234

打开文件夹如图
在这里插入图片描述
uC-BSP文件夹下应该有bsp.c和bsp.h两个空文件
在这里插入图片描述
将以下路径中的8个文件复制到uC-CONFIG文件夹中替换原有文件
在这里插入图片描述
在这里插入图片描述
将以下五个文件夹复制到CubeMX工程的MDK-ARM文件夹下
在这里插入图片描述
在这里插入图片描述

三、系统移植

(一)新建文件夹并添加文件

打开keil工程,为项目新建以下6个文件夹
在这里插入图片描述
分别在每个文件夹中添加以下文件
CPU
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
LIB
在这里插入图片描述
在这里插入图片描述
PORT
在这里插入图片描述
SOURCE
在这里插入图片描述
CONFIG
在这里插入图片描述
BSP
在这里插入图片描述
最后记得点击OK
在这里插入图片描述
此时项目结构发生了改变
在这里插入图片描述

(二)导入文件路径

在这里插入图片描述
在这里插入图片描述
分别选中这几个文件夹
在这里插入图片描述

(三)为bsp.c和bsp.h添加代码

bsp.h

// bsp.h
#ifndef  __BSP_H__
#define  __BSP_H__

#include "stm32f1xx_hal.h"

void BSP_Init(void);

#endif

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);
}



void BSP_Init(void)
{
   
	BSP_Tick_Init();
	MX_GPIO_Init();
}


#if (CPU_CFG_TS_TMR_EN == DEF_ENABLED)
void  CPU_TS_TmrInit (void)
{
   
    CPU_INT32U  cpu_clk_freq_hz;


    DEM_CR         |= (CPU_INT32U)DEM_CR_TRCENA;                /* Enable Cortex-M3's DWT CYCCNT reg.                   */
    DWT_CYCCNT      = (CPU_INT32U)0u;
    DWT_CR         |= (CPU_INT32U)DWT_CR_CYCCNTENA;

    cpu_clk_freq_hz = BSP_CPU_ClkFreq();
    CPU_TS_TmrFreqSet(cpu_clk_freq_hz);
}
#endif


#if (CPU_CFG_TS_TMR_EN == DEF_ENABLED)
CPU_TS_TMR  CPU_TS_TmrRd (void)
{
   
    return ((CPU_TS_TMR)DWT_CYCCNT);
}
#endif


#if (CPU_CFG_TS_32_EN == DEF_ENABLED)
CPU_INT64U  CPU_TS32_to_uSec (CPU_TS32  ts_cnts)
{
   
	CPU_INT64U  ts_us;
  CPU_INT64U  fclk_freq;

 
  fclk_freq = BSP_CPU_ClkFreq();
  ts_us     = ts_cnts / (fclk_freq / DEF_TIME_NBR_uS_PER_SEC);

  return (ts_us);
}
#endif
 
 
#if (CPU_CFG_TS_64_EN == DEF_ENABLED)
CPU_INT64U  CPU_TS64_to_uSec (CPU_TS64  ts_cnts)
{
   
	CPU_INT64U  ts_us;
	CPU_INT64U  fclk_freq;


  fclk_freq = BSP_CPU_ClkFreq();
  ts_us     = ts_cnts / (fclk_freq / DEF_TIME_NBR_uS_PER_SEC);
	
  return (ts_us);
}
#endif

(四)修改main.c代码

/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "gpio.h"
#include "usart.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <includes.h>
#include "stm32f1xx_hal.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* 任务优先级 */
#define START_TASK_PRIO		3
#define LED0_TASK_PRIO		4
#define MSG_TASK_PRIO		5

/* 任务堆栈大小	*/
#define START_STK_SIZE 		64
#define LED0_STK_SIZE 		64
#define MSG_STK_SIZE 		64//任务堆大小过大会报错,可以试着改小一点

/* 任务栈 */	
CPU_STK START_TASK_STK[START_STK_SIZE];
CPU_STK LED0_TASK_STK[LED0_STK_SIZE];
CPU_STK MSG_TASK_STK
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值