* ATmega164, ATmega324, ATmega644, ATmega644P, ATmega1284\r
* ATmega88, ATmega88P, ATmega168, ATmega168P, ATmega328P\r
*\r
- * $Id: irsnd.c,v 1.54 2012/05/23 12:26:26 fm Exp $\r
+ * $Id: irsnd.c,v 1.55 2012/05/24 06:55:11 fm Exp $\r
*\r
* This program is free software; you can redistribute it and/or modify\r
* it under the terms of the GNU General Public License as published by\r
# if defined(PIC_C18) // PIC C18\r
IRSND_PIN = 0; // output mode -> enable PWM outout pin (0=PWM on, 1=PWM off)\r
# elif defined (ARM_STM32) // STM32\r
+ IRSND_TIMER->CCER |= (uint16_t)TIM_CCER_CC1E;\r
TIM_Cmd(IRSND_TIMER, ENABLE); // TIMx enable counter\r
# else // AVR\r
# if IRSND_OCx == IRSND_OC2 // use OC2\r
# if defined(PIC_C18) // PIC C18\r
IRSND_PIN = 1; //input mode -> disbale PWM output pin (0=PWM on, 1=PWM off)\r
# elif defined (ARM_STM32) // STM32\r
+ IRSND_TIMER->CCER &= (uint16_t)(~(uint16_t)TIM_CCER_CC1E);\r
TIM_Cmd(IRSND_TIMER, DISABLE); // TIMx enable counter\r
# else //AVR\r
\r
OpenPWM(freq); \r
SetDCPWM( (uint16_t) freq * 2); // freq*2 = Duty cycles 50%\r
# elif defined (ARM_STM32) // STM32\r
- static uint32_t TimeBaseFreq = 0;\r
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;\r
- TIM_OCInitTypeDef TIM_OCInitStructure;\r
+ static uint32_t TimeBaseFreq = 0;\r
\r
if (TimeBaseFreq == 0)\r
{\r
/* Get system clocks and store timer clock in variable */\r
RCC_GetClocksFreq(&RCC_ClocksStructure);\r
# if ((IRSND_TIMER_NUMBER >= 2) && (IRSND_TIMER_NUMBER <= 5)) || ((IRSND_TIMER_NUMBER >= 12) && (IRSND_TIMER_NUMBER <= 14))\r
- TimeBaseFreq = RCC_ClocksStructure.PCLK1_Frequency;\r
+ if (RCC_ClocksStructure.PCLK1_Frequency == RCC_ClocksStructure.HCLK_Frequency)\r
+ {\r
+ TimeBaseFreq = RCC_ClocksStructure.PCLK1_Frequency;\r
+ }\r
+ else\r
+ {\r
+ TimeBaseFreq = RCC_ClocksStructure.PCLK1_Frequency * 2;\r
+ }\r
# else\r
- TimeBaseFreq = RCC_ClocksStructure.PCLK2_Frequency;\r
+ if (RCC_ClocksStructure.PCLK2_Frequency == RCC_ClocksStructure.HCLK_Frequency)\r
+ {\r
+ TimeBaseFreq = RCC_ClocksStructure.PCLK2_Frequency;\r
+ }\r
+ else\r
+ {\r
+ TimeBaseFreq = RCC_ClocksStructure.PCLK2_Frequency * 2;\r
+ }\r
# endif\r
}\r
\r
freq = TimeBaseFreq/freq;\r
\r
- /* Time base configuration */\r
- TIM_TimeBaseStructure.TIM_Period = freq;\r
- TIM_TimeBaseStructure.TIM_Prescaler = 0;\r
- TIM_TimeBaseStructure.TIM_ClockDivision = 0;\r
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;\r
- TIM_TimeBaseInit(IRSND_TIMER, &TIM_TimeBaseStructure);\r
-\r
- /* PWM1 Mode configuration: Channel1 */\r
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;\r
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;\r
- TIM_OCInitStructure.TIM_Pulse = (freq + 1) / 2;\r
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;\r
- TIM_OC1Init(IRSND_TIMER, &TIM_OCInitStructure);\r
-\r
+ /* Set frequency */\r
+ TIM_SetAutoreload(IRSND_TIMER, freq);\r
+ /* Set duty cycle */\r
+ TIM_SetCompare1(IRSND_TIMER, (freq + 1) / 2);\r
# else // AVR\r
\r
# if IRSND_OCx == IRSND_OC2\r
irsnd_set_freq (IRSND_FREQ_36_KHZ); //default frequency\r
IRSND_PIN = 1; //default PWM output pin off (0=PWM on, 1=PWM off)\r
# elif defined (ARM_STM32) // STM32\r
- GPIO_InitTypeDef GPIO_InitStructure;\r
+ GPIO_InitTypeDef GPIO_InitStructure;\r
+ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;\r
+ TIM_OCInitTypeDef TIM_OCInitStructure;\r
\r
/* GPIOx clock enable */\r
# if defined (ARM_STM32L1XX)\r
# else\r
RCC_APB2PeriphClockCmd(IRSND_TIMER_RCC, ENABLE);\r
# endif\r
- irsnd_set_freq (IRSND_FREQ_36_KHZ); // default frequency\r
\r
- /* TIMx Configuration */\r
+ /* Time base configuration */\r
+ TIM_TimeBaseStructure.TIM_Period = 0; // will be initialized later\r
+ TIM_TimeBaseStructure.TIM_Prescaler = 0;\r
+ TIM_TimeBaseStructure.TIM_ClockDivision = 0;\r
+ TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;\r
+ TIM_TimeBaseInit(IRSND_TIMER, &TIM_TimeBaseStructure);\r
+\r
+ /* PWM1 Mode configuration */\r
+ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;\r
+ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;\r
+ TIM_OCInitStructure.TIM_Pulse = 0; // will be initialized later\r
+ TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;\r
+ TIM_OC1Init(IRSND_TIMER, &TIM_OCInitStructure);\r
+\r
+ /* Preload configuration */\r
TIM_OC1PreloadConfig(IRSND_TIMER, TIM_OCPreload_Enable);\r
TIM_ARRPreloadConfig(IRSND_TIMER, ENABLE);\r
- TIM_Cmd(IRSND_TIMER, ENABLE);\r
+\r
+ irsnd_set_freq (IRSND_FREQ_36_KHZ); // default frequency\r
# else // AVR\r
IRSND_PORT &= ~(1<<IRSND_BIT); // set IRSND_BIT to low\r
IRSND_DDR |= (1<<IRSND_BIT); // set IRSND_BIT to output\r