Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/33: Рейтинг темы: голосов - 33, средняя оценка - 4.88
fooxys
1

Настройка таймера на шим и прерывание

06.06.2016, 17:50. Просмотров 6342. Ответов 3
Метки нет (Все метки)


Здравствуйте! Мне нужно настроить таймер на шим с прерыванием по спадающему фронту. Собираю проект в CooCox. Не могу найти в параметрах структуры настройки регистра DIER для прерывания. Как грамотно заменить строчку
Код
TIM2->DIER |= TIM_DIER_CC1IE;
на заполненную и инициализированную структуру ?

Программа:
https://github.com/Fooxis/Done... 206/main.c
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.06.2016, 17:50
Ответы с готовыми решениями:

Прерывание таймера TIM2
Начал потихоньку разбираться в STM32. Сконфигурировал прерывание таймера 2 с частотой 1Гц (1...

[Решено] Не срабатывает прерывание по захвату таймера А
Не срабатывает прерывание по захвату таймера А. Вот код, я уже вырезал все, оставил только...

ATmega16. Настроить прерывание для таймера Т1
помогите настроить таймер Т1

Помогите организовать прерывание таймера на Cortex-M3
Уважаемые специалисты, я имею некоторый опыт работы с AVR и теперь пытаюсь освоить ARM. У меня...

__________________
Помогаю в написании студенческих работ здесь.
3
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,113
06.06.2016, 18:05 2
Если кто подскажет - будет полезно.
А так ... самый простой вариант - взять еще один канал и по нему сделать событие.
Чтобы проинветрировать сигнал мне пришлось использовать (выкинуть) еще один таймер (целиком). У STM32 нет (не знаю) инвертеров для событий.
0
0 / 0 / 0
Регистрация: 05.10.2007
Сообщений: 498
06.06.2016, 18:15 3
А для чего заменять прямую запись в регистр таймера на поля в бесполезной структуре?
0
fooxys
07.06.2016, 10:13 4
Цитата Сообщение от SOVO
А для чего заменять прямую запись в регистр таймера на поля в бесполезной структуре?
Чтобы сохранить единство стиля. Нельзя просто взять и часть программы написать на асме, где-то в центре описать работу с регистрами на си и по бокам с помощью библиотеки StdPeriph. Это будет работать, но читаемость такой программы.... К тому же, просто оставлять непонятную обработку регистров - дурной тон. Надо хотя бы задефайнить.

Кстати, нужную функцию нашел. Рабочий вариант шима с прерыванием по спадающему фронту:
Код
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_tim.h"

void initTimer(void) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitTypeDef pinTimer;
pinTimer.GPIO_Pin   = GPIO_Pin_0;
pinTimer.GPIO_Mode  = GPIO_Mode_AF_PP;  // Режим работы для ножки - альтернативная функция, push pull
pinTimer.GPIO_Speed = GPIO_Speed_50MHz; //
GPIO_Init(GPIOA, &pinTimer);

/* Настроечные структурки
1) TIM_TimeBaseInitTypeDef -- Основные настройки таймера
2) TIM_OCInitTypeDef  -- Настройки для управление каналами настроенные как ВЫХОД
3) TIM_ICInitTypeDef  -- Настройки для управление каналами настроенные как ВХОД
4) TIM_BDTRInitTypeDef  -- Дополнительные разные настройки    */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseInitTypeDef timer;
timer.TIM_CounterMode   = TIM_CounterMode_Up;
timer.TIM_Pressotir     = 24000 - 1;
timer.TIM_Period        = 100;
timer.TIM_ClockDyvysyom = TIM_CKD_DIV1; // CKD[1:0]: Clock division определяем частоту для фильтров (tDTS)
// baseTimer.TIM_RepetitionCounter = 1; //Этот пораметр только для Т1 и Т8
TIM_TimeBaseInit(TIM2, &timer); // Засовываем настройи в регистры

// Настройка первого канала таймера
TIM_OCInitTypeDef timer_OCI;                          // создаём переменную (структуру) для определения режима работы таймера
timer_OCI.TIM_OCMode       = TIM_OCMode_PWM1;         // Режим установки ножки при совпадении
timer_OCI.TIM_OutputState  = TIM_OutputNState_Enable; // Подключаем нашу ножку к логике таймера
timer_OCI.TIM_Pulse        = 1000;                    // регистр TIMx->CCR1 (число сравнения в канале) число между  0x0000 и 0xFFFF
timer_OCI.TIM_OCPolarity   = TIM_OCNPolarity_High;    // рег TIMx->CCER бит CC1P Полярность выхода
TIM_OC1Init(TIM2, &timer_OCI);

TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE); // Регестрируем прерывание
NVIC_EnableIRQ(TIM2_IRQn);
TIM_Cmd(TIM2, ENABLE); // Пуск!
}

void TIM2_IRQHomdler(void) {
int a;
TIM2->SR &= ~TIM_SR_CC1IF;
}

int main(void){
initTimer();

while(1)
{
}
}
Большие листинги нужно прятать под спойлер
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.06.2016, 10:13

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Почему возникает прерывание таймера по Update для TIM 6?
Добрый день, Почему у выключенного таймера TIM6 один раз возникает прерывание по Update после...

[Решено] HardFault при попытке настроить прерывание таймера
Здравствуйте. Недавно начал изучать ARM в общем и STM32 в частности, вылезла проблема при попытке...

Ребята, подскажите как слать ШИМ с помощью таймера 20 GPIO?
Ребята, подскажите как управлять с помощью таймера 20 GPIO? Мне нужно на эти 20 gpio слать ШИМ, а...

STM32F4Discovery. ШИМ, настройка тактирования
Задача стоит такая. Управляю сервоприводом. Нужно настроить предделитель таймера правильно, исходя...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.