|
uC/OS-III 版本使用 v3.05.01
不知道在哪个地方可以设置软件定时器的时钟节拍 ??
//创建定时器
OSTmrCreate ((OS_TMR *)&TmrTouch,
(CPU_CHAR *)"TmrTouch",
(OS_TICK )0,
(OS_TICK )10, //周期重载值, 10ms,我需要一个10ms的定时时间,貌似这个时钟节拍为 100ms,但是使用 OSTimeDlyHMSM 这个时间又是准的,不知道是神马情况啊 ??
// 此处的值为1就是99ms,如果为10就是999ms,如果为100就是9999ms
(OS_OPT )OS_OPT_TMR_PERIODIC,
(OS_TMR_CALLBACK_PTR )TouchTmrCallback,
(void *)"Tmr Touch",
(OS_ERR *)&err);
系统 ucos systick设置
#define OS_CFG_TICK_RATE_HZ 200u // 此处改成100或者 1000 ,结果软件定时器也还是一样的,使用 OSTimeDlyHMSM 这个始终都是准确的
OS_RATE_HZ const OSCfg_TickRate_Hz = OS_CFG_TICK_RATE_HZ;
void BSP_OSTickInit (void)
{
CPU_INT32U cpu_clk_freq;
CPU_INT32U cnts;
cpu_clk_freq = HAL_RCC_GetSysClockFreq(); //BSP_ClkFreqGet(BSP_CLK_ID_HCLK); /* Determine SysTick reference freq. */
#if (OS_VERSION >= 30000u)
cnts = (cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz); /* Determine nbr SysTick increments */
#else
cnts = (cpu_clk_freq / (CPU_INT32U)OS_TICKS_PER_SEC); /* Determine nbr SysTick increments. */
#endif
OS_CPU_SysTickInit(cnts); /* Init uC/OS periodic time src (SysTick). */
}
void OS_CPU_SysTickInit (CPU_INT32U cpu_freq)
{
CPU_INT32U prio;
CPU_REG_NVIC_ST_RELOAD = cpu_freq - 1u;
/* Set SysTick handler prio. */
prio = CPU_REG_NVIC_SHPRI3;
prio &= 0x00FFFFFFu;
prio |= (OS_CPU_CFG_SYSTICK_PRIO << 24u);
CPU_REG_NVIC_SHPRI3 = prio;
/* Enable timer. */
CPU_REG_NVIC_ST_CTRL |= CPU_REG_NVIC_ST_CTRL_CLKSOURCE |
CPU_REG_NVIC_ST_CTRL_ENABLE;
/* Enable timer interrupt. */
CPU_REG_NVIC_ST_CTRL |= CPU_REG_NVIC_ST_CTRL_TICKINT;
} |
|