На микроконтроллере STM32F103VBT6 не удается запустить ШИМ на таймере TIM4. Используются 4 канала. На выходе просто ноль. При этом ШИМ на таймере TIM3 у меня получилось запустить. Ниже привожу исходный код. Подскажите пожалуйста, в чем проблема.
CODE
#include "stm32f10x_rcc.h"
#include "stm32f10x_adc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_usart.h"
#include "misc.h"
#include "delay.h"
void hard_init(void);
int main(void)
{
SysTick_Config(8000);
hard_init();
while(1)
{
GPIO_SetBits(GPIOA,GPIO_Pin_5);
Delay_ms(500);
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
Delay_ms(500);
}
}
void hard_init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2ENR_AFIOEN, ENABLE); //Clock to Alternative function
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &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_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0|GPIO_Pin_1);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
TIM3->CCER |= (TIM_CCER_CC1E|TIM_CCER_CC2E|TIM_CCER_CC3E|TIM_CCER_CC4E);
TIM4->CCER |= (TIM_CCER_CC1E|TIM_CCER_CC2E|TIM_CCER_CC3E|TIM_CCER_CC4E);
TIM3->CCMR1|= (TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2);
TIM3->CCMR1|= (TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2);
TIM3->CCMR2|= (TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2);
TIM3->CCMR2|= (TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2);
TIM4->CCMR1|= (TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2);
TIM4->CCMR1|= (TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2);
TIM4->CCMR2|= (TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2);
TIM4->CCMR2|= (TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2);
//Run TIM
TIM3->CR1 |= TIM_CR1_CEN;
TIM3->CCR1 = 65536/2;
TIM3->CCR2 = 65536/2;
TIM3->CCR3 = 65536/2;
TIM3->CCR4 = 65536/2;
TIM4->CR1 |= TIM_CR1_CEN;
TIM4->CCR1 = 65536/2;
TIM4->CCR2 = 65536/2;
TIM4->CCR3 = 65536/2;
TIM4->CCR4 = 65536/2;
//////////////////////////////////////////////////////
}
#include "stm32f10x_adc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_usart.h"
#include "misc.h"
#include "delay.h"
void hard_init(void);
int main(void)
{
SysTick_Config(8000);
hard_init();
while(1)
{
GPIO_SetBits(GPIOA,GPIO_Pin_5);
Delay_ms(500);
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
Delay_ms(500);
}
}
void hard_init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2ENR_AFIOEN, ENABLE); //Clock to Alternative function
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &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_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0|GPIO_Pin_1);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
TIM3->CCER |= (TIM_CCER_CC1E|TIM_CCER_CC2E|TIM_CCER_CC3E|TIM_CCER_CC4E);
TIM4->CCER |= (TIM_CCER_CC1E|TIM_CCER_CC2E|TIM_CCER_CC3E|TIM_CCER_CC4E);
TIM3->CCMR1|= (TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2);
TIM3->CCMR1|= (TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2);
TIM3->CCMR2|= (TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2);
TIM3->CCMR2|= (TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2);
TIM4->CCMR1|= (TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2);
TIM4->CCMR1|= (TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2);
TIM4->CCMR2|= (TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2);
TIM4->CCMR2|= (TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2);
//Run TIM
TIM3->CR1 |= TIM_CR1_CEN;
TIM3->CCR1 = 65536/2;
TIM3->CCR2 = 65536/2;
TIM3->CCR3 = 65536/2;
TIM3->CCR4 = 65536/2;
TIM4->CR1 |= TIM_CR1_CEN;
TIM4->CCR1 = 65536/2;
TIM4->CCR2 = 65536/2;
TIM4->CCR3 = 65536/2;
TIM4->CCR4 = 65536/2;
//////////////////////////////////////////////////////
}