Delay_us函数使用STM32定时器2实现
- #include "timer.h"
- /* SystemFrequency / 1000 1ms中断一次
- * SystemFrequency / 100000 10us中断一次
- * SystemFrequency / 1000000 1us中断一次
- */
- #define SYSTICKPERIOD 0.000001
- #define SYSTICKFREQUENCY (1/SYSTICKPERIOD)
- /**
- * [url=home.php?mod=space&uid=247401]@brief[/url] 定时器2的初始化,,定时周期1uS
- * @param 无
- * @retval 无
- */
- void TIM2_Init(void)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- /*AHB = 72MHz,RCC_CFGR的PPRE1 = 2,所以APB1 = 36MHz,TIM2CLK = APB1*2 = 72MHz */
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
-
- /* Time base configuration */
- TIM_TimeBaseStructure.TIM_Period = SystemCoreClock/SYSTICKFREQUENCY -1;
- TIM_TimeBaseStructure.TIM_Prescaler = 0;
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
-
- TIM_ARRPreloadConfig(TIM2, ENABLE);
-
- /* 设置更新请求源只在计数器上溢或下溢时产生中断 */
- TIM_UpdateRequestConfig(TIM2,TIM_UpdateSource_Global);
- TIM_ClearFlag(TIM2, TIM_FLAG_Update);
- }
- /**
- * @brief us延时程序,10us为一个单位
- * @param
- * [url=home.php?mod=space&uid=2817080]@ARG[/url] nTime: Delay_us( 10 ) 则实现的延时为 10 * 1us = 10us
- * @retval 无
- */
- void Delay_us(__IO uint32_t nTime)
- {
- /* 清零计数器并使能滴答定时器 */
- TIM2->CNT = 0;
- TIM_Cmd(TIM2, ENABLE);
- for( ; nTime > 0 ; nTime--)
- {
- /* 等待一个延时单位的结束 */
- while(TIM_GetFlagStatus(TIM2, TIM_FLAG_Update) != SET);
- TIM_ClearFlag(TIM2, TIM_FLAG_Update);
- }
- TIM_Cmd(TIM2, DISABLE);
- }
|