Столкнулся с проблемой. Не работает ШИМ. Возможно я ЧДНТ.
Контроллер: stm32f030f4p6.
Среда разработки: Keil5
Использую либу SPL.
Программатор: отладочная плата stm32f3discovery.(ОП)
У контроллера запитаны ноги VDDA и VDD от 3v на одном из разъемов от ОП.
GND от ОП подключено к VSS контроллера.
SWDIO и SWCLK подключены соответственно. Reset не подключаю, тк ногу с резетом не трограю.
Контроллер прошивается без проблем.
Описание сути:
Хочу заставить работать ШИМ на ноге PA6. Судя по даташиту PA6 - это третий таймер с первым каналом TIM3_CH1.
Соответственно включаем тактирование переферии GPIOA, и таймера TIM3. После инициализации и настройки - я не вижу никаких сигналов на ноге PA6. В отладчике вижу, что таймер работает, каунтер бежит и сбрасывается после достижения настроенного периода. Нога PA6 инициализирована на работу как альтернативная функция GPIO_Mode_AF, сконфигурировано на использование альтернативной функции GPIO_AF_1, опять же судя по даташиту TIM3 именно на AF1.
Отдельная настройка ноги PA6 в режим выхода GPIO_Mode_OUT для теста дает понять, что порт работает и программно управляется, при GPIO_SetBits(GPIOA,GPIO_Pin_6) напряжение на ноге появляется.
Отдельно хочу заметить, при замере напряжения между VDD(+3v) и ногой PA6 при инициализации порта как GPIO_Mode_AF, тестер показыват +3v, что говорит о том, что уровень ноги равен GND, то бишь ток течет как в GND.(может тут я не совсем корректно выразился, но, думаю, суть ясна).
Код прилагаю ниже с комментариями:
Ну и собственно вопрос, что я мог упустить или в каком направлении можно дальше посмотреть, чтобы решить вопрос.
Пока вижу только один вариант - сделать прерывание по обнулению счетичка и дергать ногой программно, что я бы сильно не хотел!!!
Контроллер: stm32f030f4p6.
Среда разработки: Keil5
Использую либу SPL.
Программатор: отладочная плата stm32f3discovery.(ОП)
У контроллера запитаны ноги VDDA и VDD от 3v на одном из разъемов от ОП.
GND от ОП подключено к VSS контроллера.
SWDIO и SWCLK подключены соответственно. Reset не подключаю, тк ногу с резетом не трограю.
Контроллер прошивается без проблем.
Описание сути:
Хочу заставить работать ШИМ на ноге PA6. Судя по даташиту PA6 - это третий таймер с первым каналом TIM3_CH1.
Соответственно включаем тактирование переферии GPIOA, и таймера TIM3. После инициализации и настройки - я не вижу никаких сигналов на ноге PA6. В отладчике вижу, что таймер работает, каунтер бежит и сбрасывается после достижения настроенного периода. Нога PA6 инициализирована на работу как альтернативная функция GPIO_Mode_AF, сконфигурировано на использование альтернативной функции GPIO_AF_1, опять же судя по даташиту TIM3 именно на AF1.
Отдельная настройка ноги PA6 в режим выхода GPIO_Mode_OUT для теста дает понять, что порт работает и программно управляется, при GPIO_SetBits(GPIOA,GPIO_Pin_6) напряжение на ноге появляется.
Отдельно хочу заметить, при замере напряжения между VDD(+3v) и ногой PA6 при инициализации порта как GPIO_Mode_AF, тестер показыват +3v, что говорит о том, что уровень ноги равен GND, то бишь ток течет как в GND.(может тут я не совсем корректно выразился, но, думаю, суть ясна).
Код прилагаю ниже с комментариями:
Спойлер
Код: Выделить всё
#include "stm32f0xx.h"
#include "stm32f0xx_rcc.h"
#include "stm32f0xx_gpio.h"
#include "stm32f0xx_tim.h"
#define TIMER_PRESCALER 4800000000 // частота ядра 48мГц, не знаю почему, пришлось добавить нулей лишних, чтобы таймер тикал каждую секунду.
uint16_t previousState;
GPIO_InitTypeDef port;
TIM_TimeBaseInitTypeDef timer;
TIM_OCInitTypeDef timerPWM;
uint16_t buttonPreviousState;
TIM_BDTRInitTypeDef bdtr;
void initAll()
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
port.GPIO_Mode = GPIO_Mode_AF;
port.GPIO_OType = GPIO_OType_PP;
port.GPIO_Pin = GPIO_Pin_6;
port.GPIO_PuPd = GPIO_PuPd_DOWN;
port.GPIO_Speed = GPIO_Speed_Level_3;
GPIO_Init(GPIOA, &port);
GPIO_PinAFConfig(GPIOA,GPIO_Pin_6,GPIO_AF_1);
TIM_TimeBaseStructInit(&timer);
timer.TIM_Prescaler = TIMER_PRESCALER;
timer.TIM_Period = 16; // сделаем период 16 тиков
TIM_TimeBaseInit(TIM3, &timer);
TIM_OCStructInit(&timerPWM);
timerPWM.TIM_Pulse = 8; //делим 16 напополам, получаем 8 тиков напряжение на ногу подается и 8 не подается.
timerPWM.TIM_OCMode = TIM_OCMode_PWM1;
timerPWM.TIM_OutputState = TIM_OutputState_Enable;
TIM_OC1Init(TIM3, &timerPWM); // инициализируем на 1 канал TIM3
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); // тут что-то взятое откуда-то
// тут дальше тоже невнятный для меня блок кода.
TIM_BDTRStructInit(&bdtr);
bdtr.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
TIM_BDTRConfig(TIM3, &bdtr);
}
int main()
{
SystemInit();
initAll();
TIM_Cmd(TIM3, ENABLE);
TIM3->CCR1 = 8; // продублируем настройку timerPWM.TIM_Pulse = 8;
while(1)
{
__NOP();
}
}
Пока вижу только один вариант - сделать прерывание по обнулению счетичка и дергать ногой программно, что я бы сильно не хотел!!!
