Страница 1 из 1

STM32F103C8T6 Таймер 1с.

Добавлено: Вт янв 06, 2015 20:22:08
Andrey27
Всем привет! Недавно решил перейти от AVR на STM. Написал код что бы помограть светодиодом 1Гц с помощю таймера. Все работает только светодиод не 1 раз в секунду моргает а раз 5-7. Мк STM32F103C8T6 кварц 8Мгц. Может где я с делителями или тактированием ошибся. Код:

Код: Выделить всё

  #include "stm32f10x.h"
  #include "stm32f10x_rcc.h"
  #include "stm32f10x_gpio.h"
  #include "stm32f10x_tim.h"

  void Init_LED(void)
  {
   GPIO_InitTypeDef GPIO_InitStructure;
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
   GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0;
   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
  }

  void Init_Timer(void)
  {
   TIM_TimeBaseInitTypeDef Timer;
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
   TIM_TimeBaseStructInit(&Timer);
   Timer.TIM_Prescaler = SystemCoreClock / 1000 - 1;
   Timer.TIM_Period = 1000;
   TIM_TimeBaseInit(TIM4, &Timer);
   TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
   TIM_Cmd(TIM4, ENABLE);
   NVIC_EnableIRQ(TIM4_IRQn);
  }

 void TIM4_IRQHandler()
 {
  GPIOA->ODR ^= GPIO_Pin_0;
  TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
 }

 int main(void)
 {
  Init_LED();
  Init_Timer();
  while(1)
   {

   }
 }

Re: STM32F103C8T6 Таймер 1с.

Добавлено: Вт янв 06, 2015 21:44:19
maksim-starcity
SystemCoreClock - это магическое число правильно определено? 72000000?

Если да, то 72000000/1000-1 = 71999 > 65535

Re: STM32F103C8T6 Таймер 1с.

Добавлено: Вт янв 06, 2015 22:39:30
Andrey27
А да 71999, а регистр 2 байта, не заметил. Исправил так:

Код: Выделить всё

Timer.TIM_Prescaler = (SystemCoreClock / 2) / 1000 - 1;
Timer.TIM_Period = 1000 * 2;

Работает четко 1 сек. Спасибо за подсказку :) .

Re: STM32F103C8T6 Таймер 1с.

Добавлено: Вс июл 03, 2016 19:58:08
Ican
maksim-starcity писал(а):SystemCoreClock - это магическое число правильно определено? 72000000?

Если да, то 72000000/1000-1 = 71999 > 65535


Спасибо:) на те же грабельки наступил портируя свой проект с stm32f100rb (на stm32vldiscovery) на китайскую stm32f103c8t6

Re: STM32F103C8T6 Таймер 1с.

Добавлено: Вт авг 30, 2016 11:08:42
pshonia
stm32F103C8t
таймер висит в прерываниях
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// Включаем тактирование нужных модулей
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4 , ENABLE);
// пропуск того что работает


// вот с этого момента проблемы
// настройка таймера Т4
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Prescaler = 72000;
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = 100;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
TIM_ClearFlag(TIM4, TIM_FLAG_Update);
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); // Настраиваем таймер по (переполнению)
TIM_Cmd(TIM4, ENABLE); // запуск
// настройка прерывания от ТМ4
NVIC_InitStructure.NVIC_IRQChannel = ENABLE; // канал
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1; // приоритет
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // приоритет субгруппы
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // включаем канал
NVIC_Init(&NVIC_InitStructure); // инициализируем
TIM_ClearITPendingBit(TIM4, TIM_IT_Update); // очищаем прерывания
NVIC_EnableIRQ(TIM4_IRQn); // Разрешаем прерывания от ТМ4

uart1.delay=30; // таймаут приема gap timer 0.0001sec один symbol при 9600 ~1ms
}

void TIM4_IRQnHandler(void)
{ ind_010(5,1); // для контроля на LCD1602 высветить 00000101, верхняя строка

TIM_ClearITPendingBit(TIM4, TIM_IT_Update); // очищаем прерывания
TIM_ClearFlag(TIM4, TIM_FLAG_Update);
}

как только подключаю строку
NVIC_EnableIRQ(TIM4_IRQn); // Разрешаем прерывания от ТМ4
зависает

Re: STM32F103C8T6 Таймер 1с.

Добавлено: Вт авг 30, 2016 11:33:19
Мурик
pshonia писал(а):TIM_TimeBaseStructure.TIM_Prescaler = 72000;
Сколько байт нужно для хранения числа 72000?

Re: STM32F103C8T6 Таймер 1с.

Добавлено: Вт авг 30, 2016 18:20:11
pshonia
Записывал 36 и 72
и как в верхнем посте скопировал вставил (для своей ножки)
Таймер висит (точнее не заходит в прерывания)
может заходит но не меняет PA8

Re: STM32F103C8T6 Таймер 1с.

Добавлено: Ср авг 31, 2016 07:14:48
pshonia
попробовал собрать проект только таймер - смотрю осциллографом
и припаял св.диод + 330 на ножку PА8 - импульсов нет
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"
#include "misc.h"

void Init(void)
{ GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure); // настроили ножку 1 или 0

GPIO_WriteBit(GPIOA,GPIO_Pin_8,Bit_SET); // св.диод засветили

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
TIM_DeInit(TIM4);

TIM_TimeBaseStructure.TIM_Prescaler = 36; // пробовал разные до 65000
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; // без деления
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = 100;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
TIM_ClearFlag(TIM4, TIM_FLAG_Update);
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM4, ENABLE);

NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
NVIC_EnableIRQ(TIM4_IRQn);

}
void TIM4_IRQnHandler(void)
{ if(GPIO_ReadOutputDataBit( GPIOA,GPIO_Pin_8)) // если св.диот светил
{ GPIO_WriteBit(GPIOA,GPIO_Pin_8,Bit_RESET); } // тушим
else
{ GPIO_WriteBit(GPIOA,GPIO_Pin_8,Bit_SET); } // или опять засветили

TIM_ClearITPendingBit(TIM4, TIM_IT_Update); // обнулили прерывание
TIM_ClearFlag(TIM4, TIM_FLAG_Update); // скинули флаг
}
int main (void)
{ Init();
while(1)
{
}
}

Микруха stm32f103c8b6

Re: STM32F103C8T6 Таймер 1с.

Добавлено: Ср авг 31, 2016 11:13:29
Z_h_e
Попробуйте вот так. Выдернул из некого проекта, где таймер у меня работает в режиме захвата. Таймер был не 4. Подправил код прямо в форуме, убрал лишнее и не проверял. Даже на орфографию.

Код: Выделить всё

RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;//Включаем тактирование TIM4
TIM4->PSC=72-1;//каждй импульс таймера 1 МКС
TIM4->CR1 |= TIM_CR1_CEN;//Запускаем счет таймера
TIM4->DIER |= TIM_DIER_UIE;//Разрешена генерация прерывания
NVIC_SetPriority(TIM4_IRQn,1); //установить приоритет
NVIC_EnableIRQ(TIM4_IRQn);

Re: STM32F103C8T6 Таймер 1с.

Добавлено: Чт сен 01, 2016 10:21:11
pshonia
Попробовал
как только подключаю строку
NVIC_EnableIRQ(TIM4_IRQn);
не выходит из прерываний
с другой плаьтой с8т6
точно так же
если без таймера в основной программе
то импульсы есть (задержка через for)
В дебагере надпись

set tdesc filename C:/CooCox/CoIDE/bin/target_desc/arm-with-m.xml
target remote 127.0.0.1:2009
Remote debugging using 127.0.0.1:2009
Default_Reset_Handler () at D:\proba_T4\cmsis_boot\startup\startup_stm32f10x_md.c:186

tbreak main
Temporary breakpoint 1 at 0x8000774: file D:\proba_T4\main.c, line 38.
Continuing.

ссылается на главную функцию !!!!!!!!!!!!!!!!!!!!!!!!
int main (void)
{ Init(); // строка 38
while(1)
{
}
}

Program received signal SIGINT, Interrupt.
Default_Handler () at D:\proba_T4\cmsis_boot\startup\startup_stm32f10x_md.c:289

и ссылается на кусок библиотеки !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
static void Default_Handler(void)
{
/* Go into an infinite loop. */
while (1)
{
}

Re: STM32F103C8T6 Таймер 1с.

Добавлено: Чт сен 01, 2016 11:17:42
Z_h_e
Наверное не не выходит, а часто входит? Измените значение предделителя.

Re: STM32F103C8T6 Таймер 1с.

Добавлено: Пт сен 02, 2016 12:16:19
pshonia
Изменял уже
в цикл вайл вообще не заходит
в вайл вставил 1 строку вкл в.диод PС13 (на плате) сконфигурированный конечна

пробовал шим работает на ножке PA8
(не могу понять Т2 И Т4) висятна одной шине но генирят разную шим) - но это не важно
Почему не могу запустить тот код который у других на этом кристале работает
вставлял код с этой страницы верхний - глухо.

Re: STM32F103C8T6 Таймер 1с.

Добавлено: Пт сен 02, 2016 12:23:25
pshonia
Все большое спасибо кто откликнулся
Удалил проект, создал за ново, вставил - все запустилось

Re: STM32F103C8T6 Таймер 1с.

Добавлено: Пт сен 02, 2016 20:47:23
pshonia
STM32C8T6
рабочий проект мигалка на 1 сек

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"
void Init(void)
{ GPIO_InitTypeDef GPIO_InitStructure;
// Включаем тактирование нужных модулей
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); // св.диод PA8

// мигалка св.диод PA8 (навешаный на вывод А8 - PA8 + 330 ом)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

// настройка таймера Т4
TIM_TimeBaseInitTypeDef Timer;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
TIM_TimeBaseStructInit(&Timer); // незабываем эту строку для продвинутых таймеров

Timer.TIM_Prescaler = ((72000000/2)/1000-1);
Timer.TIM_Period = 2000; // прерывание 1 сек
TIM_TimeBaseInit(TIM4, &Timer); // незабываем и эту строку

TIM_ClearFlag(TIM4, TIM_FLAG_Update);
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); // Настраиваем таймер по (переполнению)
TIM_Cmd(TIM4, ENABLE); // запуск
NVIC_EnableIRQ(TIM4_IRQn); // Разрешаем прерывания от ТМ4

}
void TIM4_IRQnHandler(void)
{ //моргаем светодиодом дабы показать активность таймера
GPIOA->ODR^=GPIO_Pin_8;
TIM_ClearITPendingBit(TIM4, TIM_IT_Update); // очищаем прерывания
}
int main (void)
{ Init(); // Настройка всего
while(1)
{
}
}

Re: STM32F103C8T6 Таймер 1с.

Добавлено: Вс сен 11, 2016 08:19:45
dm211
Использую HAL, режим таймера- PWM Generation CH2 CH2N, включаю таймер, канал 2

Код: Выделить всё

HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);

На выходе CH2 сигнал есть, на CH2N- тихо. Как же включить ногу CH2N ?

Re: STM32F103C8T6 Таймер 1с.

Добавлено: Пн сен 12, 2016 13:37:21
dm211
Кто будет наступать на эти же грабли, скажу как включить второй канал-

Код: Выделить всё

HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_2);