Advertisement
teplofizik

pwm.c

Mar 28th, 2013
741
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.94 KB | None | 0 0
  1. //
  2. // pwm.c STM32F4Discovery
  3. //
  4.  
  5. #include "pwm.h"
  6. #include <stm32f4xx.h>
  7.  
  8. // Инициализация модуля
  9. void pwm_Init(uint16_t Frequency, uint8_t Resolution)
  10. {
  11.     uint32_t Clock = 16000000UL; // Частота тактирования модуля
  12.     uint32_t Counts = (1UL << Resolution);
  13.    
  14.     if(Resolution > 16) return;
  15.    
  16.     // Используем вывод PD12 (зелёный светодиод там)
  17.    
  18.     // Включить тактирование порта GPIOD
  19.     RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN;
  20.    
  21.     // Включить тактирование модуля TIM4
  22.     RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;
  23.    
  24.     // Номер альтернативной функции
  25.     GPIOD->AFR[1] &= ~(0x0FUL << ((12 - 8) * 4)); // 12 очистим
  26.     GPIOD->AFR[1] |=  (0x02UL << ((12 - 8) * 4)); // В 12 запишем 2
  27.    
  28.     // Режим: альтернативная функция
  29.     GPIOD->MODER &= ~(0x03UL << (12 * 2));  // 12 очистим
  30.     GPIOD->MODER |=  (0x02UL << (12 * 2));  // В 12 запишем 2
  31.    
  32.     // Разрядность: 16 бит
  33.     TIM4->ARR = Counts - 1;
  34.    
  35.     // Предделитель:
  36.     TIM4->PSC = (Clock / Frequency / Counts) - 1;
  37.    
  38.     // Выход: 0
  39.     TIM4->CCR1 = 0;
  40.    
  41.     // Режим: ШИМ1 0b110
  42.     TIM4->CCMR1 &= ~TIM_CCMR1_OC1M;  // очистим поле режима
  43.     TIM4->CCMR1 |= (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1); // Запишем 0b110
  44.    
  45.     // Канал 1 включить
  46.     TIM4->CCER |= TIM_CCER_CC1E;
  47.    
  48.     // Передадим сигнал о сбросе счётчика, чтоб все внутренние регистры точно обновились.
  49.     TIM4->EGR = TIM_EGR_UG;
  50.    
  51.     // Включить счёт
  52.     TIM4->CR1 |= TIM_CR1_CEN;
  53. }
  54.  
  55. // Задать скважность (0-0xFFFF)
  56. void pwm_Set(uint16_t Value)
  57. {
  58.     TIM4->CCR1 = Value;
  59. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement