Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // pwm.c STM32F4Discovery
- //
- #include "pwm.h"
- #include <stm32f4xx.h>
- // Инициализация модуля
- void pwm_Init(uint16_t Frequency, uint8_t Resolution)
- {
- uint32_t Clock = 16000000UL; // Частота тактирования модуля
- uint32_t Counts = (1UL << Resolution);
- if(Resolution > 16) return;
- // Используем вывод PD12 (зелёный светодиод там)
- // Включить тактирование порта GPIOD
- RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN;
- // Включить тактирование модуля TIM4
- RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;
- // Номер альтернативной функции
- GPIOD->AFR[1] &= ~(0x0FUL << ((12 - 8) * 4)); // 12 очистим
- GPIOD->AFR[1] |= (0x02UL << ((12 - 8) * 4)); // В 12 запишем 2
- // Режим: альтернативная функция
- GPIOD->MODER &= ~(0x03UL << (12 * 2)); // 12 очистим
- GPIOD->MODER |= (0x02UL << (12 * 2)); // В 12 запишем 2
- // Разрядность: 16 бит
- TIM4->ARR = Counts - 1;
- // Предделитель:
- TIM4->PSC = (Clock / Frequency / Counts) - 1;
- // Выход: 0
- TIM4->CCR1 = 0;
- // Режим: ШИМ1 0b110
- TIM4->CCMR1 &= ~TIM_CCMR1_OC1M; // очистим поле режима
- TIM4->CCMR1 |= (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1); // Запишем 0b110
- // Канал 1 включить
- TIM4->CCER |= TIM_CCER_CC1E;
- // Передадим сигнал о сбросе счётчика, чтоб все внутренние регистры точно обновились.
- TIM4->EGR = TIM_EGR_UG;
- // Включить счёт
- TIM4->CR1 |= TIM_CR1_CEN;
- }
- // Задать скважность (0-0xFFFF)
- void pwm_Set(uint16_t Value)
- {
- TIM4->CCR1 = Value;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement