void Timer2_Initialization(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); NVIC_InitTypeDef NVIC_InitStructure; /* Enable the TIM5 global Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* -- Timer Configuration --------------------------------------------------- */ TIM_DeInit(TIM2); TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct; TIM_TimeBaseStruct.TIM_Period = 2500; //250ms --> 4Hz TIM_TimeBaseStruct.TIM_Prescaler = 90 - 1; // Prescaled by 900 -> = 0.1M(10us) TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1; // Div by one -> 90 MHz (Now RCC_DCKCFGR_TIMPRE is configured to divide clock by two) TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStruct); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // Set interrupt when timer reloads (overflow) TIM_ARRPreloadConfig(TIM2, DISABLE); //Put ARR value into register TIM_Cmd(TIM2, ENABLE); }
void Timer(uint32_t period){ TIM_MATCHCFG_Type matchcfg; matchcfg.MatchChannel = 0; matchcfg.IntOnMatch = ENABLE; matchcfg.ResetOnMatch = DISABLE; matchcfg.StopOnMatch = DISABLE; matchcfg.MatchValue = period; matchcfg.ExtMatchOutputType = TIM_EXTMATCH_NOTHING; TIM_TIMERCFG_Type timercfg; timercfg.PrescaleOption = TIM_PRESCALE_USVAL; timercfg.PrescaleValue = 1; TIM_Init(LPC_TIM0, TIM_TIMER_MODE, &timercfg); TIM_ConfigMatch(LPC_TIM0, &matchcfg); tim0_flag = 0; NVIC_SetPriority(TIMER0_IRQn, ((0x01<<3)|0x01)); NVIC_EnableIRQ(TIMER0_IRQn); TIM_Cmd(LPC_TIM0, ENABLE); while(!tim0_flag); TIM_DeInit(LPC_TIM0); NVIC_DisableIRQ(TIMER0_IRQn); }
/** * Initialize a timer, and reset its register map. * @param dev Timer to initialize */ void timer_reset(timer_dev *dev) { if (dev->regs == TIM1 || dev->regs == TIM8 || dev->regs == TIM9 || dev->regs == TIM10 || dev->regs == TIM11) RCC_APB2PeriphClockCmd(dev->clk, ENABLE); else RCC_APB1PeriphClockCmd(dev->clk, ENABLE); TIM_DeInit(dev->regs); }
void F4Timer::set_period(uint32_t period) { if(TIM1==TIMx) RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); if(TIM2==TIMx) RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); if(TIM3==TIMx) RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); if(TIM4==TIMx) RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); if(TIM5==TIMx) RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE); if(TIM6==TIMx) RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE); TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_DeInit(TIMx); TIM_InternalClockConfig(TIMx); TIM_TimeBaseStructure.TIM_Prescaler=167;//1Mhz 1us 65536 TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period=period; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0; TIM_TimeBaseInit(TIMx,&TIM_TimeBaseStructure); TIM_ClearFlag(TIMx,TIM_FLAG_Update); TIM_ARRPreloadConfig(TIMx,DISABLE); TIM_ITConfig(TIMx,TIM_IT_Update,ENABLE); TIM_Cmd(TIMx,ENABLE); TimerInit(this->TIMx); }
/******************************************************************************* * Function Name : System_TimerConfiguration * Description : * Input : None * Output : None * Return : None *******************************************************************************/ static void System_TimerConfiguration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure = {0}; //--------------------------------------------------------------------------- // 初始化定时器TIM //--------------------------------------------------------------------------- TIM_DeInit( BSP_TIM );//复位TIM定时器 /* --------------------------------------------------------------- TIM Configuration: Output Compare Timing Mode: TIMCLK = 84 MHz, Prescaler = 8400, TIM counter clock = 10 KHz --------------------------------------------------------------- */ /* TIM configuration */ TIM_TimeBaseStructure.TIM_Period = 9; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(BSP_TIM, &TIM_TimeBaseStructure); /*--------------------------------------------------------------------- */ /* Prescaler configuration TIM 的时钟设定为10KHz,计数器的计量单位:1ms */ /* 注意:分频数不能超过65535 (0xFFFF) */ /*--------------------------------------------------------------------- */ TIM_PrescalerConfig(BSP_TIM, (8400 - 1), TIM_PSCReloadMode_Immediate); /* */ TIM_ARRPreloadConfig(BSP_TIM, ENABLE); /* Clear TIM update pending flag[清除TIM 溢出中断标志] */ TIM_ClearFlag(BSP_TIM, TIM_FLAG_Update); /* Enable TIM Update interrupt [TIM 溢出中断允许]*/ TIM_ITConfig(BSP_TIM, TIM_IT_Update, ENABLE); /* TIM enable counter [允许tim计数]*/ TIM_Cmd(BSP_TIM, ENABLE); }
uint32_t attachTimerCallback(uint8_t timer, ISRType ISR, uint32_t usDelay) { // Get the correct PCLK RCC_ClocksTypeDef RCC_Clocks; RCC_GetClocksFreq(&RCC_Clocks); uint32_t PCLK = RCC_Clocks.PCLK1_Frequency;// Frequency in Hz TIM_TypeDef *TIMx = TIMER_MAP[timer].TIMx; // For timers on APB2 use PCLK2 #if defined(STM32F446xx) if (TIMx == TIM1 || TIMx == TIM8 || TIMx == TIM9 || TIMx == TIM10 || TIMx == TIM11) PCLK = RCC_Clocks.PCLK2_Frequency; #elif defined(SERIES_STM32F30x) if (TIMx == TIM1 || TIMx == TIM8 || TIMx == TIM15 || TIMx == TIM16 || TIMx == TIM17) PCLK = RCC_Clocks.PCLK2_Frequency; #endif // Set the update ISR TimerInfo *cfg = &TIMER_MAP[timer]; cfg->isr = ISR; // Start interrupts with low priority uint8_t priority = 0xd; nvicEnable(TIMER_MAP[timer].IRQn, priority); // Start 1MHz timebase TIM_Cmd(TIMx, DISABLE); TIM_DeInit(TIMx); // FIXME always getting half of what expected... timerInitHelper(timer, PCLK/(1000000)-1, usDelay-1); TIMx->CNT = 0; TIM_ClearITPendingBit(TIMx, TIM_IT_Update); TIM_ITConfig(TIMx, TIM_IT_Update, ENABLE); TIM_Cmd(TIMx, ENABLE); return PCLK; }
/*=====================================================================================================*/ void TIM_Config( void ) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct; NVIC_InitTypeDef NVIC_InitStruct; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_DeInit(TIM3); /************************** PWM Output **************************************/ /* 設定 TIM3 Time Base */ TIM_TimeBaseStruct.TIM_Period = (u16)(1000-1); // 週期 = 10ms, 100Hz TIM_TimeBaseStruct.TIM_Prescaler = (u16)(720-1); // 除頻720 = 100kHz TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up; // 上數 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStruct); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); /* 啟動 */ TIM_ARRPreloadConfig(TIM3, ENABLE); // 致能 TIM3 重載寄存器ARR TIM_ClearFlag(TIM3, TIM_FLAG_Update); TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); TIM_Cmd(TIM3, ENABLE); // 致能 TIM3 }
//TIM_3 is for ModBus communication void InitTIM3(void) { TIM_TimeBaseInitTypeDef TIM_3_TimeBaseInitStruct; NVIC_InitTypeDef MYNVIC; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // Configure TIM3 IRQ MYNVIC.NVIC_IRQChannel = TIM3_IRQn; MYNVIC.NVIC_IRQChannelCmd = ENABLE; MYNVIC.NVIC_IRQChannelPreemptionPriority = 0; MYNVIC.NVIC_IRQChannelSubPriority = 2; NVIC_Init(&MYNVIC); TIM_DeInit(TIM3); //TIM_3 clock = 50, MHz / prescaler = 50 000 000 / 50 000 = 1000, Hz //time = TIM_3 period * (1 / TIM_3 clock) = 1 * (1 / 1000) = 0.001, s TIM_3_TimeBaseInitStruct.TIM_Prescaler = 50000; TIM_3_TimeBaseInitStruct.TIM_Period = 1; TIM_3_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; // 0 TIM_3_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_3_TimeBaseInitStruct.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM3, &TIM_3_TimeBaseInitStruct); TIM_ClearFlag(TIM3, TIM_FLAG_Update); TIM_ClearITPendingBit(TIM3, TIM_IT_Update); TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //TIM3 is not enabled from init function //ENABLE command is set by ModBusTimerEnable() }
static void PWM2_Mode_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitSturcture; TIM_OCInitTypeDef TIM_OCInitSturcture; u16 CCR1_Val = 1250; TIM_DeInit(PWM2_TIM); TIM_TimeBaseInitSturcture.TIM_Prescaler = (36-1); TIM_TimeBaseInitSturcture.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInitSturcture.TIM_Period = 2500; TIM_TimeBaseInitSturcture.TIM_ClockDivision = 0; TIM_TimeBaseInit(PWM2_TIM,&TIM_TimeBaseInitSturcture); TIM_ClearFlag(PWM2_TIM, TIM_FLAG_Update); /* 清除溢出中断标志 */ TIM_ITConfig(PWM2_TIM,TIM_IT_Update,ENABLE); TIM_OCInitSturcture.TIM_OCMode = TIM_OCMode_PWM1; //配置为PWM模式1 TIM_OCInitSturcture.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitSturcture.TIM_Pulse = CCR1_Val; //设置跳变值,当计数器计数到这个值时,电平发生跳变 TIM_OCInitSturcture.TIM_OCPolarity = TIM_OCPolarity_High; //当定时器计数值小于CCR1_Val时为高电平 TIM_OC1Init(PWM2_TIM, &TIM_OCInitSturcture); //使能通道1 TIM_OC1PreloadConfig(PWM2_TIM, TIM_OCPreload_Disable); TIM_ARRPreloadConfig(PWM2_TIM, ENABLE); // 使能TIM3重载寄存器ARR /* TIM3 enable counter */ TIM_Cmd(PWM2_TIM, DISABLE); //使能定时器3 }
void TIM2_Init(void) { TIM_TimeBaseInitTypeDef T; //创建定时器变量 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //TIM2使用APB1时钟总线 TIM_DeInit(TIM2); //复位TIM2定时器到默认值 T.TIM_Period=500-1; //计数器溢出值,最大65535,此值不能更改,与输出比较的设定值一致,输出比较计数器溢出也为65535 if(get_APB1_prevdiv() > 0){ tim2_clock = Get_SyS_CLK(3)<<1; }else{ tim2_clock = Get_SyS_CLK(3); } T.TIM_Prescaler = tim2_clock/TIM2_PREV_DIV - 1; //预分频系数,系统每秒72,000,000次,72000000/50000=1440分频,对系统频率72000000进行1440分频后,每秒计数频率为50000次,即每次计数时间为20us,每计满TIM_Period多次时变0重计 //T.TIM_Prescaler =7200 - 1; //预分频系数,系统每秒72,000,000次,72000000/50000=1440分频,对系统频率72000000进行1440分频后,每秒计数频率为50000次,即每次计数时间为20us,每计满TIM_Period多次时变0重计 T.TIM_ClockDivision = 0; //时钟分割 在定时器预分频之前作一段延时,很少用到,设为0即可 T.TIM_CounterMode = TIM_CounterMode_Up; //向上计数 UP:0到10000的计数 DOWN:FFFF到10000 TIM_TimeBaseInit(TIM2, &T); //根据上面设置初始化定时器TIM2 TIM_ClearFlag(TIM2, TIM_FLAG_Update); //清空溢出中断 TIM_SetCounter(TIM2,0); //设置计数器初值为0 //目前尚未启用该定时器 }
/** * @brief TIM2初始化 * @param None * @retval None */ void my_Timer2_Init() { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /* Enable TIM2 Clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_DeInit(TIM2 ); TIM_TimeBaseStructure.TIM_Prescaler = 0xFff; //加上原周期的N份,即(1+N)*T为1个周期 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //不要动了 TIM_TimeBaseStructure.TIM_Period = (SystemCoreClock / N_Hz) - 1; TIM_TimeBaseStructure.TIM_ClockDivision = 0; //不要动了 TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; //不要动了 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //TIM_ClearFlag(TIM2, TIM_FLAG_Update ); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); TIM_Cmd(TIM2, ENABLE); NVIC_InitTypeDef NVIC_InitStructure; /* Enable the TIM2 Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }
static void prvSetupTimerInterrupt( void ) { unsigned char a; unsigned short b; unsigned long n = configCPU_PERIPH_HZ / configTICK_RATE_HZ; TIM_InitTypeDef timer; SCU_APBPeriphClockConfig( __TIM23, ENABLE ); TIM_DeInit(TIM2); TIM_StructInit(&timer); prvFindFactors( n, &a, &b ); timer.TIM_Mode = TIM_OCM_CHANNEL_1; timer.TIM_OC1_Modes = TIM_TIMING; timer.TIM_Clock_Source = TIM_CLK_APB; timer.TIM_Clock_Edge = TIM_CLK_EDGE_RISING; timer.TIM_Prescaler = a-1; timer.TIM_Pulse_Level_1 = TIM_HIGH; timer.TIM_Pulse_Length_1 = s_nPulseLength = b-1; TIM_Init (TIM2, &timer); TIM_ITConfig(TIM2, TIM_IT_OC1, ENABLE); /* Configure the VIC for the WDG interrupt. */ VIC_Config( TIM2_ITLine, VIC_IRQ, 10 ); VIC_ITCmd( TIM2_ITLine, ENABLE ); /* Install the default handlers for both VIC's. */ VIC0->DVAR = ( unsigned long ) prvDefaultHandler; VIC1->DVAR = ( unsigned long ) prvDefaultHandler; TIM_CounterCmd(TIM2, TIM_CLEAR); TIM_CounterCmd(TIM2, TIM_START); }
void InitTIM2(void) { TIM_TimeBaseInitTypeDef TIM_2_TimeBaseInitStruct; NVIC_InitTypeDef MYNVIC; //AHB clock = 50, MHz RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // Configure TIM2 IRQ MYNVIC.NVIC_IRQChannel = TIM2_IRQn; MYNVIC.NVIC_IRQChannelCmd = ENABLE; MYNVIC.NVIC_IRQChannelPreemptionPriority = 0; MYNVIC.NVIC_IRQChannelSubPriority = 1; NVIC_Init(&MYNVIC); TIM_DeInit(TIM2); //TIM_2 clock = 50, MHz / prescaler = 50 000 000 / 500 = 100 000, Hz //time = TIM_2 period * (1 / TIM_2 clock) = 100 * (1 / 100 000) = 0.001, s TIM_2_TimeBaseInitStruct.TIM_Prescaler = 500; TIM_2_TimeBaseInitStruct.TIM_Period = 100; TIM_2_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; // 0 TIM_2_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_2_TimeBaseInitStruct.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM2, &TIM_2_TimeBaseInitStruct); TIM_ClearFlag(TIM2, TIM_FLAG_Update); TIM_ClearITPendingBit(TIM2, TIM_IT_Update); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); }
void systim_init(void* tim_init) { TIM_TimeBaseInitTypeDef tbase_in; TIM_DeInit(OT_GPTIM); /* tbase_in.TIM_Prescaler = 0; tbase_in.TIM_Period = *(ot_u32*)tim_init;*/ tbase_in.TIM_Prescaler = *(ot_u32*)tim_init; tbase_in.TIM_Period = 1; tbase_in.TIM_CounterMode = TIM_CounterMode_Up; tbase_in.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(OT_GPTIM, &tbase_in); TIM_SetCompare1(OT_GPTIM, *(ot_u32*)tim_init); // Timers 9/10/11 have external clock wired to RTC crystal. // (The fact that the clock mode is called "Mode2" is a coincidence) // mode1: external input pin (TIx) // mode2: external trigger input (ETR) TIM_ETRClockMode2Config(OT_GPTIM, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0); }
//=============================================================================== void xTim3Init(void) { //TIM3はタイマ割り込み(10KHz)で制御ループを回す NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; /* Enable the TIM3 gloabal Interrupt */ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; /* value = 0 - 15*/ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; /* value = 0 - 15*/ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_TimeBaseInitTypeDef TIM3_TimeBaseStructure; TIM_OCInitTypeDef TIM3_OCInitStructure; TIM_DeInit (TIM3); RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM3, ENABLE); //tim2クロックは84MHz。 TIM3_TimeBaseStructure.TIM_Period = (84000000 / 10000) - 1; //=8400 これで10KHz TIM3_TimeBaseStructure.TIM_Prescaler = 0; //プリスケーラ。0だと1分周。 TIM3_TimeBaseStructure.TIM_ClockDivision = 0; //外部クロックサンプルの間隔。使用しないので0。 TIM3_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit (TIM3, &TIM3_TimeBaseStructure); TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing; TIM3_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM3_OCInitStructure.TIM_Pulse = 0; TIM3_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init (TIM3, &TIM3_OCInitStructure); TIM_OC1PreloadConfig (TIM3, TIM_OCPreload_Enable); TIM_ITConfig (TIM3, TIM_IT_CC1, ENABLE); TIM_Cmd (TIM3, ENABLE); }
/********************************************************************************* *Function : void set_intorobot_loop_period(unsigned short time_ms) *Description : set intorobot_loop time *Input : 100ms--6500ms *Output : none *Return : none *author : lbz *date : 6-December-2015 *Others : none **********************************************************************************/ void set_intorobot_loop_period(unsigned short time_ms) { if(time_ms<100) time_ms=100; if(time_ms>6500) time_ms=6500; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; // 必须加 TIM_DeInit(TIM1); RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //时钟使能 TIM_InternalClockConfig(TIM1); // 配置时钟源 TIM_TimeBaseStructure.TIM_Period = (unsigned short)(time_ms*10-1); //TIM_TimeBaseStructure.TIM_Period = 2500-1;//设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms TIM_TimeBaseStructure.TIM_Prescaler = 7200-1;//72-1; //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 TIM_Cmd(TIM1, ENABLE); // 使能 TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); NVIC_InitTypeDef NVIC_InitStructure; //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); // 中断优先级分组 NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = TIM1_UP_IRQ_PRIORITY; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }
/* TIM2时钟初始化:0.5s溢出(定位周期) */ void TIM2_init(void) { NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE); TIM_DeInit(TIM2); // 0.0005 * 100 = 0.05s TIM_TimeBaseStructure.TIM_Period = (int) ((float)LOCATION_PERIOD / (float)TICK_IN_PERIOD / 0.0005); // 0.05s DEBUG2(("%f %f %f\r\n", (float)LOCATION_PERIOD ,(float)TICK_IN_PERIOD, (float)LOCATION_PERIOD / (float)TICK_IN_PERIOD)); DEBUG2(("定位TICK周期: %f\r\n", ((float)LOCATION_PERIOD / (float)TICK_IN_PERIOD / 0.0005))); TIM_TimeBaseStructure.TIM_Prescaler = 36000; // 1 / 72MHz * 36k = 0.0005/period TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_ClearFlag(TIM2, TIM_FLAG_Update); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); TIM_Cmd(TIM2, ENABLE); DEBUG2(("定位TICK周期: %d\r\n", TIM_TimeBaseStructure.TIM_Period)); }
/**************************************************************************************** ** 函数名称: LEDInit ** 功能描述: LED 指示灯管脚初始化函数 ** 参 数: none ** 返 回 值: none ** 作 者: Sevent ** 日 期: 2013年08月13日 **--------------------------------------------------------------------------------------- ** 修 改 人: ** 日 期: **-------------------------------------------------------------------------------------- ****************************************************************************************/ void LEDInit(void) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; uint16_t PrescalerValue; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); PrescalerValue = (uint16_t) (SystemCoreClock /2/10000) - 1; /* 配置PB7 为指示的LED */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); /* 配置PC7 为指示的LED, 由TIMER8驱动 */ GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM3); /* Configure green led as output */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); /* Enable the TIM8 global Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); PrescalerValue = (uint16_t) (SystemCoreClock /2/10000) - 1; /* Time base configuration */ TIM_DeInit(TIM3); TIM_TimeBaseStructure.TIM_Period = 65535; TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /* Output Compare Toggle Mode configuration: Channel2 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 100; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC2Init(TIM3, &TIM_OCInitStructure); /* TIM enable counter */ //TIM_Cmd(TIM3, ENABLE); /* TIM IT enable */ TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE); }
/******************************************************************************* * Function Name : TIM2_Configuration * Description : 每1秒发生一次更新事件(进入中断服务程序). * Input : None * Return : None *******************************************************************************/ void TIM2_Configuration(unsigned int MsTime) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //重新将Timer设置为缺省值 TIM_DeInit(TIM2); //采用内部时钟给TIM2提供时钟源 TIM_InternalClockConfig(TIM2); //预分频系数为36000-1,这样计数器时钟为64MHz/32000 = 2kHz TIM_TimeBaseStructure.TIM_Prescaler = 32000 - 1; //设置时钟分割 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置计数器模式为向上计数模式 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //设置计数溢出大小,每计2000个数就产生一个更新事件 TIM_TimeBaseStructure.TIM_Period = (2*MsTime); //将配置应用到TIM2中 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //清除溢出中断标志 TIM_ClearFlag(TIM2, TIM_FLAG_Update); //禁止ARR预装载缓冲器 TIM_ARRPreloadConfig(TIM2, DISABLE); //预装载寄存器的内容被立即传送到影子寄存器 //开启TIM2的中断 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); }
TimedTasks_imp() { SysTick->VAL = SysTick->LOAD = 168000-1; SysTick->CTRL = SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_CLKSOURCE_Msk; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3); NVIC_InitTypeDef nvic[1]; nvic->NVIC_IRQChannel = SysTick_IRQn; nvic->NVIC_IRQChannelPreemptionPriority = 3; nvic->NVIC_IRQChannelSubPriority = 1; nvic->NVIC_IRQChannelCmd = ENABLE; NVIC_Init(nvic); // Enable timer 2 for the CPUclockdiff. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_DeInit(TIM2); TIM_TimeBaseInitTypeDef tim[1]; TIM_TimeBaseStructInit(tim); tim->TIM_Period = 0xFFFFFFFF; // Free running tim->TIM_Prescaler = 0; tim->TIM_ClockDivision = 0; tim->TIM_CounterMode = TIM_CounterMode_Down; TIM_TimeBaseInit(TIM2, tim); TIM_Cmd(TIM2, ENABLE); }
void ENC_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; //Encoder uint connected to TIM2 GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); RCC_APB1PeriphClockCmd(ENC_TIMER_CLK,ENABLE); RCC_APB2PeriphClockCmd(ENC_GPIO_CLK ,ENABLE); GPIO_StructInit(&GPIO_InitStructure); //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; GPIO_InitStructure.GPIO_Pin = ENC_GPIO_PIN_A | ENC_GPIO_PIN_B ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(ENC_GPIO_PORT ,&GPIO_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = ENC_TIMER_IRQn ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = TIMx_PRE_EMPTION_PRIORITY; NVIC_InitStructure.NVIC_IRQChannelSubPriority = TIMx_SUB_PRIORITY; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_DeInit(ENC_TIMER); //TIM_TimeBaseInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Prescaler = 0x0; TIM_TimeBaseStructure.TIM_Period = (4*ENCODER_PPR)-1; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(ENC_TIMER,&TIM_TimeBaseStructure); TIM_EncoderInterfaceConfig(ENC_TIMER,TIM_EncoderMode_TI12, TIM_ICPolarity_Rising,TIM_ICPolarity_Rising); TIM_ICStructInit(&TIM_ICInitStructure); TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER; TIM_ICInit(ENC_TIMER,&TIM_ICInitStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;//注意通道 TIM_ICInit(ENC_TIMER, &TIM_ICInitStructure); TIM_ClearFlag(ENC_TIMER,TIM_FLAG_Update); TIM_ITConfig(ENC_TIMER,TIM_IT_Update,ENABLE); TIM2->CNT = COUNTER_RESET;//!!此处注意修改 //局部初始化 ENC_Clear_Speed_Buffer(); hPrevious_angle=0; hRot_Speed=0;; bSpeed_Buffer_Index = 0; hEncoder_Timer_Overflow=0; bIs_First_Measurement = true; hEncoder_Revolutions_Num=0; TIM_Cmd(ENC_TIMER,ENABLE); }
/* *berif: Initialize the counter of the encoding module(Right) *param: None *reval: None */ void TIM3_Init() { TIM_ICInitTypeDef TIM3_ICInitStructure; GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //TIM4时钟使能 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); //使能PORTA时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //GPIOB6 | 7 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz //以下两个不用设置 GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; //推挽复用 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //下拉 GPIO_Init(GPIOB,&GPIO_InitStructure); //初始化PB GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //GPIOB6 | 7 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz //以下两个不用设置 GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; //推挽复用 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //下拉 GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PB GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_TIM3); //PB6复用位定时器4 GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_TIM3); //PB7复用位定时器4 TIM_DeInit(TIM3); TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Prescaler=0; //定时器分频 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式 TIM_TimeBaseStructure.TIM_Period=60000; //自动重装载值 TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); //初始化TIM5输入捕获参数 TIM3_ICInitStructure.TIM_Channel = TIM_Channel_1 | TIM_Channel_2; //CC1S=01 选择输入端 IC1映射到TI1上 TIM3_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge; //上升沿捕获 TIM3_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上 TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 TIM3_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波 TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI1, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); TIM_ICInit(TIM3, &TIM3_ICInitStructure); TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//允许更新中断 ,允许CC1IE捕获中断 TIM_SetCounter(TIM3, 30000); TIM_Cmd(TIM3,ENABLE ); //使能定时器5 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、 }
static void serialTimerTxConfig(const timerHardware_t *timerHardwarePtr, uint8_t reference) { uint32_t timerPeriod=34; TIM_DeInit(timerHardwarePtr->tim); timerConfigure(timerHardwarePtr, timerPeriod, 1); timerChCCHandlerInit(&escSerialPorts[reference].timerCb, onSerialTimer); timerChConfigCallbacks(timerHardwarePtr, &escSerialPorts[reference].timerCb, NULL); }
/*====================================================================================================*/ static void ILI9341_LigConfig( void ) { GPIO_InitTypeDef GPIO_InitStruct; #ifdef BLIGHT_PWM TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct; TIM_OCInitTypeDef TIM_OCInitStruct; /* PWM Clk Init *************************************************************/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_APB2PeriphClockCmd(LCD_LIG_GPIO_CLK, ENABLE); /* LIG PA1 */ GPIO_InitStruct.GPIO_Pin = LCD_LIG_PIN; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(LCD_LIG_GPIO_PORT, &GPIO_InitStruct); TIM_DeInit(TIM2); /************************** PWM Output **************************************/ /* 設定 TIM2 Time Base */ TIM_TimeBaseStruct.TIM_Period = (uint16_t)(256-1); // Set Period TIM_TimeBaseStruct.TIM_Prescaler = (uint16_t)(0); // Set Freq TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up; // Count Up TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStruct); /* 設定 TIM2 OC2 */ TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; // PWM1 Mode TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; // Enable OC TIM_OCInitStruct.TIM_Pulse = 0; // Period Pulse TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; // 當計數值小於 PWM_MOTOR_MIN 時為高電平 TIM_OC2Init(TIM2, &TIM_OCInitStruct); // 初始化 TIM2 OC2 TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable); // Enable TIM2 OC2 Preload /* 啟動 */ TIM_ARRPreloadConfig(TIM2, ENABLE); // Enable TIM2 ARR Preload TIM_Cmd(TIM2, ENABLE); // Enable TIM2 LCD_LIG = BLIGHT_MIN; #else /* GPIO Clk ******************************************************************/ LCD_LIG_GPIO_CLK_ENABLE(); /* SPI Pin ******************************************************************/ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; GPIO_InitStruct.Pin = LCD_LIG_PIN; HAL_GPIO_Init(LCD_LIG_GPIO_PORT, &GPIO_InitStruct); LCD_LIG_L; #endif }
/** * @brief Configures the SR-04 sonar sensor Peripheral. */ void sonar_config_hc_sr04(void) { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; // TIM6 as timer, 10us resolution, 60000 overflow ~= 600ms RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE); TIM_DeInit(TIM6); TIM_InternalClockConfig(TIM6); TIM_TimeBaseStructure.TIM_Prescaler=839; TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period=60000-1; TIM_TimeBaseInit(TIM6,&TIM_TimeBaseStructure); TIM_ClearFlag(TIM6,TIM_FLAG_Update); TIM_ARRPreloadConfig(TIM6,DISABLE); TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); TIM_Cmd(TIM6,ENABLE); // A8 as echo RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // D14 as trigger GPIO_ResetBits(GPIOD, GPIO_Pin_14); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_ResetBits(GPIOD, GPIO_Pin_14); // EXTI EXTI_ClearITPendingBit(EXTI_Line8); SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource8); EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_InitStructure.EXTI_Line = EXTI_Line8; EXTI_Init(&EXTI_InitStructure); // priority : lowest NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); sr04_initialized = 1; }
/** * @brief De-initializes the Timers for all the Timer interfaces. * @retval None */ void Blox_Timer_DeInit_Timer(void) { TIM_DeInit(TIM1); TIM_DeInit(TIM2); TIM_DeInit(TIM3); TIM_DeInit(TIM4); TIM_DeInit(TIM5); TIM_DeInit(TIM6); TIM_DeInit(TIM7); TIM_DeInit(TIM8); }
/*********************************************** 函数名:MotorInit(void) 功能:输出PWM的定时器2初始化 输入参数:无 输出:无 描述:调用该函数,即初始化定时器2为PWM输出模式 备注: ***********************************************/ void MotorInit(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; uint16_t PrescalerValue = 0; //控制电机PWM频率 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //打开外设A的时钟和复用时钟 RCC_APB1PeriphClockCmd(RCC_APB2Periph_TIM1 ,ENABLE); //打开定时器1时钟 //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //打开外设A的时钟和复用时钟 //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4 ,ENABLE); //打开定时器4时钟 // 设置GPIO功能。 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 复位定时器。 TIM_DeInit(TIM1); // 配置计时器。 PrescalerValue = (uint16_t) (SystemCoreClock / 24000000) - 1; TIM_TimeBaseStructure.TIM_Period = 999; //计数上线 TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; //pwm时钟分频 TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数 TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure); // 配置TIM1为PWM输出模式 TIM_OCStructInit(&TIM_OCInitStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; //0 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM1,&TIM_OCInitStructure); //TIM_OC2Init(TIM2,&TIM_OCInitStructure); //TIM_OC3Init(TIM2,&TIM_OCInitStructure); //TIM_OC4Init(TIM2,&TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable); //TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable); //TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable); // 启动计时器。 TIM_Cmd(TIM1,ENABLE); printf("TIM1 enable done...\r\n"); MotorInit_1(); }
// ------------------------------------------------------------ // stops an active SIT by disabling its interrupt and TIMER // and freeing up its state for future use. // ------------------------------------------------------------ void IntervalTimer::stop_SIT() { NVIC_InitTypeDef nvicStructure; TIM_TypeDef* TIMx; //use SIT_id to identify TIM# switch (SIT_id) { #if defined(STM32F10X_MD) || !defined(PLATFORM_ID) //Core case 0: // TIM2 nvicStructure.NVIC_IRQChannel = TIM2_IRQn; TIMx = TIM2; break; case 1: // TIM3 nvicStructure.NVIC_IRQChannel = TIM3_IRQn; TIMx = TIM3; break; case 2: // TIM4 nvicStructure.NVIC_IRQChannel = TIM4_IRQn; TIMx = TIM4; break; #elif defined(STM32F2XX) && defined(PLATFORM_ID) //Photon case 0: // TIM3 nvicStructure.NVIC_IRQChannel = TIM3_IRQn; TIMx = TIM3; break; case 1: // TIM4 nvicStructure.NVIC_IRQChannel = TIM4_IRQn; TIMx = TIM4; break; case 2: // TIM5 nvicStructure.NVIC_IRQChannel = TIM5_IRQn; TIMx = TIM5; break; case 3: // TIM6 nvicStructure.NVIC_IRQChannel = TIM6_DAC_IRQn; TIMx = TIM6; break; case 4: // TIM7 nvicStructure.NVIC_IRQChannel = TIM7_IRQn; TIMx = TIM7; break; #endif } // disable counter TIM_Cmd(TIMx, DISABLE); // disable interrupt nvicStructure.NVIC_IRQChannelCmd = DISABLE; NVIC_Init(&nvicStructure); // disable timer peripheral TIM_DeInit(TIMx); // free SIT for future use SIT_used[SIT_id] = false; }
static void serialTimerRxConfig(const timerHardware_t *timerHardwarePtr, uint8_t reference) { // start bit is usually a FALLING signal TIM_DeInit(timerHardwarePtr->tim); timerConfigure(timerHardwarePtr, 0xFFFF, 1); serialICConfig(timerHardwarePtr->tim, timerHardwarePtr->channel, TIM_ICPolarity_Falling); timerChCCHandlerInit(&escSerialPorts[reference].edgeCb, onSerialRxPinChange); timerChConfigCallbacks(timerHardwarePtr, &escSerialPorts[reference].edgeCb, NULL); }
// -------------------------------------------------- // Initialize external SDRAM memory Micron K4S561632J, 256Mbit(8M x 32) void Init_SDRAM( void ) { volatile uint32_t i; volatile unsigned long Dummy; EMC_DYN_MEM_Config_Type config; TIM_TIMERCFG_Type TIM_ConfigStruct; TIM_ConfigStruct.PrescaleOption = TIM_PRESCALE_USVAL; TIM_ConfigStruct.PrescaleValue = 1; // Set configuration for Tim_config and Tim_MatchConfig TIM_Init(LPC_TIM0, TIM_TIMER_MODE,&TIM_ConfigStruct); config.ChipSize = 256; config.AddrBusWidth = 32; config.AddrMap = EMC_ADD_MAP_ROW_BANK_COL; config.CSn = 0; config.DataWidth = 16; config.TotalSize = SDRAM_SIZE; config.CASLatency= 3; config.RASLatency= 3; config.Active2ActivePeriod =EMC_NS2CLK( SDRAM_TRC); config.ActiveBankLatency =EMC_NS2CLK( SDRAM_TRRD); config.AutoRefrehPeriod = EMC_NS2CLK( SDRAM_TRFC); config.DataIn2ActiveTime = SDRAM_TDAL + EMC_NS2CLK( SDRAM_TRP); config.DataOut2ActiveTime = SDRAM_TAPR; config.WriteRecoveryTime = SDRAM_TWR; config.ExitSelfRefreshTime = EMC_NS2CLK( SDRAM_TXSR); config.LoadModeReg2Active = SDRAM_TMRD; config.PrechargeCmdPeriod = EMC_NS2CLK( SDRAM_TRP); config.ReadConfig = 1; // Command delayed strategy, using EMCCLKDELAY config.RefreshTime = EMC_NS2CLK( SDRAM_REFRESH) >> 4; config.Active2PreChargeTime = EMC_NS2CLK( SDRAM_TRAS); config.SeftRefreshExitTime = EMC_NS2CLK( SDRAM_TXSR); DynMem_Init(&config); EMC_DynCtrlSDRAMInit(EMC_DYNAMIC_CTRL_SDRAM_NOP); // Issue NOP command TIM_Waitms(100); // wait 200ms EMC_DynCtrlSDRAMInit(EMC_DYNAMIC_CTRL_SDRAM_PALL); // Issue Pre-charge command for(i = 0; i < 0x80; i++); // wait 128 AHB clock cycles TIM_Waitms(100); EMC_DynCtrlSDRAMInit(EMC_DYNAMIC_CTRL_SDRAM_MODE); // Issue MODE command Dummy = *((volatile uint32_t *)(SDRAM_BASE_ADDR | (0x32<<13))); // Mode Register Setting //Timing for 48/60/72MHZ Bus EMC_DynCtrlSDRAMInit(EMC_DYNAMIC_CTRL_SDRAM_NORMAL); // Issue NORMAL command //enable buffers EMC_DynMemConfigB(0, EMC_DYNAMIC_CFG_BUFF_ENABLED); for(i = 100000; i;i--); TIM_DeInit(LPC_TIM0); }