puff, finalmente ho messo in piedi qualcosa...
il PWM per la stm32f4, però non so se funziona (finito or ora!), posto il codice così magari qualcuno a caso ( ) mi da una correzione
volatile uint16_t position[] = { 1000, 1000, 1000, 1000 }; //from 1000 to 2000
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
TIM3->CCR1 = position[0]; //PB0
TIM3->CCR2 = position[1]; //PB1
TIM3->CCR3 = position[2]; //PB4
TIM3->CCR4 = position[3]; //PB5
}
}
void startPWM(){
/*
* BASED ON https://my.st.com/public/STe2ecommunities/mcu/Lists/STM32VLDiscovery/Flat.aspx?RootFolder=/public/STe2ecommunities/mcu/Lists/STM32VLDiscovery/Servo%20control%20using%20STM32VLDiscovery&FolderCTID=0x01200200770978C69A1141439FE559EB459D758000491D59B8574F8049B5DFA3E8B21CBA51&TopicsView=https://my.st.com/public/STe2ecommunities/mcu/Lists/STM32VLDiscovery/AllItems.aspx¤tviews=397
* THANKS to Clive1
* */
// clock for GPIO and AFIO (Remap) - WHY THIS?
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
// clock for TIM3 - HERE DO WE ENABLE TIM3 HW?
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
// PIN SETUP
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_StructInit(&GPIO_InitStructure); //Reset init structure
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//THIS?
GPIO_PinRemapConfig( GPIO_FullRemap_TIM3, ENABLE ); // Map TIM3_CH3 to GPIOB.Pin0, GPIOB.Pin1, GPIOB.Pin4, GPIOB.Pin5
//OR THIS?
//GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_TIM3);
//GPIO_PinAFConfig(GPIOB, GPIO_PinSource1, GPIO_AF_TIM3);
//GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_TIM3);
//GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_TIM3);
//TIMER INTERRUPT SETUP
NVIC_InitTypeDef NVIC_InitStructure;
// Configure the NVIC Preemption Priority Bits
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
// Enable the TIM3 Interrupt
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//TIMER SETUP
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructInit( &TIM_TimeBaseStructure ); // Reset init structure
// Simplify the math here so TIM_Pulse has 1 us units
// PWMFreq = SystemCoreClock / ((TIM_Prescaler + 1) * (TIM_Period + 1));
// NOT VERY SURE THE TIM3 RUN AT 24MHz....
TIM_TimeBaseStructure.TIM_Prescaler = 24 - 1; // 24 MHz / 24 = 1 MHz
TIM_TimeBaseStructure.TIM_Period = 20000 - 1; // 1 MHz / 20000 = 50 Hz (20 ms)
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit( &TIM_OCInitStructure );
// PWM1: Channel1, PB0
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_Pulse = position[0];
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
// PWM1: Channel2, PB1
TIM_OCInitStructure.TIM_Pulse = position[1];
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
// PWM1: Channel3, PB4
TIM_OCInitStructure.TIM_Pulse = position[2];
TIM_OC3Init(TIM3, &TIM_OCInitStructure);
// PWM1: Channel4, PB5
TIM_OCInitStructure.TIM_Pulse = position[3];
TIM_OC4Init(TIM3, &TIM_OCInitStructure);
// ENABLE TIMER
TIM_Cmd( TIM3, ENABLE );
TIM_CtrlPWMOutputs(TIM3, ENABLE);
// TIM IT enable
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
}