Рассмотрим настройку ШИМ для третьего таймера, но уже с использованием библиотеки CMSIS (часть настроек мы оставим за библиотекой HAL — тактирование периферии, остальное настроим с помощью CMSIS.):
Прежде чем мы напишем код, нам нужно немного разобраться в настройках нашего таймера TIM3:
Для включения тактирования таймера используется команда: RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
TIM3->PSC — делитель частоты.
TIM3->ARR — устанавливает число до которого должен досчитать таймер и выполнить обновление.
TIM3->CCR2 — начальное состояние выхода при включении канала на выход
TIM3->CCER — включаем нужный канал на выход, его параметры:TIM_CCER_CC1E — первый канал, TIM_CCER_CC2E — второй канал, а так же можем установить полярность сигнала при старте: TIM_CCER_CC1P (либо высокий либо низкий).
TIM3->CCMR1 — выбор режима работы ШИМ:
/* USER CODE BEGIN 0 */
uint32_t i,j;
/* USER CODE END 0 */
/* USER CODE BEGIN 2 */
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; // Разрешаем тактирование TIM3
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN ; // Разрешаем тактирование порта
GPIOA->CRL &= ~ GPIO_CRL_CNF6_0;
GPIOA->CRL |= GPIO_CRL_CNF6_1;
GPIOA->CRL |= GPIO_CRL_MODE6;
TIM3->PSC = 0 ; // Делитель частоты — 1
TIM3->ARR = 65535; // Обновляем каждые 65535 тиков
TIM3->CCR1 = 0 ; // В начале – не светим
TIM3->CCER |= (TIM_CCER_CC1E);
TIM3->CCER &= ~TIM_CCER_CC1P;
TIM3->CCMR1 |= ( TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 ) ;
TIM3->CCMR1 &= ~ TIM_CCMR1_OC1M_0 ;
TIM3->CCMR1 &= ~ TIM_CCMR1_CC1S ;
TIM3->CCMR1 |= TIM_CCMR1_OC1PE ;
TIM3->CR1 |= TIM_CR1_ARPE ;
TIM3->CR1 &= ~TIM_CR1_DIR ;
TIM3->CR1|= TIM_CR1_CEN ;
/* USER CODE END 2 */
/* USER CODE BEGIN 3 */
for(i=200;i<=65535;i++) {// увеличиваем скважность
TIM3->CCR1=i;
for(j=0;j<700;j++){}//задержка
}
for(i=200;i<=65535;i++) {// уменьшаем скважность
TIM3->CCR1=65535-i;
for(j=0;j<700;j++){} // задержка
}
}
/* USER CODE END 3 */