#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"
void Init_timer(void){
//1-ая часть ЭТО настройка ножки для работы под контролем ТАЙМЕРА 2
// Необходимо настроить ножку для работы в альтернативном режиме
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // это функция разрешения тактирования порта A
GPIO_InitTypeDef Pinyshka; // создаём переменную (структуру) для ножки
// заполняем поля структуры для определения режима ножки
Pinyshka.GPIO_Pin = GPIO_Pin_9; // определяем ножки!!! порта
Pinyshka.GPIO_Mode = GPIO_Mode_Out_PP; // определяем режим работы ножки
Pinyshka.GPIO_Speed = GPIO_Speed_50MHz; // так как режим на выход то определяем скорость работы ножки
// этой функцией мы определяем работу ножек (ссылка на заполненную структуру ножки) + (указываем порт необходимых нам ножек)
GPIO_Init( GPIOC , &Pinyshka);
//2-ая часть ЭТО настройка ТАЙМЕРА 2
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // включаем тактирование таймера 2
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // включаем тактирование таймера 3
/* Настроечные структурки
1) TIM_TimeBaseInitTypeDef -- Основные настройки таймера
2) TIM_OCInitTypeDef -- Настройки для управление каналами настроенные как ВЫХОД
3) TIM_ICInitTypeDef -- Настройки для управление каналами настроенные как ВХОД
4) TIM_BDTRInitTypeDef -- Дополнительные разные настройки */
// БАЗОВЫЕ настройки таймера 22222222222222222222 (переполняется раз в пол секунды !!!)
TIM_TimeBaseInitTypeDef Timerushka_Base2; // создаём переменную (структуру) для определения режима работы таймера
Timerushka_Base2.TIM_CounterMode = TIM_CounterMode_Up; // Выбираем режим работы счетчика
Timerushka_Base2.TIM_Prescaler = 24000 - 1; // пред делитель
Timerushka_Base2.TIM_Period = 500; // периуд
Timerushka_Base2.TIM_ClockDivision = TIM_CKD_DIV1; // CKD[1:0]: Clock division определяем частоту для фильтров (tDTS)
// Timerushka_Base.TIM_RepetitionCounter = 1; //Этот пораметр только для Т1 и Т8
TIM_TimeBaseInit(TIM2, &Timerushka_Base2); // Засовываем настройи в регистры
// БАЗОВЫЕ настройки таймера 33333333333333 (переполняется раз в 1 сек !!!!! [так как тактируется от тим2])
TIM_TimeBaseInitTypeDef Timerushka_Base3; // создаём переменную (структуру) для определения режима работы таймера
Timerushka_Base3.TIM_CounterMode = TIM_CounterMode_Up; // Выбираем режим работы счетчика
Timerushka_Base3.TIM_Prescaler = 1 - 1; // пред делитель
Timerushka_Base3.TIM_Period = 1; // периуд (ВАЖНО ЧТО ЭТО ЧИСЛО ТОЖЕ УЧАСТВУЕТ !!!!)
Timerushka_Base3.TIM_ClockDivision = TIM_CKD_DIV1; // CKD[1:0]: Clock division определяем частоту для фильтров (tDTS)
// Timerushka_Base.TIM_RepetitionCounter = 1; //Этот пораметр только для Т1 и Т8
TIM_TimeBaseInit(TIM3, &Timerushka_Base3); // Засовываем настройи в регистры
// НАСТРАИВАЕМ СВЯЗЬ ТАЙМЕРОВ
/* Хотим чтобы [TIM2-(тактирует)->TIM3] */
/* Определяем когда импульсы давать ведомому таймеру? говорим по переполнению */
TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update); // рег TIMx->CR2 биты MMS.
TIM_SelectInputTrigger(TIM3, TIM_TS_ITR1); // рег TIMx->SMCR биты TS.// Table 71. TIMx internal trigger connection
/* Включаем тактирование от внешнего источника. */
// TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable); // рег TIMx->SMCR бит MSM.
// выбираемс откуда приходят тактушки
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_External1); // рег TIMx->SMCR биты SMS.
/* Разрешаем таймеру генерировать прерывание по переполнению TIM3*/
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
/* Разрешаем прерывания таймера TIM2 */
NVIC_EnableIRQ(TIM3_IRQn);
// ЗАПУСК всего безобразий !!!
TIM_Cmd(TIM2, ENABLE);
TIM_Cmd(TIM3, ENABLE);
}
// ОБРАБОТЧИК ПРЕРЫВАНИЯ ОТ ТАЙМЕРА 3
void TIM3_IRQHandler(void)
{
static uint32_t flag = 0;
// Смотрим что прерывание от таймера именно по событию переполнение
if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
{
/* Очищаем флажочик этого прерывания */
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
if(flag)// играемся с зелененьким светодиодиком (вкл/выкл)
{ GPIO_WriteBit(GPIOC,GPIO_Pin_9,Bit_SET); flag=0;}//
else
{ GPIO_WriteBit(GPIOC,GPIO_Pin_9,Bit_RESET); flag=1;};//
}
}
int main(void) {
Init_timer(); // инициализация таймера 6
while (1); // безконечный цикл
return 0;
}
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"
void Init_timer(void){
//1-ая часть ЭТО настройка ножки для работы под контролем ТАЙМЕРА 2
// Необходимо настроить ножку для работы в альтернативном режиме
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // это функция разрешения тактирования порта A
GPIO_InitTypeDef Pinyshka; // создаём переменную (структуру) для ножки
// заполняем поля структуры для определения режима ножки
Pinyshka.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9; // определяем ножки!!! порта
Pinyshka.GPIO_Mode = GPIO_Mode_Out_PP; // определяем режим работы ножки
Pinyshka.GPIO_Speed = GPIO_Speed_50MHz; // так как режим на выход то определяем скорость работы ножки
// этой функцией мы определяем работу ножек (ссылка на заполненную структуру ножки) + (указываем порт необходимых нам ножек)
GPIO_Init( GPIOC , &Pinyshka);
//2-ая часть ЭТО настройка ТАЙМЕРА 2
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // включаем тактирование таймера 2
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // включаем тактирование таймера 3
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); // включаем тактирование таймера 3
/* Настроечные структурки
1) TIM_TimeBaseInitTypeDef -- Основные настройки таймера
2) TIM_OCInitTypeDef -- Настройки для управление каналами настроенные как ВЫХОД
3) TIM_ICInitTypeDef -- Настройки для управление каналами настроенные как ВХОД
4) TIM_BDTRInitTypeDef -- Дополнительные разные настройки */
// БАЗОВЫЕ настройки таймера 22222222222222222222 (переполняется раз в пол секунды !!!)
TIM_TimeBaseInitTypeDef Timerushka_Base2; // создаём переменную (структуру) для определения режима работы таймера
Timerushka_Base2.TIM_CounterMode = TIM_CounterMode_Up; // Выбираем режим работы счетчика
Timerushka_Base2.TIM_Prescaler = 24000 - 1; // пред делитель
Timerushka_Base2.TIM_Period = 500; // периуд
Timerushka_Base2.TIM_ClockDivision = TIM_CKD_DIV1; // CKD[1:0]: Clock division определяем частоту для фильтров (tDTS)
// Timerushka_Base.TIM_RepetitionCounter = 1; //Этот пораметр только для Т1 и Т8
TIM_TimeBaseInit(TIM2, &Timerushka_Base2); // Засовываем настройи в регистры
// БАЗОВЫЕ настройки таймера 33333333333333 (переполняется раз в 1 сек !!!!! [так как тактируется от тим2])
TIM_TimeBaseInitTypeDef Timerushka_Base3; // создаём переменную (структуру) для определения режима работы таймера
Timerushka_Base3.TIM_CounterMode = TIM_CounterMode_Up; // Выбираем режим работы счетчика
Timerushka_Base3.TIM_Prescaler = 1 - 1; // пред делитель
Timerushka_Base3.TIM_Period = 1; // периуд (ВАЖНО ЧТО ЭТО ЧИСЛО ТОЖЕ УЧАСТВУЕТ !!!!)
Timerushka_Base3.TIM_ClockDivision = TIM_CKD_DIV1; // CKD[1:0]: Clock division определяем частоту для фильтров (tDTS)
// Timerushka_Base.TIM_RepetitionCounter = 1; //Этот пораметр только для Т1 и Т8
TIM_TimeBaseInit(TIM3, &Timerushka_Base3); // Засовываем настройи в регистры
// БАЗОВЫЕ настройки таймера 4444444 (переполняется раз в 2 сек !!!!! [так как тактируется от тим2])
TIM_TimeBaseInitTypeDef Timerushka_Base4; // создаём переменную (структуру) для определения режима работы таймера
Timerushka_Base4.TIM_CounterMode = TIM_CounterMode_Up; // Выбираем режим работы счетчика
Timerushka_Base4.TIM_Prescaler = 1 - 1; // пред делитель
Timerushka_Base4.TIM_Period = 3; // периуд (ВАЖНО ЧТО ЭТО ЧИСЛО ТОЖЕ УЧАСТВУЕТ !!!!)
Timerushka_Base4.TIM_ClockDivision = TIM_CKD_DIV1; // CKD[1:0]: Clock division определяем частоту для фильтров (tDTS)
// Timerushka_Base.TIM_RepetitionCounter = 1; //Этот пораметр только для Т1 и Т8
TIM_TimeBaseInit(TIM4, &Timerushka_Base4); // Засовываем настройи в регистры
// НАСТРАИВАЕМ СВЯЗЬ ТАЙМЕРОВ
/* Хотим чтобы [TIM2-(тактирует)->TIM3] */
/* Определяем когда импульсы давать ведомому таймеру? говорим по переполнению */
TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update); // рег TIMx->CR2 биты MMS.
TIM_SelectInputTrigger(TIM3, TIM_TS_ITR1); // рег TIMx->SMCR биты TS.// Table 71. TIMx internal trigger connection
/* Включаем тактирование от внешнего источника. */
// TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable); // рег TIMx->SMCR бит MSM.
// выбираемс откуда приходят тактушки
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_External1); // рег TIMx->SMCR биты SMS.
/* Хотим чтобы [TIM2-(тактирует)->TIM4] */
/* Определяем когда импульсы давать ведомому таймеру? говорим по переполнению */
//TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update); // рег TIMx->CR2 биты MMS.
TIM_SelectInputTrigger(TIM4, TIM_TS_ITR1); // рег TIMx->SMCR биты TS.// Table 71. TIMx internal trigger connection
/* Включаем тактирование от внешнего источника. */
// TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable); // рег TIMx->SMCR бит MSM.
// выбираемс откуда приходят тактушки
TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_External1); // рег TIMx->SMCR биты SMS.
/* Разрешаем таймеру генерировать прерывание по переполнению TIM3*/
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
/* Разрешаем прерывания таймера TIM3 */
NVIC_EnableIRQ(TIM3_IRQn);
/* Разрешаем таймеру генерировать прерывание по переполнению TIM3*/
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
/* Разрешаем прерывания таймера TIM3 */
NVIC_EnableIRQ(TIM4_IRQn);
// ЗАПУСК всего безобразий !!!
TIM_Cmd(TIM2, ENABLE);
TIM_Cmd(TIM3, ENABLE);
TIM_Cmd(TIM4, ENABLE);
}
// ОБРАБОТЧИК ПРЕРЫВАНИЯ ОТ ТАЙМЕРА 3
void TIM3_IRQHandler(void)
{
static uint32_t flag = 0;
// Смотрим что прерывание от таймера именно по событию переполнение
if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
{
/* Очищаем флажочик этого прерывания */
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
if(flag)// играемся с зелененьким светодиодиком (вкл/выкл)
{ GPIO_WriteBit(GPIOC,GPIO_Pin_9,Bit_SET); flag=0;}//
else
{ GPIO_WriteBit(GPIOC,GPIO_Pin_9,Bit_RESET); flag=1;};//
}
}
// ОБРАБОТЧИК ПРЕРЫВАНИЯ ОТ ТАЙМЕРА 4
void TIM4_IRQHandler(void)
{
static uint32_t flag = 0;
// Смотрим что прерывание от таймера именно по событию переполнение
if (TIM_GetITStatus(TIM4, TIM_IT_Update) == SET)
{
/* Очищаем флажочик этого прерывания */
TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
if(flag)// играемся с зелененьким светодиодиком (вкл/выкл)
{ GPIO_WriteBit(GPIOC,GPIO_Pin_8,Bit_SET); flag=0;}//
else
{ GPIO_WriteBit(GPIOC,GPIO_Pin_8,Bit_RESET); flag=1;};//
}
}
int main(void) {
Init_timer(); // инициализация таймера 6
while (1); // безконечный цикл
return 0;
}
Комментариев нет:
Отправить комментарий