// 计时器设置为PWM发生器,可以四路输出 void Timer::mode_pwm_output(float freq, float duty, uint8_t CH_No, PinTypedef p) { freq_ = freq; Pin pin(p); // 函数调用后变量就消失了 uint8_t tmp = this->GPIO_AF_TIM(this->TIM); // 看看tmp有没有问题 pin.mode_pwm_output(tmp); // 时钟预分频 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructrue; // 计时器分频初始化器 uint16_t Period; uint16_t Width; Period = (uint16_t) (TIMER_CLOCK/freq); Width = (uint16_t) (Period*duty); TIM_TimeBaseStructrue.TIM_Period = Period - 1; //PWM周期 TIM_TimeBaseStructrue.TIM_Prescaler = PRESCALER; switch (this->TIM_No) { case (1): case (8): case (9): case (10): case (11): { TIM_TimeBaseStructrue.TIM_Prescaler = PRESCALER_APB2; break; } } TIM_TimeBaseStructrue.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructrue.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(this->TIM, &TIM_TimeBaseStructrue); /* Enable TIM4 Preload register on ARR */ TIM_ARRPreloadConfig(this->TIM, ENABLE); TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置为PWM模式1 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = Width; // Period*duty //设置跳变值,当计数器计数到这个值时,电平发生跳变 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //当定时器计数值小于CCR1_Val时为高电平 switch (CH_No) { case (1):{ TIM_OC1Init(this->TIM, &TIM_OCInitStructure); TIM_OC1PreloadConfig(this->TIM, TIM_OCPreload_Enable); break; } case (2):{ TIM_OC2Init(this->TIM, &TIM_OCInitStructure); TIM_OC2PreloadConfig(this->TIM, TIM_OCPreload_Enable); break; } case (3):{ TIM_OC3Init(this->TIM, &TIM_OCInitStructure); TIM_OC3PreloadConfig(this->TIM, TIM_OCPreload_Enable); break; } case (4):{ TIM_OC4Init(this->TIM, &TIM_OCInitStructure); TIM_OC4PreloadConfig(this->TIM, TIM_OCPreload_Enable); break; } } TIM_Cmd(this->TIM, ENABLE); //使能定时器 /* TIM1 Main Output Enable */ TIM_CtrlPWMOutputs(this->TIM, ENABLE); }
// ---------------------------------------------------------------------------- void HwInit( void ) { SystemCoreClockUpdate( ); // Make sure SysTick is running at a 1ms rate. if ( SysTick_Config( SystemCoreClock / 1000 ) ) { /* Capture error */ while ( 1 ); } // SysTick_CLKSourceConfig( SysTick_CLKSource_HCLK_Div8 ); /* Initialize Leds mounted on STM32F4-Discovery board */ STM_EVAL_LEDInit(LED4); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED5); STM_EVAL_LEDInit(LED6); return; /* Turn on LED4 and LED5 */ STM_EVAL_LEDOn(LED4); STM_EVAL_LEDOn(LED5); /* TIM Configuration */ TIM3_Config(); TIM4_Config(); /* ----------------------------------------------------------------------- TIM3 Configuration: generate 4 PWM signals with 4 different duty cycles. In this example TIM3 input clock (TIM3CLK) is set to 2 * APB1 clock (PCLK1), since APB1 prescaler is different from 1. TIM3CLK = 2 * PCLK1 PCLK1 = HCLK / 4 => TIM3CLK = HCLK / 2 = SystemCoreClock /2 To get TIM3 counter clock at 28 MHz, the prescaler is computed as follows: Prescaler = (TIM3CLK / TIM3 counter clock) - 1 Prescaler = ((SystemCoreClock /2) /28 MHz) - 1 To get TIM3 output clock at 30 KHz, the period (ARR)) is computed as follows: ARR = (TIM3 counter clock / TIM3 output clock) - 1 = 665 TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 = 50% TIM3 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR)* 100 = 37.5% TIM3 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR)* 100 = 25% TIM3 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR)* 100 = 12.5% Note: SystemCoreClock variable holds HCLK frequency and is defined in system_stm32f4xx.c file. Each time the core clock (HCLK) changes, user had to call SystemCoreClockUpdate() function to update SystemCoreClock variable value. Otherwise, any configuration based on this variable will be incorrect. ----------------------------------------------------------------------- */ /* Compute the prescaler value */ PrescalerValue = (uint16_t) ((SystemCoreClock /2) / 28000000) - 1; /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = 665; TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit( TIM3, &TIM_TimeBaseStructure ); TIM_TimeBaseInit( TIM4, &TIM_TimeBaseStructure ); /* PWM1 Mode configuration: Channel1 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR1_Val; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init( TIM3, &TIM_OCInitStructure ); TIM_OC1Init( TIM4, &TIM_OCInitStructure ); TIM_OC1PreloadConfig( TIM3, TIM_OCPreload_Enable ); TIM_OC1PreloadConfig( TIM4, TIM_OCPreload_Enable ); /* PWM1 Mode configuration: Channel2 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR2_Val; TIM_OC2Init( TIM3, &TIM_OCInitStructure ); TIM_OC2Init( TIM4, &TIM_OCInitStructure ); TIM_OC2PreloadConfig( TIM3, TIM_OCPreload_Enable ); TIM_OC2PreloadConfig( TIM4, TIM_OCPreload_Enable ); /* PWM1 Mode configuration: Channel3 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR3_Val; TIM_OC3Init( TIM3, &TIM_OCInitStructure ); TIM_OC3Init( TIM4, &TIM_OCInitStructure ); TIM_OC3PreloadConfig( TIM3, TIM_OCPreload_Enable ); TIM_OC3PreloadConfig( TIM4, TIM_OCPreload_Enable ); /* PWM1 Mode configuration: Channel4 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR4_Val; TIM_OC4Init( TIM3, &TIM_OCInitStructure ); TIM_OC4Init( TIM4, &TIM_OCInitStructure ); TIM_OC4PreloadConfig( TIM3, TIM_OCPreload_Enable ); TIM_OC4PreloadConfig( TIM4, TIM_OCPreload_Enable ); TIM_ARRPreloadConfig( TIM3, ENABLE ); TIM_ARRPreloadConfig( TIM4, ENABLE ); /* TIM3 enable counter */ TIM_Cmd( TIM3, ENABLE ); TIM_Cmd( TIM4, ENABLE ); vUSART2_Init(); // Start up UART2 }
// AN2821: Clock/calendar implementation on the STM32F10xxx microcontroller RTC // http://www.st.com/web/en/resource/technical/document/application_note/CD00207941.pdf void initRtc() { RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP|RCC_APB1Periph_PWR, ENABLE); PWR_BackupAccessCmd(ENABLE); #if defined(CLK_SRC_EXT) RCC_LSEConfig(RCC_LSE_ON); for (uint16_t i = 0; i < 1<<15; i++) { if (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == SET) { trace_printf("LSE clock became ready at iteration %d.\n", i); break; } } RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); RTC_WaitForLastTask(); #elif defined(CLK_SRC_INT) RCC_LSICmd(ENABLE); for (uint16_t i = 0; i < 1<<15; i++) { if (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == SET) { trace_printf("LSI clock became ready at iteration %d.\n", i); break; } } RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); RTC_WaitForLastTask(); #endif RCC_RTCCLKCmd(ENABLE); RTC_WaitForSynchro(); RTC_WaitForLastTask(); // This must come after WaitForSynchro(). #if defined(CLK_SRC_EXT) RTC_SetPrescaler(32768); // Watch crystal. RTC_WaitForLastTask(); #elif defined(CLK_SRC_INT) // RM0041, page 74: "The clock frequency is around 40kHz." RTC_SetPrescaler(40500); RTC_WaitForLastTask(); #endif RTC_ClearITPendingBit(RTC_IT_SEC); RTC_ITConfig(RTC_IT_ALR|RTC_IT_OW, DISABLE); RTC_ITConfig(RTC_IT_SEC, ENABLE); RTC_WaitForLastTask(); PWR_BackupAccessCmd(DISABLE); NVIC_InitTypeDef NVIC_InitStructure = { .NVIC_IRQChannel = RTC_IRQn, .NVIC_IRQChannelPreemptionPriority = 1, .NVIC_IRQChannelSubPriority = 2, .NVIC_IRQChannelCmd = ENABLE, }; NVIC_Init(&NVIC_InitStructure); } void initTimer() { // TIM3 clock enable RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3, ENABLE); // Enable both pins as alternate function. GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GRID_PIN; GPIO_Init(GRID_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = BUZ_PIN; GPIO_Init(BUZ_PORT, &GPIO_InitStructure); // Time base configuration; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // Grid PWM is on PA0 (D11), this is timer 2 channel 1. // 72MHz system clock / 1800 / 80 = 500Hz TIM_TimeBaseStructure.TIM_Period = 80; TIM_TimeBaseStructure.TIM_Prescaler = 1800; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); gGridOc.TIM_OCMode = TIM_OCMode_PWM1; gGridOc.TIM_OCPolarity = TIM_OCPolarity_High; gGridOc.TIM_OutputState = TIM_OutputState_Enable; gGridOc.TIM_Pulse = 40; // 40 of period 80 = 50% duty TIM_OC1Init(TIM2, &gGridOc); TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM2, ENABLE); // ARR = Auto Reload Register TIM_Cmd(TIM2, ENABLE); // Buzzer PWM is on PB0 (D3), this is timer 3 channel 3. // 72MHz system clock / 1800 / 67 = ~600 Hz. TIM_TimeBaseStructure.TIM_Period = 67; TIM_TimeBaseStructure.TIM_Prescaler = 1800; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); gBuzOc.TIM_OCMode = TIM_OCMode_PWM1; gBuzOc.TIM_OCPolarity = TIM_OCPolarity_High; gBuzOc.TIM_OutputState = TIM_OutputState_Enable; gBuzOc.TIM_Pulse = 30; TIM_OC3Init(TIM3, &gBuzOc); TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM3, ENABLE); // ARR = Auto Reload Register TIM_Cmd(TIM3, ENABLE); }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f0xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f0xx.c file */ /* TIM Configuration */ TIM_Config(); TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_OCStructInit(&TIM_OCInitStructure); /* --------------------------------------------------------------------------- TIM3 Configuration: Output Compare Active Mode: In this example TIM3 input clock (TIM3CLK) is set to APB1 clock (PCLK1) TIM3CLK = PCLK1 PCLK1 = HCLK => TIM3CLK = HCLK = SystemCoreClock To get TIM3 counter clock at 1 KHz, the prescaler is computed as follows: Prescaler = (TIM3CLK / TIM3 counter clock) - 1 Prescaler = (SystemCoreClock /1 KHz) - 1 Generate 4 signals with 4 different delays: TIM3_CH1 delay = CCR1_Val/TIM3 counter clock = 1000 ms TIM3_CH2 delay = CCR2_Val/TIM3 counter clock = 500 ms TIM3_CH3 delay = CCR3_Val/TIM3 counter clock = 250 ms TIM3_CH4 delay = CCR4_Val/TIM3 counter clock = 125 ms Note: SystemCoreClock variable holds HCLK frequency and is defined in system_stm32f0xx.c file. Each time the core clock (HCLK) changes, user had to call SystemCoreClockUpdate() function to update SystemCoreClock variable value. Otherwise, any configuration based on this variable will be incorrect. --------------------------------------------------------------------------- */ /*Compute the prescaler value */ PrescalerValue = (uint16_t) (SystemCoreClock / 1000) - 1; /* Time base configuration */ 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 Active Mode configuration: Channel1 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Active; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_Pulse = CCR1_Val; TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable); TIM_ARRPreloadConfig(TIM3, DISABLE); /* Output Compare Active Mode configuration: Channel2 */ TIM_OCInitStructure.TIM_Pulse = CCR2_Val; TIM_OC2Init(TIM3, &TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable); /* Output Compare Active Mode configuration: Channel3 */ TIM_OCInitStructure.TIM_Pulse = CCR3_Val; TIM_OC3Init(TIM3, &TIM_OCInitStructure); TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Disable); /* Output Compare Active Mode configuration: Channel4 */ TIM_OCInitStructure.TIM_Pulse = CCR4_Val; TIM_OC4Init(TIM3, &TIM_OCInitStructure); TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Disable); /* TIM3 enable counter */ TIM_Cmd(TIM3, ENABLE); TIM_GenerateEvent(TIM3, TIM_EventSource_Update); /* Turn on LED1 */ STM_EVAL_LEDOn(LED1); /* Infinite loop */ while (1) { } }
/** * @brief Main program * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f10x_xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f10x.c file */ /* System Clocks Configuration */ RCC_Configuration(); /* GPIO Configuration */ GPIO_Configuration(); /* ----------------------------------------------------------------------- TIM3 Configuration: generate 4 PWM signals with 4 different duty cycles: The TIM3CLK frequency is set to SystemCoreClock (Hz), to get TIM3 counter clock at 24 MHz the Prescaler is computed as following: - Prescaler = (TIM3CLK / TIM3 counter clock) - 1 SystemCoreClock is set to 72 MHz for Low-density, Medium-density, High-density and Connectivity line devices and to 24 MHz for Low-Density Value line and Medium-Density Value line devices The TIM3 is running at 36 KHz: TIM3 Frequency = TIM3 counter clock/(ARR + 1) = 24 MHz / 666 = 36 KHz TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 = 50% TIM3 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR)* 100 = 37.5% TIM3 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR)* 100 = 25% TIM3 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR)* 100 = 12.5% ----------------------------------------------------------------------- */ /* Compute the prescaler value */ //PrescalerValue = (uint16_t) (SystemCoreClock / 24000000) - 1; PrescalerValue = (uint16_t) (36000); /* Time base configuration */ //TIM_TimeBaseStructure.TIM_Period = 665; TIM_TimeBaseStructure.TIM_Period = 9; TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /* PWM1 Mode configuration: Channel1 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR1_Val; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); /* PWM1 Mode configuration: Channel2 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR2_Val; TIM_OC2Init(TIM3, &TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); /* PWM1 Mode configuration: Channel3 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR3_Val; TIM_OC3Init(TIM3, &TIM_OCInitStructure); TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); /* PWM1 Mode configuration: Channel4 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR4_Val; TIM_OC4Init(TIM3, &TIM_OCInitStructure); TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM3, ENABLE); /* TIM3 enable counter */ TIM_Cmd(TIM3, ENABLE); while (1) {} }
int main(void) { init_USART1(9600); // initialize USART1 @ 9600 baud USART_puts(USART1, "Init complete! Hello World!rn"); // just send a message to indicate that it works GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // address line RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); // clock and chip select line RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); // data line // GPIOA Configuration: Address line GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); // GPIOD Configuration: Data line GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOD, &GPIO_InitStructure); // GPIOB Configuration: TIM3 CH4 (PB1) - clock GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOB, GPIO_PinSource1, GPIO_AF_TIM3); // GPIOB Configuration: chip enable GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_Init(GPIOB, &GPIO_InitStructure); /* Time base configuration */ unsigned int frequency = 600000; TIM_TimeBaseStructure.TIM_Period = 10000000 / (2 * frequency); TIM_TimeBaseStructure.TIM_Prescaler = (SystemCoreClock / 10000000) - 1; // Taktung: 100MHz TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // PWM1 Mode configuration: Channel4 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC4Init(TIM3, &TIM_OCInitStructure); TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM3, ENABLE); /* TIM3 enable counter */ TIM_Cmd(TIM3, ENABLE); TIM3->CCR4 = TIM_TimeBaseStructure.TIM_Period / 2; SID_writeRegister(REG_VOICE_1_FREQ_LOW, 50); SID_writeRegister(REG_VOICE_1_FREQ_HI, 0); SID_writeRegister(REG_VOICE_1_CONTROL, 64); // square wave while (1) { } }
static inline void LED_initLedRGB(void) { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_8 | GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM3); GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_TIM3); GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_TIM3); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; uint16_t TIM_Period = PWM_PERIOD_RAW; TIM_TimeBaseStructure.TIM_Prescaler = 42-1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = TIM_Period; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); uint32_t CCR_ValRed = 0; uint32_t CCR_ValGreen = 0; uint32_t CCR_ValBlue = 0; TIM_OCInitTypeDef TIM_OCInitStructure; /* PWM1 Mode configuration: Channel1 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; TIM_OCInitStructure.TIM_Pulse = CCR_ValRed; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCNIdleState_Reset; TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset; TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; TIM_OCInitStructure.TIM_Pulse = CCR_ValGreen; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCNIdleState_Reset; TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset; TIM_OC3Init(TIM3, &TIM_OCInitStructure); TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; TIM_OCInitStructure.TIM_Pulse = CCR_ValBlue; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCNIdleState_Reset; TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset; TIM_OC4Init(TIM3, &TIM_OCInitStructure); TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM3, ENABLE); /* TIM1 Main Output Enable */ TIM_CtrlPWMOutputs(TIM3, ENABLE); TIM_SetCounter(TIM3, 0); TIM_Cmd(TIM3, ENABLE); }
/** * @brief Main program * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f10x_xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f10x.c file */ /* System Clocks Configuration */ RCC_Configuration(); /* NVIC Configuration */ NVIC_Configuration(); /* GPIO Configuration */ GPIO_Configuration(); /* --------------------------------------------------------------- TIM2 Configuration: TIM2CLK = SystemCoreClock / 2, The objective is to get TIM2 counter clock at 1 KHz: - Prescaler = (TIM2CLK / TIM2 counter clock) - 1 And generate 4 signals with 4 different delays: TIM2_CH1 delay = CCR1_Val/TIM2 counter clock = 1000 ms TIM2_CH2 delay = CCR2_Val/TIM2 counter clock = 500 ms TIM2_CH3 delay = CCR3_Val/TIM2 counter clock = 250 ms TIM2_CH4 delay = CCR4_Val/TIM2 counter clock = 125 ms * SystemCoreClock is set to 72 MHz for Low-density, Medium-density, High-density and Connectivity line devices and to 24 MHz for Low-Density Value line and Medium-Density Value line devices --------------------------------------------------------------- */ /* Compute the prescaler value */ PrescalerValue = (uint16_t) (SystemCoreClock / 2000) - 1; /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = 65535; TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); /* Output Compare Active Mode configuration: Channel1 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Inactive; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR1_Val; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM2, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable); /* Output Compare Active Mode configuration: Channel2 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR2_Val; TIM_OC2Init(TIM2, &TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable); /* Output Compare Active Mode configuration: Channel3 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR3_Val; TIM_OC3Init(TIM2, &TIM_OCInitStructure); TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Disable); /* Output Compare Active Mode configuration: Channel4 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR4_Val; TIM_OC4Init(TIM2, &TIM_OCInitStructure); TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Disable); TIM_ARRPreloadConfig(TIM2, ENABLE); /* TIM IT enable */ TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE); /* Set PC.06, PC.07, PC.08 and PC.09 pins */ GPIO_SetBits(GPIOC, GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9); /* TIM2 enable counter */ TIM_Cmd(TIM2, ENABLE); while (1) {} }
bool Servo::attach(uint8_t pin, uint16_t minPW, uint16_t maxPW, int16_t minAngle, int16_t maxAngle) { TIM_TypeDef* tdev = g_APinDescription[pin].ulTimerPeripheral; uint8_t tchan = g_APinDescription[pin].ulTimerChannel; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); if (tdev == NULL) { // don't reset any fields or ASSERT(0), to keep driving any // previously attach()ed servo. return false; } if (this->attached()) { this->detach(); } this->pin = pin; this->minPW = minPW; this->maxPW = maxPW; this->minAngle = minAngle; this->maxAngle = maxAngle; pinMode(pin, AF_OUTPUT_PUSHPULL); TIM_Cmd(tdev, DISABLE); // TIM clock enable if(tdev == TIM1) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE); #if defined (STM32F40_41xxx) GPIO_AF_TIM = GPIO_AF_TIM1; #endif } else if(tdev == TIM2) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); #if defined (STM32F40_41xxx) GPIO_AF_TIM = GPIO_AF_TIM2; #endif } else if(tdev == TIM3) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); #if defined (STM32F40_41xxx) GPIO_AF_TIM = GPIO_AF_TIM3; #endif } else if(tdev == TIM4) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); #if defined (STM32F40_41xxx) GPIO_AF_TIM = GPIO_AF_TIM4; #endif } else if(tdev == TIM5) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); #if defined (STM32F40_41xxx) GPIO_AF_TIM = GPIO_AF_TIM5; #endif } else if(tdev == TIM8) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8 , ENABLE); #if defined (STM32F40_41xxx) GPIO_AF_TIM = GPIO_AF_TIM8; #endif } // tdev.pause(); // Time base configuration TIM_TimeBaseStructure.TIM_Period = SERVO_OVERFLOW; TIM_TimeBaseStructure.TIM_Prescaler = SERVO_PRESCALER-1; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;// TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //for TIM1 and TIM8 TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(tdev, &TIM_TimeBaseStructure); // PWM1 Mode configuration TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_Pulse = 0; //for TIM1 and TIM8 TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; if(tchan == TIM_Channel_1) { // PWM1 Mode configuration: Channel1 TIM_OC1Init(tdev, &TIM_OCInitStructure); TIM_OC1PreloadConfig(tdev, TIM_OCPreload_Enable); } else if(tchan == TIM_Channel_2) { // PWM1 Mode configuration: Channel2 TIM_OC2Init(tdev, &TIM_OCInitStructure); TIM_OC2PreloadConfig(tdev, TIM_OCPreload_Enable); } else if(tchan == TIM_Channel_3) { // PWM1 Mode configuration: Channel3 TIM_OC3Init(tdev, &TIM_OCInitStructure); TIM_OC3PreloadConfig(tdev, TIM_OCPreload_Enable); } else if(tchan == TIM_Channel_4) { // PWM1 Mode configuration: Channel4 TIM_OC4Init(tdev, &TIM_OCInitStructure); TIM_OC4PreloadConfig(tdev, TIM_OCPreload_Enable); } TIM_ARRPreloadConfig(tdev, ENABLE); // TIM enable counter TIM_Cmd(tdev, ENABLE); //for TIM1 and TIM8 TIM_CtrlPWMOutputs(tdev, ENABLE); // tdev.setPrescaleFactor(SERVO_PRESCALER - 1); // tdev.setOverflow(SERVO_OVERFLOW); // tdev.setMode(TIMER_CH1, TIM_OCMode_PWM1); // timer_pause(tdev); // timer_set_prescaler(tdev, SERVO_PRESCALER - 1); // prescaler is 1-based // timer_set_reload(tdev, SERVO_OVERFLOW); // timer_generate_update(tdev); // timer_resume(tdev); return true; }
void TIM_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; uint16_t CCR1_Val = 0xfff; uint16_t CCR2_Val = 249; uint16_t CCR3_Val = 333; uint16_t CCR4_Val = 83; uint16_t PrescalerValue = 0; GPIO_InitTypeDef GPIO_InitStructure; /* TIM3 clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /* GPIOC clock enable */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); /* GPIOC Configuration: TIM3 CH3 (PB0)*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOB, &GPIO_InitStructure); /* Connect TIM3 pins to AF0 */ GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_TIM3); /* ----------------------------------------------------------------------- TIM3 Configuration: generate 4 PWM signals with 4 different duty cycles: The TIM3CLK frequency is set to SystemCoreClock / 2 (Hz), to get TIM3 counter clock at 20 MHz the Prescaler is computed as following: - Prescaler = (TIM3CLK / TIM3 counter clock) - 1 SystemCoreClock is set to 120 MHz for STM32F2xx devices The TIM3 is running at 30 KHz: TIM3 Frequency = TIM3 counter clock/(ARR + 1) = 20 MHz / 666 = 30 KHz TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 = 50% TIM3 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR)* 100 = 37.5% TIM3 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR)* 100 = 25% TIM3 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR)* 100 = 12.5% ----------------------------------------------------------------------- */ /* Compute the prescaler value */ PrescalerValue = (uint16_t) (SystemCoreClock /100)-1; /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = 2; TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /* PWM1 Mode configuration: Channel3 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR1_Val; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC3Init(TIM3, &TIM_OCInitStructure); TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM3, ENABLE); /* TIM3 enable counter */ TIM_Cmd(TIM3, ENABLE); }
static void configure_hsync_timers() { // Stop both timers TIM_Cmd(dev_cfg->pixel_timer.timer, DISABLE); // This is overkill but used for consistency. No interrupts used for pixel clock // but this function calls the GPIO_Remap uint32_t tim_id; const struct pios_tim_channel *channels; // Init the channel to output the pixel clock channels = &dev_cfg->pixel_timer; PIOS_TIM_InitChannels(&tim_id, channels, 1, &px_callback, 0); // Init the channel to capture the pulse channels = &dev_cfg->hsync_capture; PIOS_TIM_InitChannels(&tim_id, channels, 1, &px_callback, 0); // Configure the input capture channel TIM_ICInitTypeDef TIM_ICInitStructure; switch(dev_cfg->hsync_capture.timer_chan) { case TIM_Channel_1: TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; break; case TIM_Channel_2: TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; break; default: PIOS_Assert(0); } TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; //TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter = 0; TIM_ICInit(dev_cfg->pixel_timer.timer, &TIM_ICInitStructure); // Set up the channel to output the pixel clock switch(dev_cfg->pixel_timer.timer_chan) { case TIM_Channel_1: TIM_OC1Init(dev_cfg->pixel_timer.timer, &dev_cfg->tim_oc_init); TIM_OC1PreloadConfig(dev_cfg->pixel_timer.timer, TIM_OCPreload_Enable); TIM_SetCompare1(dev_cfg->pixel_timer.timer, dc); break; case TIM_Channel_2: TIM_OC2Init(dev_cfg->pixel_timer.timer, &dev_cfg->tim_oc_init); TIM_OC2PreloadConfig(dev_cfg->pixel_timer.timer, TIM_OCPreload_Enable); TIM_SetCompare2(dev_cfg->pixel_timer.timer, dc); break; case TIM_Channel_3: TIM_OC3Init(dev_cfg->pixel_timer.timer, &dev_cfg->tim_oc_init); TIM_OC3PreloadConfig(dev_cfg->pixel_timer.timer, TIM_OCPreload_Enable); TIM_SetCompare3(dev_cfg->pixel_timer.timer, dc); break; case TIM_Channel_4: TIM_OC4Init(dev_cfg->pixel_timer.timer, &dev_cfg->tim_oc_init); TIM_OC4PreloadConfig(dev_cfg->pixel_timer.timer, TIM_OCPreload_Enable); TIM_SetCompare4(dev_cfg->pixel_timer.timer, dc); break; } TIM_ARRPreloadConfig(dev_cfg->pixel_timer.timer, ENABLE); TIM_CtrlPWMOutputs(dev_cfg->pixel_timer.timer, ENABLE); // This shouldn't be needed as it should come from the config struture. Something // is clobbering that TIM_PrescalerConfig(dev_cfg->pixel_timer.timer, 0, TIM_PSCReloadMode_Immediate); TIM_SetAutoreload(dev_cfg->pixel_timer.timer, period); }
u8 PWM_Out_Init(uint16_t hz)//50hz { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; GPIO_InitTypeDef GPIO_InitStructure; uint16_t PrescalerValue = 0; u32 hz_set = ACCURACY*hz; TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_OCStructInit(&TIM_OCInitStructure); hz_set = LIMIT (hz_set,1,84000000); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOE, ENABLE); ///////////////////////////////////////////////////////////////////////////// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_TIM5); GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_TIM5); /* Compute the prescaler value */ PrescalerValue = (uint16_t) ( ( SystemCoreClock /2 ) / hz_set ) - 1; /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = ACCURACY; TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // /* PWM1 Mode configuration: Channel1 */ // TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // TIM_OCInitStructure.TIM_Pulse = INIT_DUTY; // TIM_OC1Init(TIM5, &TIM_OCInitStructure); // TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable); // /* PWM1 Mode configuration: Channel2 */ // TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // TIM_OCInitStructure.TIM_Pulse = INIT_DUTY; // TIM_OC2Init(TIM5, &TIM_OCInitStructure); // TIM_OC2PreloadConfig(TIM5, TIM_OCPreload_Enable); /* PWM1 Mode configuration: Channel3 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = INIT_DUTY; TIM_OC3Init(TIM5, &TIM_OCInitStructure); TIM_OC3PreloadConfig(TIM5, TIM_OCPreload_Enable); /* PWM1 Mode configuration: Channel4 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = INIT_DUTY; TIM_OC4Init(TIM5, &TIM_OCInitStructure); TIM_OC4PreloadConfig(TIM5, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM5, ENABLE); TIM_Cmd(TIM5, ENABLE); ///////////////////////////////////////////////////////////////////////////// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_11 | GPIO_Pin_13 | GPIO_Pin_14; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ; GPIO_Init(GPIOE, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOE, GPIO_PinSource9, GPIO_AF_TIM1); GPIO_PinAFConfig(GPIOE, GPIO_PinSource11, GPIO_AF_TIM1); GPIO_PinAFConfig(GPIOE, GPIO_PinSource13, GPIO_AF_TIM1); GPIO_PinAFConfig(GPIOE, GPIO_PinSource14, GPIO_AF_TIM1); /* Compute the prescaler value */ PrescalerValue = (uint16_t) ( ( SystemCoreClock ) / hz_set ) - 1; /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = ACCURACY; TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset; /* PWM1 Mode configuration: Channel1 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = INIT_DUTY; TIM_OC1Init(TIM1, &TIM_OCInitStructure); //TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); /* PWM1 Mode configuration: Channel2 */ //TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = INIT_DUTY; TIM_OC2Init(TIM1, &TIM_OCInitStructure); //TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); /* PWM1 Mode configuration: Channel3 */ //TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = INIT_DUTY; TIM_OC3Init(TIM1, &TIM_OCInitStructure); //TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable); /* PWM1 Mode configuration: Channel4 */ //TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = INIT_DUTY; TIM_OC4Init(TIM1, &TIM_OCInitStructure); //TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM_CtrlPWMOutputs(TIM1, ENABLE); TIM_ARRPreloadConfig(TIM1, ENABLE); TIM_Cmd(TIM1, ENABLE); //////////////////////////////////////////////////////////////////////////////////// if( hz_set > 84000000 ) { return 0; } else { return 1; } }
/** * @brief Main program * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32l1xx_xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32l1xx.c file */ /* ------------------------- System Clocks Configuration ------------------------------*/ /* GPIOD clock enable */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOD, ENABLE); /* TIM3 clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /* ------------------------- GPIO Configuration ------------------------------*/ /* GPIOD Configuration: PD.00, PD.01, PD.04, PD.05 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1| GPIO_Pin_4 | GPIO_Pin_5 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz; GPIO_Init(GPIOD, &GPIO_InitStructure); /* --------------------------------------------------------------- TIM3 Configuration: The objective is to get TIM3 counter clock at 1 KHz: - Prescaler = (TIM3CLK / TIM3 counter clock) - 1 And generate 4 signals with 4 different delays: TIM3_CH1 delay = CCR1_Val/TIM3 counter clock = 1000 ms TIM3_CH2 delay = CCR2_Val/TIM3 counter clock = 500 ms TIM3_CH3 delay = CCR3_Val/TIM3 counter clock = 250 ms TIM3_CH4 delay = CCR4_Val/TIM3 counter clock = 125 ms --------------------------------------------------------------- */ PrescalerValue = (uint16_t) (SystemCoreClock / 1000) - 1; /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = 0xFFFF; TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /* Output Compare Timing Mode configuration: Channel1 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Inactive; TIM_OCInitStructure.TIM_Pulse = CCR1_Val; TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable); TIM_ARRPreloadConfig(TIM3, DISABLE); /* Output Compare Timing Mode configuration: Channel2 */ TIM_OCInitStructure.TIM_Pulse = CCR2_Val; TIM_OC2Init(TIM3, &TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable); /* Output Compare Timing Mode configuration: Channel3 */ TIM_OCInitStructure.TIM_Pulse = CCR3_Val; TIM_OC3Init(TIM3, &TIM_OCInitStructure); TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Disable); /* Output Compare Timing Mode configuration: Channel4 */ TIM_OCInitStructure.TIM_Pulse = CCR4_Val; TIM_OC4Init(TIM3, &TIM_OCInitStructure); TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Disable); /* TIM Interrupt configuration */ TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE); TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE); TIM_ITConfig(TIM3, TIM_IT_CC3, ENABLE); TIM_ITConfig(TIM3, TIM_IT_CC4, ENABLE); /* ------------------------- NVIC Configuration ------------------------------ */ NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* Set PD.00, PD.01, PD.04 and PD.05 pins */ GPIO_SetBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5); /* TIM enable counter */ TIM_Cmd(TIM3, ENABLE); while (1) {} }
/** * @brief Main program * @param None * @retval None */ int main(void) { /* System Clocks Configuration */ RCC_Configuration(); /* GPIO Configuration */ GPIO_Configuration(); /* ----------------------------------------------------------------------- TIM3 Configuration: generate 4 PWM signals with 4 different duty cycles: TIM3CLK = 36 MHz, Prescaler = 0x0, TIM3 counter clock = 36 MHz TIM3 ARR Register = 999 => TIM3 Frequency = TIM3 counter clock/(ARR + 1) TIM3 Frequency = 36 KHz. TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 = 50% TIM3 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR)* 100 = 37.5% TIM3 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR)* 100 = 25% TIM3 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR)* 100 = 12.5% ----------------------------------------------------------------------- */ /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = 999; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /* PWM1 Mode configuration: Channel1 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR1_Val; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); /* PWM1 Mode configuration: Channel2 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR2_Val; TIM_OC2Init(TIM3, &TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); /* PWM1 Mode configuration: Channel3 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR3_Val; TIM_OC3Init(TIM3, &TIM_OCInitStructure); TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); /* PWM1 Mode configuration: Channel4 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR4_Val; TIM_OC4Init(TIM3, &TIM_OCInitStructure); TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM3, ENABLE); /* TIM3 enable counter */ TIM_Cmd(TIM3, ENABLE); while (1) {} }
void native_init(void) { NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; uint16_t PrescalerValue = 0; /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f10x_xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f10x.c file */ /* TIM1 clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); /* Configure the NVIC Preemption Priority Bits */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); /* Enable the TIM1 global Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* --------------------------------------------------------------- TIM1 Configuration: Up counting mode TIM1 counter clock at 1 MHz TIM1 generates an update event every 1000 pulses --------------------------------------------------------------- */ /* Compute the prescaler value */ PrescalerValue = (uint16_t) (SystemCoreClock/1000000) - 1; /* Time base configuration */ TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = 1000; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); /* Prescaler configuration */ TIM_PrescalerConfig(TIM1, PrescalerValue, TIM_PSCReloadMode_Immediate); /* Auto-reload preload configuration */ TIM_ARRPreloadConfig(TIM1, ENABLE); /* TIM IT enable */ TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); /* TIM1 enable counter */ TIM_Cmd(TIM1, ENABLE); /* Unlock the Flash Program Erase controller */ FLASH_Unlock(); /* EEPROM Init */ EE_Init(); }
void ConfigKernel() { //настраиваем ADC порт Current GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); //Voltage GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_Init(GPIOB, &GPIO_InitStructure); DMA_InitTypeDef DMA_InitStructure; /* DMA1 Channel1 Config */ DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)RegularConvData_Tab; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 2; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); /* DMA1 Channel1 enable */ DMA_Cmd(DMA1_Channel1, ENABLE); /* ADC DMA request in circular mode */ ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular); /* Enable ADC_DMA */ ADC_DMACmd(ADC1, ENABLE); /* ADC1 configuration ---------------*/ ADC_InitTypeDef ADC_InitStructure; ADC_DeInit(ADC1); ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;// DISABLE; // вкл/выкл непрерывное преобразование ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;// выравнивание ADC_InitStructure.ADC_Resolution=ADC_Resolution_12b; ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T15_TRGO;//чтобы ошибка не срабатывала ADC_InitStructure.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_ScanDirection=ADC_ScanDirection_Upward; ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 regular channel configuration */ ADC_ChannelConfig(ADC1, ADC_Channel_6, ADC_SampleTime_55_5Cycles);//current ADC_ChannelConfig(ADC1, ADC_Channel_9, ADC_SampleTime_55_5Cycles);//voltage /* Check the end of ADC1 reset calibration register */ ADC_GetCalibrationFactor(ADC1); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* DMA1 Channel1 enable */ DMA_Cmd(DMA1_Channel1, ENABLE); /* ADC DMA request in circular mode */ ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular); /* Enable ADC_DMA */ ADC_DMACmd(ADC1, ENABLE); /* Wait the ADCEN falg */ while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN)); //настраиваем TIM2_CH2 /* GPIOA Configuration: Channel 2 PA1*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN ; GPIO_Init(GPIOA, &GPIO_InitStructure); //прикрепляем АФ к таймеру 2 GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_2); TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); /* Time Base configuration */ TIM_TimeBaseStructure.TIM_Period = TimerPeriod; //TIM_TimeBaseStructure.TIM_Prescaler =3; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_OCStructInit(&TIM_OCInitStructure); /* Channel 2 Configuration in PWM mode */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_Pulse = Channel2CCR; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //Not use N port #ifdef INVERSEN TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; //Not use N port TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; //TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; //Not use N port #else TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low; //Not use N port TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; //TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Set; //Not use N port #endif TIM_OC2Init(TIM2, &TIM_OCInitStructure); // Как я понял - автоматическая перезарядка таймера. TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM2, ENABLE); TIM_CCxCmd(TIM2, TIM_Channel_2, TIM_CCx_Enable); /* TIM2 counter enable */ TIM_Cmd(TIM2, ENABLE); ADC_StartOfConversion(ADC1); State=StateStart; }
/*This function initializes the pins that are used in pwm, assigns them to their alternate functions, *and then initializes the TIM(ers) for those pins. For parameters, it takes the frequency of the pwm *and the prescaler for the clock. The frequency will work fine for anything bellow 525000, but it is *not guaranteed to work above that. The prescaler divides into the stm boards own internal clock to *get a clock speed for the timer. The prescaler works good at 1, but it can take any multiple of two *as its input. The function will return the period of the pwm which is used to calculate the duty cycle *when setting the pwm for each pin */ int32_t initialize_pwm_timers(uint32_t frequency, uint16_t preScaler) { // Enable TIM3 and GPIOC clocks RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; //structure used by stm in initializing pins. // Configure PC6-PC9 pins as AF, Pull-Down GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; //specifies which pins are used GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //assigns the pins to use their alternate functions GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); //initializes the structure // Since each pin has multiple extra functions, this part of the code makes the alternate functions the TIM3 functions. GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM3); GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM3); GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_TIM3); GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_TIM3); // Compute prescaler value for timebase uint32_t PrescalerValue = (uint32_t) ((SystemCoreClock /2) / (84000000 / preScaler)) - 1; //To figure out what the numbers do //second value in the divide is the frequency uint32_t PreCalPeriod = ((84000000 * preScaler) / frequency) - 1; //To figure out what the numbers do TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //structure used by stm in initializing the pwm TIM_OCInitTypeDef TIM_OCInitStructure; // Setup timebase for TIM3 TIM_TimeBaseStructure.TIM_Period = PreCalPeriod; //sets the period of the timer TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; //sets the prescaller which is divided into the cpu clock to get a clock speed that is small enough to use for timers TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //initializes this part of the code // Initialize TIM3 for 4 channels TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //sets the time to be pulse width TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_Pulse = 0; TIM_OC1Init(TIM3, &TIM_OCInitStructure); //initiates this part of the pulse width modulation TIM_OC2Init(TIM3, &TIM_OCInitStructure); TIM_OC3Init(TIM3, &TIM_OCInitStructure); TIM_OC4Init(TIM3, &TIM_OCInitStructure); // Enable TIM3 peripheral Preload register on CCR1 for 4 channels TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable); // Enable TIM3 peripheral Preload register on ARR. TIM_ARRPreloadConfig(TIM3, ENABLE); // Enable TIM3 counter TIM_Cmd(TIM3, ENABLE); return(PreCalPeriod); }
extern void pinMode( uint32_t ulPin, uint32_t ulMode ) { if ( ulPin > PINS_COUNT ) { return ; } GPIO_TypeDef *gpio_port = g_APinDescription[ulPin].pPort; uint16_t gpio_pin = g_APinDescription[ulPin].ulPin; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(g_APinDescription[ulPin].ulPeripheral,ENABLE); GPIO_InitStructure.GPIO_Pin = gpio_pin; switch ( ulMode ) { case INPUT: GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; break ; case INPUT_PULLUP: GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; break ; case INPUT_PULLDOWN: GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; break; case OUTPUT: GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; break ; case AF_OUTPUT_PUSHPULL: //Used internally for Alternate Function Output PushPull(TIM, UART, SPI etc) GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; break; case AF_OUTPUT_DRAIN: //Used internally for Alternate Function Output Drain(I2C etc) GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; break; case AN_INPUT: //Used internally for ADC Input GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; break; case OUTPUT_OD : //Used internally for ADC Input GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; break; #if 0 case TIMER_PWM: { uint32_t ulValue = 0; uint32_t ulChannel; if ( g_APinDescription[ulPin].ulTimerPeripheral == NULL) { // Defaults to digital write pinMode(ulPin, OUTPUT); ulValue = mapResolution(ulValue, _writeResolution, 8); if (ulValue < 128) digitalWrite(ulPin, LOW); else digitalWrite(ulPin, HIGH); return; } TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; uint16_t TIM_CCR = 0; ulValue = mapResolution(ulValue, _writeResolution, PWM_RESOLUTION); //对于PWM 模块来说 该函数直接返回ulValue. //PWM Frequency : 1000 Hz,Timer counter clk:1MHz uint16_t TIM_Prescaler = (uint16_t)(SystemCoreClock / 1000000) - 1; uint16_t TIM_ARR = (uint16_t)(1000000 / PWM_FREQUENCY) - 1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(gpio_port, &GPIO_InitStructure); if (!pinEnabled[ulPin]) { // Setup PWM for this pin // AFIO clock enable RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // TIM clock enable if(g_APinDescription[ulPin].ulTimerPeripheral == TIM1) RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE); else if(g_APinDescription[ulPin].ulTimerPeripheral == TIM2) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); } else if(g_APinDescription[ulPin].ulTimerPeripheral == TIM3) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); } else if(g_APinDescription[ulPin].ulTimerPeripheral == TIM4) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); } else if(g_APinDescription[ulPin].ulTimerPeripheral == TIM5) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); } else if(g_APinDescription[ulPin].ulTimerPeripheral == TIM8) RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8 , ENABLE); // Time base configuration TIM_TimeBaseStructure.TIM_Period = TIM_ARR; TIM_TimeBaseStructure.TIM_Prescaler = TIM_Prescaler; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//0 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //for TIM1 and TIM8 TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(g_APinDescription[ulPin].ulTimerPeripheral, &TIM_TimeBaseStructure); pinEnabled[ulPin] = 1; } // PWM1 Mode configuration TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_Pulse = TIM_CCR; //for TIM1 and TIM8 TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; if(g_APinDescription[ulPin].ulTimerChannel == TIM_Channel_1) { // PWM1 Mode configuration: Channel1 TIM_OC1Init(g_APinDescription[ulPin].ulTimerPeripheral, &TIM_OCInitStructure); TIM_OC1PreloadConfig(g_APinDescription[ulPin].ulTimerPeripheral, TIM_OCPreload_Enable); } else if(g_APinDescription[ulPin].ulTimerChannel == TIM_Channel_2) { // PWM1 Mode configuration: Channel2 TIM_OC2Init(g_APinDescription[ulPin].ulTimerPeripheral, &TIM_OCInitStructure); TIM_OC2PreloadConfig(g_APinDescription[ulPin].ulTimerPeripheral, TIM_OCPreload_Enable); } else if(g_APinDescription[ulPin].ulTimerChannel == TIM_Channel_3) { // PWM1 Mode configuration: Channel3 TIM_OC3Init(g_APinDescription[ulPin].ulTimerPeripheral, &TIM_OCInitStructure); TIM_OC3PreloadConfig(g_APinDescription[ulPin].ulTimerPeripheral, TIM_OCPreload_Enable); } else if(g_APinDescription[ulPin].ulTimerChannel == TIM_Channel_4) { // PWM1 Mode configuration: Channel4 TIM_OC4Init(g_APinDescription[ulPin].ulTimerPeripheral, &TIM_OCInitStructure); TIM_OC4PreloadConfig(g_APinDescription[ulPin].ulTimerPeripheral, TIM_OCPreload_Enable); } TIM_ARRPreloadConfig(g_APinDescription[ulPin].ulTimerPeripheral, ENABLE); // TIM enable counter TIM_Cmd(g_APinDescription[ulPin].ulTimerPeripheral, ENABLE); //for TIM1 and TIM8 TIM_CtrlPWMOutputs(g_APinDescription[ulPin].ulTimerPeripheral, ENABLE); } return; #endif default: break ; } GPIO_Init(gpio_port, &GPIO_InitStructure); }
static inline void LED_initLedRGB_old(void) { // rgb led on expansion board // green RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStructure); // blue RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure); // red RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_TIM3); GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM3); GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_TIM3); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; uint16_t TIM_Period = PWM_PERIOD_RAW; TIM_TimeBaseStructure.TIM_Prescaler = 42-1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = TIM_Period; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // not needed (only for TIM1 and TIM8) TIM_TimeBaseStructure.TIM_RepetitionCounter = TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); uint32_t CCR_Val1 = TIM_Period>>3; // 1/8 uint32_t CCR_Val2 = TIM_Period>>2; // 1/4 uint32_t CCR_Val3 = TIM_Period>>1; // 1/2 TIM_OCInitTypeDef TIM_OCInitStructure; /* PWM1 Mode configuration: Channel1 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; TIM_OCInitStructure.TIM_Pulse = CCR_Val1; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; TIM_OCInitStructure.TIM_Pulse = CCR_Val2; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; TIM_OC2Init(TIM3, &TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; TIM_OCInitStructure.TIM_Pulse = CCR_Val3; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; TIM_OC3Init(TIM3, &TIM_OCInitStructure); TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM3, ENABLE); /* TIM1 Main Output Enable */ TIM_CtrlPWMOutputs(TIM3, ENABLE); TIM_SetCounter(TIM3, 0); TIM_Cmd(TIM3, ENABLE); }
void motorInit(/*float imotorKp, float imotorKi, float imotorKd,*/ float icurrentKp, float icurrentKi, uint32_t icpr) { // motorKp = imotorKp; // motorKi = imotorKi; // motorKd = imotorKd; cpr = icpr; currentKp = icurrentKp; currentKi = icurrentKi; maxWidthReached = false; for(int i = 0; i < 2; i++){ cte_int[i] = 0; cte_prev[i] = 0; prev_enc[i] = 0; cur_speed[i] = 0; cur_pos[i] = 0; motor_width[i] = 0; motorEnable[i] = false; motorUpdate[i] = true; set_speed[i] = 0; des_set_speed[i] = 0; set_pos[i] = 0; maxWidthCoeff[i] = MAX_MAX_WIDTH_COEFF; currentCteInt[i] = 0; } RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_InitTypeDef gpioInit; gpioInit.GPIO_Mode = GPIO_Mode_AF_PP; gpioInit.GPIO_Speed = GPIO_Speed_50MHz; gpioInit.GPIO_Pin = OUT_FWD_1 | OUT_FWD_2; GPIO_Init(OUT_PORT_FWD, &gpioInit); gpioInit.GPIO_Pin = OUT_BCKWD_1 | OUT_BCKWD_2; GPIO_Init(OUT_PORT_BCKWD, &gpioInit); gpioInit.GPIO_Mode = GPIO_Mode_IN_FLOATING; gpioInit.GPIO_Pin = IN_A_1 | IN_B_1; GPIO_Init(IN_1_PORT, &gpioInit); gpioInit.GPIO_Mode = GPIO_Mode_IN_FLOATING; gpioInit.GPIO_Pin = IN_A_2 | IN_B_2; GPIO_Init(IN_2_PORT, &gpioInit); //Encoder left RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); TIM_ICInitTypeDef icInit; icInit.TIM_Channel = TIM_Channel_1; icInit.TIM_ICPolarity = TIM_ICPolarity_Rising; icInit.TIM_ICFilter = 0; icInit.TIM_ICPrescaler = TIM_ICPSC_DIV1; icInit.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInit(TIM4, &icInit); icInit.TIM_Channel = TIM_Channel_2; TIM_ICInit(TIM4, &icInit); TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); TIM_SetAutoreload(TIM4, 0xffff); TIM_SetCounter(TIM4, 0); TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); NVIC_InitTypeDef initNVIC; initNVIC.NVIC_IRQChannel = TIM4_IRQn; initNVIC.NVIC_IRQChannelPreemptionPriority = 0; initNVIC.NVIC_IRQChannelSubPriority = 0; initNVIC.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&initNVIC); TIM_Cmd(TIM4, ENABLE); //Encoder right RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); icInit.TIM_Channel = TIM_Channel_1; icInit.TIM_ICPolarity = TIM_ICPolarity_Rising; icInit.TIM_ICFilter = 0; icInit.TIM_ICPrescaler = TIM_ICPSC_DIV1; icInit.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInit(TIM3, &icInit); icInit.TIM_Channel = TIM_Channel_2; TIM_ICInit(TIM3, &icInit); TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); TIM_SetAutoreload(TIM3, 0xffff); TIM_SetCounter(TIM3, 0); TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); initNVIC.NVIC_IRQChannel = TIM3_IRQn; initNVIC.NVIC_IRQChannelPreemptionPriority = 0; initNVIC.NVIC_IRQChannelSubPriority = 0; initNVIC.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&initNVIC); GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); TIM_Cmd(TIM3, ENABLE); //PWM RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); TIM_TimeBaseInitTypeDef tim1Init; TIM_OCInitTypeDef ocInit; tim1Init.TIM_Period = MAX_WIDTH; tim1Init.TIM_Prescaler = 1; tim1Init.TIM_ClockDivision = 0; tim1Init.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &tim1Init); /* PWM1 Mode configuration: Channel2 */ ocInit.TIM_OCMode = TIM_OCMode_Inactive; ocInit.TIM_Pulse = 0; ocInit.TIM_OCPolarity = TIM_OCPolarity_High; ocInit.TIM_OCNPolarity = TIM_OCNPolarity_High; ocInit.TIM_OutputState = TIM_OutputState_Enable; ocInit.TIM_OutputNState = TIM_OutputNState_Disable; TIM_OC1Init(TIM1, &ocInit); TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); ocInit.TIM_OutputState = TIM_OutputState_Disable; ocInit.TIM_OutputNState = TIM_OutputNState_Enable; TIM_OC2Init(TIM1, &ocInit); TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); ocInit.TIM_OutputState = TIM_OutputState_Disable; ocInit.TIM_OutputNState = TIM_OutputNState_Enable; TIM_OC3Init(TIM1, &ocInit); TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable); ocInit.TIM_OutputState = TIM_OutputState_Enable; ocInit.TIM_OutputNState = TIM_OutputNState_Disable; TIM_OC4Init(TIM1, &ocInit); TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM_CtrlPWMOutputs(TIM1, ENABLE); TIM_ARRPreloadConfig(TIM1, ENABLE); /* TIM1 enable counter */ TIM_Cmd(TIM1, ENABLE); }
//TIM5per:重装值 //Compare1:比较捕获1的预装载值 void Motor_Init(u16 TIM5per, u16 TIM1per, u16 TIM1Compare1) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_OCInitTypeDef TIM_OCInitStruct; GPIO_InitTypeDef GPIO_InitStruct; NVIC_InitTypeDef NVIC_InitStructure; /*EXTI初始化结构体*/ EXTI_InitTypeDef EXTI_InitStructure; /*所需时钟 打开 定时器 1 5,PE9 复用时钟 如需软件 仿真 不能使用管脚映射 直接 使用PA8 注意更改管脚时钟和 初始化相关*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//使能定时器1的时钟 // RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);//使能定时器5的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);//使能GPIOE时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//使能复用IO时钟 /*传感器信号 管脚配置*/ /*开启时钟GPIOD*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); /*外部中断GPIOD1*/ GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1| GPIO_Pin_2 | GPIO_Pin_4; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &GPIO_InitStruct); // GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2; // GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; // GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // GPIO_Init(GPIOD, &GPIO_InitStruct); GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource1); GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource2); GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource4); /*OVER*/ GPIO_PinRemapConfig(GPIO_FullRemap_TIM1, ENABLE); ////Timer1完全映射 TIM1_CH1->PE9 TIM2_CH2->PE11 /*设置定时器1 TIM1_CH1 PE9 为 复用推挽*/ GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_11; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &GPIO_InitStruct); GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//复用推挽输出 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &GPIO_InitStruct); /*设置方向IO PE0 为 推挽*/ GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//复用推挽输出 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE,&GPIO_InitStruct); //// /*TIM5 计时定时器 配置 */ //// TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//没有时钟分割 //// TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式 //// TIM_TimeBaseInitStruct.TIM_Prescaler = 7199;//预分频值,每100us计数一次 //// TIM_TimeBaseInitStruct.TIM_Period = TIM5per;//重装值 //// TIM_TimeBaseInit(TIM5, &TIM_TimeBaseInitStruct); //// //// TIM_ITConfig(TIM5, TIM_IT_Update|TIM_IT_Trigger,ENABLE);//使能定时器5更新触发中断 //// TIM_ARRPreloadConfig(TIM5, ENABLE);//使能重装载 //// TIM_Cmd(TIM5, DISABLE); //暂时不使能TIMx外设 /*NPN开关设置外部中断通道1在上升沿触发中断*/ EXTI_InitStructure.EXTI_Line = EXTI_Line1; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /*NPN开关设置外部中断通道2在上升沿触发中断*/ EXTI_InitStructure.EXTI_Line = EXTI_Line2; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /*原点触发中断*/ EXTI_InitStructure.EXTI_Line = EXTI_Line4; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); #ifdef VECT_TAB_RAM /* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else /* VECT_TAB_FLASH */ /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif /* 选择NVIC优先分组4 所有4位用于抢占式优先级 */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); //// /*定时器5更新中断配置*/ //// NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn; //TIM5中断 //// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PWM_TIM_PRIO; //先占优先级 //// NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级 //// NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 //// NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 /*使能EXTI1_IRQn 优先级*/ NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = LS_EXTI_PRIO; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /*使能EXTI2_IRQn 优先级*/ NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = LS_EXTI_PRIO; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /*使能原点 优先级*/ NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = LS_EXTI_PRIO; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /*TIM1 脉冲输出定时器配置*/ //TIM1工作 预分频值 TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//没有时钟分割 TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式 TIM_TimeBaseInitStruct.TIM_Prescaler = 719;//预分频值,每10us计数一次 TIM_TimeBaseInitStruct.TIM_Period = TIM1per;//重装值 TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct); TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2;//在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平 TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//OC1输出使能 TIM_OCInitStruct.TIM_OutputNState = TIM_OutputNState_Disable; TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//有效电平为高 TIM_OCInitStruct.TIM_Pulse = TIM1Compare1;// 比较捕获5的预装载值 TIM_OC2Init(TIM1,&TIM_OCInitStruct); TIM_CtrlPWMOutputs(TIM1, ENABLE); //高级定时器需要使用此函数 TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);//使能定时器1的通道1预装载寄存器 TIM_ARRPreloadConfig(TIM1, ENABLE); TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);//使能定时器1更新触发中断 TIM_Cmd(TIM1,DISABLE);//先不使能能TIM1 /*定时器1更新中断配置*/ NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; //TIM5中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PWM_TIM1_PRIO; //先占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 /*TIM1 END*/ }
void Tim::configureArrPreload(FunctionalState enable) { TIM_ARRPreloadConfig(_tim, enable); }
void speedmonitor_start() { /* Get reference of MCT*/ oMCT = GetMCT(M1); oCSTM = MCT_GetStateMachine(oMCT); /*Get the CSPD instance of SpeednPosFdbk Class */ CSPD xCSPD = MCT_GetSpeednPosSensorMain(oMCT); /* It controls the status of State Machine*/ switch (STM_GetState(oCSTM)) { case RUN: { if(flag_INIT_TIM5 == TRUE) { flag_INIT_TIM5 = FALSE; /* TIM5 clock enabled */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, (FunctionalState)ENABLE); // GPIO_InitTypeDef GPIO_InitStructure; // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // GPIO_Init(GPIOA, &GPIO_InitStructure); /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = 65530; TIM_TimeBaseStructure.TIM_Prescaler = 17; //2MHz clock TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); /* PWM1 Mode configuration: Channel1 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC4Init(TIM5, &TIM_OCInitStructure); TIM_ARRPreloadConfig(TIM5, (FunctionalState)ENABLE); /* TIM3 enable counter */ TIM_Cmd(TIM5, (FunctionalState)ENABLE); } } break; case IDLE: { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* TIM5 disable counter */ TIM_Cmd(TIM5, (FunctionalState)DISABLE); flag_INIT_TIM5 = TRUE; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable; TIM_OC4Init(TIM5, &TIM_OCInitStructure); } break; } }
//-------------------------------------------------------------- // interne Funktion // Init vom Timer //-------------------------------------------------------------- void P_PWM_InitTIM(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; PWM_TIM5_NAME_t pwm_name; uint16_t wert; // Clock enable RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); // Timer init TIM_TimeBaseStructure.TIM_Period = PWM_TIM5_PERIODE; TIM_TimeBaseStructure.TIM_Prescaler = PWM_TIM5_PRESCALE; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); for(pwm_name=0;pwm_name<PWM_TIM5_ANZ;pwm_name++) { if(PWM_TIM5[pwm_name].CHANNEL==1) { // Channel 1 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; wert=PWM_TIM5[pwm_name].PWM_INIT; if(wert>PWM_TIM5_PERIODE) wert=PWM_TIM5_PERIODE; TIM_OCInitStructure.TIM_Pulse = wert; TIM_OCInitStructure.TIM_OCPolarity = PWM_TIM5_POLARITY; TIM_OC1Init(TIM5, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable); } if(PWM_TIM5[pwm_name].CHANNEL==2) { // Channel 2 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; wert=PWM_TIM5[pwm_name].PWM_INIT; if(wert>PWM_TIM5_PERIODE) wert=PWM_TIM5_PERIODE; TIM_OCInitStructure.TIM_Pulse = wert; TIM_OCInitStructure.TIM_OCPolarity = PWM_TIM5_POLARITY; TIM_OC2Init(TIM5, &TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM5, TIM_OCPreload_Enable); } if(PWM_TIM5[pwm_name].CHANNEL==3) { // Channel 3 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; wert=PWM_TIM5[pwm_name].PWM_INIT; if(wert>PWM_TIM5_PERIODE) wert=PWM_TIM5_PERIODE; TIM_OCInitStructure.TIM_Pulse = wert; TIM_OCInitStructure.TIM_OCPolarity = PWM_TIM5_POLARITY; TIM_OC3Init(TIM5, &TIM_OCInitStructure); TIM_OC3PreloadConfig(TIM5, TIM_OCPreload_Enable); } if(PWM_TIM5[pwm_name].CHANNEL==4) { // Channel 4 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; wert=PWM_TIM5[pwm_name].PWM_INIT; if(wert>PWM_TIM5_PERIODE) wert=PWM_TIM5_PERIODE; TIM_OCInitStructure.TIM_Pulse = wert; TIM_OCInitStructure.TIM_OCPolarity = PWM_TIM5_POLARITY; TIM_OC4Init(TIM5, &TIM_OCInitStructure); TIM_OC4PreloadConfig(TIM5, TIM_OCPreload_Enable); } } // Timer enable TIM_ARRPreloadConfig(TIM5, ENABLE); TIM_Cmd(TIM5, ENABLE); }
/** * @brief Configures the TIM Peripheral. * @param None * @retval None */ static void TIM4_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /* --------------------------- System Clocks Configuration -----------------*/ /* TIM4 clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); /* GPIOD clock enable */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); /*-------------------------- GPIO Configuration ----------------------------*/ /* GPIOD Configuration: Pins 12, 13, 14 and 15 in output push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(GPIOD, &GPIO_InitStructure); /* Connect TIM4 pins to AF2 */ GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_TIM4); GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_TIM4); GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_TIM4); GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_TIM4); /* ----------------------------------------------------------------------- TIM4 Configuration: Output Compare Timing Mode: In this example TIM4 input clock (TIM4CLK) is set to 2 * APB1 clock (PCLK1), since APB1 prescaler is different from 1 (APB1 Prescaler = 4, see system_stm32f4xx.c file). TIM4CLK = 2 * PCLK1 PCLK1 = HCLK / 4 => TIM4CLK = 2*(HCLK / 4) = HCLK/2 = SystemCoreClock/2 To get TIM4 counter clock at 2 KHz, the prescaler is computed as follows: Prescaler = (TIM4CLK / TIM1 counter clock) - 1 Prescaler = (168 MHz/(2 * 2 KHz)) - 1 = 41999 To get TIM4 output clock at 1 Hz, the period (ARR)) is computed as follows: ARR = (TIM4 counter clock / TIM4 output clock) - 1 = 1999 TIM4 Channel1 duty cycle = (TIM4_CCR1/ TIM4_ARR)* 100 = 50% TIM4 Channel2 duty cycle = (TIM4_CCR2/ TIM4_ARR)* 100 = 50% TIM4 Channel3 duty cycle = (TIM4_CCR3/ TIM4_ARR)* 100 = 50% TIM4 Channel4 duty cycle = (TIM4_CCR4/ TIM4_ARR)* 100 = 50% ==> TIM4_CCRx = TIM4_ARR/2 = 1000 (where x = 1, 2, 3 and 4). Note: SystemCoreClock variable holds HCLK frequency and is defined in system_stm32f4xx.c file. Each time the core clock (HCLK) changes, user had to call SystemCoreClockUpdate() function to update SystemCoreClock variable value. Otherwise, any configuration based on this variable will be incorrect. ----------------------------------------------------------------------- */ /* Compute the prescaler value */ PrescalerValue = (uint16_t) ((SystemCoreClock /2) / 2000) - 1; /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = TIM_ARR; TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); /* Enable TIM4 Preload register on ARR */ TIM_ARRPreloadConfig(TIM4, ENABLE); /* TIM PWM1 Mode configuration: Channel */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = TIM_CCR; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; /* Output Compare PWM1 Mode configuration: Channel1 */ TIM_OC1Init(TIM4, &TIM_OCInitStructure); TIM_CCxCmd(TIM4, TIM_Channel_1, DISABLE); TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); /* Output Compare PWM1 Mode configuration: Channel2 */ TIM_OC2Init(TIM4, &TIM_OCInitStructure); TIM_CCxCmd(TIM4, TIM_Channel_2, DISABLE); TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); /* Output Compare PWM1 Mode configuration: Channel3 */ TIM_OC3Init(TIM4, &TIM_OCInitStructure); TIM_CCxCmd(TIM4, TIM_Channel_3, DISABLE); TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable); /* Output Compare PWM1 Mode configuration: Channel4 */ TIM_OC4Init(TIM4, &TIM_OCInitStructure); TIM_CCxCmd(TIM4, TIM_Channel_4, DISABLE); TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable); /* TIM4 enable counter */ TIM_Cmd(TIM4, ENABLE); }
/* 使用的是定时器TIM3,CH1-4对应舵机1-4 */ void Servo_TIM_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; uint16_t CCR_Val = 50; //初始脉宽为0.5ms,舵机0度 uint16_t PrescalerValue = 0; /* TIM3 clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /* GPIOC clock enable */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); /* GPIOC Configuration: TIM3 CH1 (PC6), TIM3 CH2 (PC7), TIM3 CH3 (PC8) and TIM3 CH4 (PC9) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ; GPIO_Init(GPIOC, &GPIO_InitStructure); /* Connect TIM3 pins to AF2 */ GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM3); GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM3); GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_TIM3); GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_TIM3); /* ------官方例程里的注释,供参考 给出了设置频率和占空比的方法------------------------------------------- TIM3 Configuration: generate 4 PWM signals with 4 different duty cycles. In this example TIM3 input clock (TIM3CLK) is set to 2 * APB1 clock (PCLK1), since APB1 prescaler is different from 1. TIM3CLK = 2 * PCLK1 PCLK1 = HCLK / 4 => TIM3CLK = HCLK / 2 = SystemCoreClock /2 To get TIM3 counter clock at 21 MHz, the prescaler is computed as follows: Prescaler = (TIM3CLK / TIM3 counter clock) - 1 Prescaler = ((SystemCoreClock /2) /21 MHz) - 1 To get TIM3 output clock at 30 KHz, the period (ARR)) is computed as follows: ARR = (TIM3 counter clock / TIM3 output clock) - 1 = 665 TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 = 50% TIM3 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR)* 100 = 37.5% TIM3 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR)* 100 = 25% TIM3 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR)* 100 = 12.5% Note: SystemCoreClock variable holds HCLK frequency and is defined in system_stm32f4xx.c file. Each time the core clock (HCLK) changes, user had to call SystemCoreClockUpdate() function to update SystemCoreClock variable value. Otherwise, any configuration based on this variable will be incorrect. ----------------------------------------------------------------------- */ /* 这里将四个通道全部配置成50Hz 以便驱动舵机 */ /* Compute the prescaler value 定时器的时钟设置到100K*/ PrescalerValue = (uint16_t) ((168000000 /2) / 100000) - 1; /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = 2000 - 1; TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /* PWM1 Mode configuration: Channel1-Channel4 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR_Val; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_OC2Init(TIM3, &TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_OC3Init(TIM3, &TIM_OCInitStructure); TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_OC4Init(TIM3, &TIM_OCInitStructure); TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_InternalClockConfig(TIM3); TIM_ARRPreloadConfig(TIM3, ENABLE); /* TIM3 enable counter */ TIM_Cmd(TIM3, ENABLE); }
/** * @brief Main program * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f2xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f2xx.c file */ /* TIM Configuration */ TIM_Config(); /* --------------------------------------------------------------------------- TIM10 Configuration: generate 1 PWM signal: In this example TIM10 input clock (TIM10CLK) is set to 2 * APB2 clock (PCLK2), since APB2 prescaler is different from 1. TIM10CLK = 2 * PCLK2 PCLK2 = HCLK / 2 => TIM10CLK = HCLK = SystemCoreClock To get TIM10 counter clock at 20 MHz, the prescaler is computed as follows: Prescaler = (TIM10CLK / TIM10 counter clock) - 1 Prescaler = (SystemCoreClock /20 MHz) - 1 To get TIM10 output clock at 30 KHz, the period (TIM10_ARR) is computed as follows: ARR = (TIM10 counter clock / TIM10 output clock) - 1 = 665 TIM10 Channel1 duty cycle = (TIM10_CCR1/ TIM10_ARR)* 100 = 50% Note: SystemCoreClock variable holds HCLK frequency and is defined in system_stm32f2xx.c file. Each time the core clock (HCLK) changes, user had to call SystemCoreClockUpdate() function to update SystemCoreClock variable value. Otherwise, any configuration based on this variable will be incorrect. --------------------------------------------------------------------------- */ /* Compute the prescaler value */ PrescalerValue = (uint16_t) (SystemCoreClock / 20000000) - 1; /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = 665; TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM10, &TIM_TimeBaseStructure); /* PWM1 Mode configuration: Channel1 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR1_Val; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM10, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM10, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM10, ENABLE); /* TIM10 enable counter */ TIM_Cmd(TIM10, ENABLE); while (1) {} }
/************************************************************************* * Function Name: GLCD_LLInit * Parameters: none * Return: none * * Description: Init Reset and Backlight control outputs * *************************************************************************/ void GLCD_LLInit (void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; GPIO_InitTypeDef GPIO_InitStructure; TIM_OCInitTypeDef TIM_OCInitStructure; /* Enable GPIO clock and release reset*/ RCC_AHB1PeriphClockCmd(LCD_RST_CLK | LCD_BL_CLK, ENABLE); RCC_AHB1PeriphResetCmd(LCD_RST_CLK | LCD_BL_CLK,DISABLE); /*LCD Reset pin init*/ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Pin = LCD_RST_MASK; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LCD_RST_PORT, &GPIO_InitStructure); GLCD_SetReset(0); /* LCD backlight Init*/ // PWM DAC (TIM3/CH3) GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Pin = LCD_BL_MASK; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LCD_BL_PORT, &GPIO_InitStructure); GPIO_PinAFConfig(LCD_BL_PORT,LCD_BL_PIN_SOURCE,LCD_BL_PIN_AF); // Init PWM TIM3 // Enable Timer3 clock and release reset RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3,DISABLE); TIM_InternalClockConfig(TIM3); // Time base configuration TIM_TimeBaseStructure.TIM_Prescaler = 140; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = 0xFF; // 8 bit resolution TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); // Channel 4 Configuration in PWM mode TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; TIM_OCInitStructure.TIM_Pulse = 0x00; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; TIM_OC3Init(TIM3,&TIM_OCInitStructure); // Double buffered TIM_ARRPreloadConfig(TIM3,ENABLE); // TIM3 counter enable TIM_Cmd(TIM3,ENABLE); GLCD_Backlight(0); }
void RGBLED_GPIO_Config(uint16_t PrescalerValue) { /* GPIOA Periph clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM7, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_Init(GPIOB, &GPIO_InitStructure); TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); /* ----------------------------------------------------------------------- TIM3 Configuration: generate 4 PWM signals with 4 different duty cycles: The TIM3CLK frequency is set to SystemCoreClock (Hz), to get TIM3 counter clock at 24 MHz the Prescaler is computed as following: - Prescaler = (TIM3CLK / TIM3 counter clock) - 1 SystemCoreClock is set to 72 MHz for Low-density, Medium-density, High-density and Connectivity line devices and to 24 MHz for Low-Density Value line and Medium-Density Value line devices The TIM3 is running at 36 KHz: TIM3 Frequency = TIM3 counter clock/(ARR + 1) = 24 MHz / 666 = 36 KHz TIM1 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 = 50% TIM1 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR)* 100 = 37.5% TIM1 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR)* 100 = 25% ----------------------------------------------------------------------- */ /* Compute the prescaler value */ //uint16_t PrescalerValue = (uint16_t) (SystemCoreClock / 24000000) - 1; /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = 255; TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_ARRPreloadConfig(TIM3, ENABLE); /* TIM3 enable counter */ TIM_Cmd(TIM3, ENABLE); TIM_TimeBaseStructure.TIM_Period = 1023; TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; TIM_TimeBaseInit(TIM7, &TIM_TimeBaseStructure); /* TIM7 TRGO selection */ TIM_SelectOutputTrigger(TIM7, TIM_TRGOSource_Update); TIM_ITConfig(TIM7, TIM_IT_Update, ENABLE); NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //TIM_GenerateEvent(TIM7, TIM_EventSource_Update); }
/*=====================================================================================================*/ void PWM_Config( void ) { GPIO_InitTypeDef GPIO_Struct; TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct; TIM_OCInitTypeDef TIM_OCInitStruct; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM4, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); /* TIM2 PWM1 PA1 */ /* TIM2 PWM2 PA2 */ /* TIM2 PWM3 PA3 */ /* TIM3 PWM4 PA6 */ /* TIM3 PWM5 PA7 */ GPIO_Struct.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_Struct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Struct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_Struct); /* TIM3 PWM6 PB0 */ /* TIM3 PWM7 PB1 */ /* TIM4 PWM8 PB6 */ /* TIM4 PWM9 PB7 */ /* TIM4 PWM10 PB8 */ /* TIM4 PWM11 PB9 */ GPIO_Struct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; GPIO_Struct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Struct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOB, &GPIO_Struct); TIM_DeInit(TIM2); TIM_DeInit(TIM3); TIM_DeInit(TIM4); /************************** PWM Output **************************************/ /* 設定 TIM2 TIM3 TIM4 Time Base */ TIM_TimeBaseStruct.TIM_Period = (int16_t)(2500-1); // 週期 = 2.5ms, 400Hz TIM_TimeBaseStruct.TIM_Prescaler = (int16_t)(72-1); // 除頻72 = 1M ( 1us ) TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up; // 上數 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStruct); TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStruct); TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStruct); /* 設定 TIM2 TIM3 TIM4 OC */ TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; // 配置為 PWM1 模式 TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; // 致能 OC TIM_OCInitStruct.TIM_Pulse = PWM_MOTOR_MIN; // 設置跳變值 TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; // 當計數值小於 PWM_MOTOR_MIN 時為高電平 TIM_OC2Init(TIM2, &TIM_OCInitStruct); // 初始化 TIM2 OC2 TIM_OC3Init(TIM2, &TIM_OCInitStruct); // 初始化 TIM2 OC3 TIM_OC4Init(TIM2, &TIM_OCInitStruct); // 初始化 TIM2 OC4 TIM_OC1Init(TIM3, &TIM_OCInitStruct); // 初始化 TIM3 OC1 TIM_OC2Init(TIM3, &TIM_OCInitStruct); // 初始化 TIM3 OC2 TIM_OC3Init(TIM3, &TIM_OCInitStruct); // 初始化 TIM3 OC3 TIM_OC4Init(TIM3, &TIM_OCInitStruct); // 初始化 TIM3 OC4 TIM_OC1Init(TIM4, &TIM_OCInitStruct); // 初始化 TIM4 OC1 TIM_OC2Init(TIM4, &TIM_OCInitStruct); // 初始化 TIM4 OC2 TIM_OC3Init(TIM4, &TIM_OCInitStruct); // 初始化 TIM4 OC3 TIM_OC4Init(TIM4, &TIM_OCInitStruct); // 初始化 TIM4 OC4 TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable); // 致能 TIM2 OC2 預裝載 TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable); // 致能 TIM2 OC3 預裝載 TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable); // 致能 TIM2 OC4 預裝載 TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); // 致能 TIM3 OC1 預裝載 TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); // 致能 TIM3 OC2 預裝載 TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); // 致能 TIM3 OC3 預裝載 TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable); // 致能 TIM3 OC4 預裝載 TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); // 致能 TIM4 OC1 預裝載 TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); // 致能 TIM4 OC2 預裝載 TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable); // 致能 TIM4 OC3 預裝載 TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable); // 致能 TIM4 OC4 預裝載 /* 啟動 */ TIM_ARRPreloadConfig(TIM2, ENABLE); // 致能 TIM2 重載寄存器ARR TIM_ARRPreloadConfig(TIM3, ENABLE); // 致能 TIM3 重載寄存器ARR TIM_ARRPreloadConfig(TIM4, ENABLE); // 致能 TIM4 重載寄存器ARR TIM_Cmd(TIM2, ENABLE); // 致能 TIM2 TIM_Cmd(TIM3, ENABLE); // 致能 TIM3 TIM_Cmd(TIM4, ENABLE); // 致能 TIM4 }