添加BSP文件
新建BSP.h文件,内容如下
#ifndef _BSP_H_
#define _BSP_H_
#include <stdarg.h>
#include <stdio.h>
#include <cpu.h>
#include <cpu_core.h>
#include <lib_ascii.h>
#include <lib_def.h>
#include <lib_mem.h>
#include <lib_str.h>
#include <stm32f10x.h>
#include <app_cfg.h>
void BSP_Init (void);
void BSP_IntDisAll (void);
CPU_INT32U BSP_CPU_ClkFreq (void);
#endif
新建BSP.c文件,内容如下
/* Includes ------------------------------------------------------------------*/
#include "BSP.h"
/* Private define ------------------------------------------------------------*/
#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)
/* Periph functions ---------------------------------------------------------*/
void SysTick_Configuration(void);
void BSP_Init(void)
{
/* Configure the SysTick to generate an interrupt each 1 millisecond */
SysTick_Configuration();
}
void BSP_IntDisAll (void)
{
CPU_IntDis();
}
CPU_INT32U BSP_CPU_ClkFreq (void)
{
RCC_ClocksTypeDef rcc_clocks;
RCC_GetClocksFreq(&rcc_clocks);
return ((CPU_INT32U)rcc_clocks.HCLK_Frequency);
}
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);
}
CPU_TS_TMR CPU_TS_TmrRd (void)
{
return ((CPU_TS_TMR)DWT_CYCCNT);
}
/**
* @brief Configures the SysTick to generate an interrupt each 1 ms.
* @param None
* @retval None
*/
void SysTick_Configuration(void)
{
/* SysTick interrupt each 1 ms with SysTick Clock equal to (HCLK/8) */
if (SysTick_Config(SystemCoreClock / 1000))
{
/* Capture error */
while (1);
}
}
可在User文件夹下新建BSP文件夹,把这两个文件放进去。上一篇工程设置里已经把BSP路径包含进来了。
打开includes.h文件,去掉64和65行,改为#include <bsp.h>。
现在再次编译一遍,应该可以通过了。
运行uCOS
修改μCOS-III\uC-CPU\Cfg\cpu_cfg.h
第135行:#if 1改为#if 0,表示不测量关中断时间。
修改μCOS-III\uCOS-III\Cfg\os_cfg.h
第42行:#define OS_CFG_ISR_POST_DEFERRED_EN 0u,表示关闭中断延迟提交
第44行:#define OS_CFG_TS_EN 1u改为0u,表示不时间采样
第50行:#define OS_CFG_SCHED_LOCK_TIME_MEAS_EN 1u改为0u,表示不测量任务调度时间
第63行:#define OS_CFG_MEM_EN 1u改为0u,表示不使用内存管理(后面将介绍一个更好的内存池)
第76行:#define OS_CFG_Q_PEND_ABORT_EN 1u改为0u
第82行:#define OS_CFG_SEM_PEND_ABORT_EN 1u改为0u
第87行:#define OS_CFG_STAT_TASK_EN 1u改为0u,表示不创建统计任务
第96行:#define OS_CFG_TASK_SEM_PEND_ABORT_EN 1u改为0u
官方手册中有这样说明
“最低程度, uC/OS-III须创建空闲任务OS_IdleTask(),当没有其他任务运行时就运行空闲任务。uC/OS-III也创建时基任务。 根据配置文件中所配置的,uC/OS-III 会创建统计任务 OS_StatTask()、定时器任务OS_TmrTask()、中断队列处理任务OS_IntQTask()。”
这里我们取消了OS_StatTask()和OS_IntQTask(),分别由OS_CFG_STAT_TASK_EN和OS_CFG_ISR_POST_DEFERRED_EN决定,所以系统运行起来后,最少有四个任务(外加创建任务的任务)在运行。
关于如何将uCos时基与STM32硬件时钟绑定,有两种方式:一种是修改startup_stm32f10x_md.s文件中的PendSV_Handler为OS_CPU_PendSVHandler,SysTick_Handler为OS_CPU_SysTickHandler;另外一种是修改uCOS-III\Ports下的os_cpu.h、os_cpu_a.asm和os_cpu_c.c中的OS_CPU_PendSVHandler为PendSVHandler、OS_CPU_SysTickHandler为SysTickHandler,并去掉PendSV_Handler和SysTick_Handler在stm32f10x_it中的声明和定义。
这里我觉得采用第二种比较合适。
在app.c中的142行处设置断点,启动程序,怎么样,是不是每隔200毫秒break一次呢。