#include "FreeRTOS.h" #include "task.h" #include "main.h" #include "cmsis_os.h" #include "tim.h" extern void delay_us(uint16_t nus); // HAL_RCC_GetSysClockFreq(void) typedef enum{ DELAY_DEFAULT, DELAY_SYSTICK, DELAY_SYSTICK_COMPLEX, DELAY_TIMER, }DELAY_US_TypeDef; // SystemCoreClock TIM_HandleTypeDef *Delay_TIM_hanle = NULL; #define DELAY_US_TYPE DELAY_DEFAULT void delay_us(uint16_t nus) { #if DELAY_US_TYPE == DELAY_DEFAULT uint32_t cnt = nus * (SystemCoreClock/8000000); while(cnt--); #endif #if DELAY_US_TYPE == DELAY_TIMER __HAL_TIM_SET_COUNTER(&htim10, 0); // set the counter value a 0 __HAL_TIM_ENABLE(&htim10); // start the counter // wait for the counter to reach the us input in the parameter while (__HAL_TIM_GET_COUNTER(&htim10) < nus); __HAL_TIM_DISABLE(&htim10); // stop the counter #endif #if DELAY_US_TYPE == DELAY_SYSTICK SysTick->LOAD = (nus * (SystemCoreClock/8000000))-1; SysTick->VAL = 0; SysTick->CTRL = 0; SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; #endif #if DELAY_US_TYPE == DELAY_SYSTICK_COMPLEX // 暂停系统,实现微秒延时 // 保存sysTick的状态 uint32_t val_temp=SysTick->VAL; uint32_t load_temp=SysTick->LOAD; uint16_t ctrl_temp=SysTick->CTRL; /*SysTick状态重新设置,用于延时(系统暂停)*/ // SysTick->LOAD = 9 * us; // 设置定时器重装值,72MHz 8分频后9HMz,即一微秒记9个数 SysTick->LOAD = (nus * HAL_RCC_GetSysClockFreq()/1000000) - 1; // 设置定时器重装值,168MHz 8分频后21HMz,即一微秒记21个数 SysTick->VAL = 0x00; // 清空当前计数值,清空后会自动装入重载值 SysTick->CTRL = 0x00000001; // 位2设置为0,8分频,启动定时器 while (!(SysTick->CTRL & 0x00010000));// 等待计数到0 /*延时结束后恢复之前的状态,系统继续运行*/ SysTick->LOAD = load_temp; SysTick->VAL = val_temp; SysTick->CTRL = ctrl_temp; //SysTick->CTRL = 0x00000000; // 关闭定时器 #endif } // #if DELAY_US_TYPE == DELAY_TIMER // void delay_us(uint16_t nus) // { // __HAL_TIM_SET_COUNTER(&htim10, 0); // set the counter value a 0 // __HAL_TIM_ENABLE(&htim10); // start the counter // // wait for the counter to reach the us input in the parameter // while (__HAL_TIM_GET_COUNTER(&htim10) < nus); // __HAL_TIM_DISABLE(&htim10); // stop the counter // } // #endif // #if DELAY_US_TYPE == DELAY_SYSTICK_COMPLEX // void delay_us(uint16_t nus) // { // // // 暂停系统,实现微秒延时 // // // 保存sysTick的状态 // // uint32_t val_temp=SysTick->VAL; // // uint32_t load_temp=SysTick->LOAD; // // uint16_t ctrl_temp=SysTick->CTRL; // // /*SysTick状态重新设置,用于延时(系统暂停)*/ // // SysTick->LOAD = 9 * us; // 设置定时器重装值,72MHz 8分频后9HMz,即一微秒记9个数 // // SysTick->VAL = 0x00; // 清空当前计数值,清空后会自动装入重载值 // // SysTick->CTRL = 0x00000001; // 位2设置为0,8分频,启动定时器 // // while (!(SysTick->CTRL & 0x00010000));// 等待计数到0 // // /*延时结束后恢复之前的状态,系统继续运行*/ // // SysTick->LOAD = load_temp; // // SysTick->VAL = val_temp; // // SysTick->CTRL = ctrl_temp; // // //SysTick->CTRL = 0x00000000; // 关闭定时器 // } // #endif // #if DELAY_US_TYPE == DELAY_TIMER // void delay_us(uint16_t nus) // { // // // 暂停系统,实现微秒延时 // // // 保存sysTick的状态 // // uint32_t val_temp=SysTick->VAL; // // uint32_t load_temp=SysTick->LOAD; // // uint16_t ctrl_temp=SysTick->CTRL; // // /*SysTick状态重新设置,用于延时(系统暂停)*/ // // SysTick->LOAD = 9 * us; // 设置定时器重装值,72MHz 8分频后9HMz,即一微秒记9个数 // // SysTick->VAL = 0x00; // 清空当前计数值,清空后会自动装入重载值 // // SysTick->CTRL = 0x00000001; // 位2设置为0,8分频,启动定时器 // // while (!(SysTick->CTRL & 0x00010000));// 等待计数到0 // // /*延时结束后恢复之前的状态,系统继续运行*/ // // SysTick->LOAD = load_temp; // // SysTick->VAL = val_temp; // // SysTick->CTRL = ctrl_temp; // // //SysTick->CTRL = 0x00000000; // 关闭定时器 // } // #endif