Значит, вводные такие: плата STM32F4Discovery, чип STM32F4. Пытаюсь генерить ШИМ на PC6, вот код:
Код: Выделить всё
#include "stm32f4xx.h"
#include "system_stm32f4xx.h"
void InitGPIO(void)
{
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN;
GPIOC->MODER |= GPIO_MODER_MODER6_1;
GPIOC->OTYPER &= ~GPIO_OTYPER_OT_6;
GPIOC->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR6;
GPIOC->AFR[0] = 0x03000000; // TIM8 CH1 connected to pin PC6 (AF3)
}
void InitTIM(void)
{
RCC->APB2ENR |= RCC_APB2ENR_TIM8EN;
TIM8->ARR = 3276;
TIM8->CNT = 0;
TIM8->PSC = 0;
TIM8->CCER |= TIM_CCER_CC1E;
TIM8->CCMR1 |= (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1);
TIM8->CR1 |= TIM_CR1_CEN;
}
void InitAll(void)
{
InitGPIO();
InitTIM();
}
int main(void)
{
InitAll();
TIM8->CCR1 = 1638;
for (;;) {
}
}
Похоже, что что-то не так настроено, а что - никак не пойму. Всё перепроверил сто раз.
Исходные рассуждения такие:
1. Ножка PC6 связана с альтернативной функцией TIM8 CH1, стало быть настраиваю таймер TIM8 на работу в режиме PWM:
Код: Выделить всё
void InitTIM(void)
{
RCC->APB2ENR |= RCC_APB2ENR_TIM8EN;
TIM8->ARR = 3276;
TIM8->CNT = 0;
TIM8->PSC = 0;
TIM8->CCER |= TIM_CCER_CC1E;
TIM8->CCMR1 |= (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1);
TIM8->CR1 |= TIM_CR1_CEN;
}
2. ШИМ-сигнал от TIM8 выводится на ножку PC6 - настраиваю порт на работу в режиме AF3
Код: Выделить всё
{
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN;
GPIOC->MODER |= GPIO_MODER_MODER6_1;
GPIOC->OTYPER &= ~GPIO_OTYPER_OT_6;
GPIOC->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR6;
GPIOC->AFR[0] = 0x03000000; // TIM8 CH1 connected to pin PC6 (AF3)
}
Цепляю к ножке PC6 осциллограф и вместо прямоугольных импульсов вижу какой-то слабый шум.