/* TIM5 init function */
void MX_TIM5_Init(void)
{
htim5.Instance = TIM3;
htim5.Init.Prescaler = 16800-1; // делим 168 МГц на 16800 получаем 10000 Гц или 10 мс
htim5.Init.CounterMode = TIM_COUNTERMODE_UP; // таймер считает вверх
htim5.Init.Period = 5000-1; // считать будет до 5000, т.е. через 500 мс произойдет прерывание
htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // частоту входную не делим - нам хватает
HAL_TIM_Base_Init(&htim5);
/* Start the TIM Base generation in interrupt mode */
/* Start Channel1 */
HAL_TIM_Base_Start_IT(&htim5); // включаем прерывание таймера 5
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1);
}
==========================Without HAL==================================
//=============================================================================
// TIM5 Interrupt Handler
//=============================================================================
void TIM5_IRQHandler(void)
{
if(TIM5->SR & TIM_SR_UIF) // if UIF flag is set
{
TIM5->SR &= ~TIM_SR_UIF; // clear UIF flag
GPIOA->ODR ^=GPIO_ODR_1;
}
}
int main(void)
{
//HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* System interrupt init*/
//HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
/* GPIOB Periph clock enable */
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
GPIOA->MODER |= (GPIO_MODER_MODER1_0 | GPIO_MODER_MODER0_0) ; /* Configure PB0 and PB1 output mode */
GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_0 | GPIO_OTYPER_OT_1) ; // Ensure push pull mode selected--default
GPIOA->OSPEEDR |= (GPIO_OSPEEDER_OSPEEDR0|GPIO_OSPEEDER_OSPEEDR1); //Ensure maximum speed setting (even though it is unnecessary)
GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR0|GPIO_PUPDR_PUPDR1); //Ensure all pull up pull down resistors are disabled
GPIOA->BSRRL = GPIO_BRR_BR_1; // Set
/* TIM5 clock enable */
RCC->APB1ENR |= RCC_APB1ENR_TIM5EN;
TIM5->PSC = 168000 - 1; // Set prescaler to 16800 = 168 000 000Hz/16800 = 100000 Hz = 10 ms
TIM5->ARR = 5000 - 1; // Auto reload value 5000 = 500mS
TIM5->DIER = TIM_DIER_UIE; // Enable update interrupt (timer level)
TIM5->CR1 = TIM_CR1_CEN; // Enable timer
NVIC_EnableIRQ(TIM5_IRQn); // Enable interrupt from TIM5 (NVIC level)
while (1)
{
}
}
void MX_TIM5_Init(void)
{
htim5.Instance = TIM3;
htim5.Init.Prescaler = 16800-1; // делим 168 МГц на 16800 получаем 10000 Гц или 10 мс
htim5.Init.CounterMode = TIM_COUNTERMODE_UP; // таймер считает вверх
htim5.Init.Period = 5000-1; // считать будет до 5000, т.е. через 500 мс произойдет прерывание
htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // частоту входную не делим - нам хватает
HAL_TIM_Base_Init(&htim5);
/* Start the TIM Base generation in interrupt mode */
/* Start Channel1 */
HAL_TIM_Base_Start_IT(&htim5); // включаем прерывание таймера 5
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1);
}
==========================Without HAL==================================
//=============================================================================
// TIM5 Interrupt Handler
//=============================================================================
void TIM5_IRQHandler(void)
{
if(TIM5->SR & TIM_SR_UIF) // if UIF flag is set
{
TIM5->SR &= ~TIM_SR_UIF; // clear UIF flag
GPIOA->ODR ^=GPIO_ODR_1;
}
}
int main(void)
{
//HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* System interrupt init*/
//HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
/* GPIOB Periph clock enable */
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
GPIOA->MODER |= (GPIO_MODER_MODER1_0 | GPIO_MODER_MODER0_0) ; /* Configure PB0 and PB1 output mode */
GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_0 | GPIO_OTYPER_OT_1) ; // Ensure push pull mode selected--default
GPIOA->OSPEEDR |= (GPIO_OSPEEDER_OSPEEDR0|GPIO_OSPEEDER_OSPEEDR1); //Ensure maximum speed setting (even though it is unnecessary)
GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR0|GPIO_PUPDR_PUPDR1); //Ensure all pull up pull down resistors are disabled
GPIOA->BSRRL = GPIO_BRR_BR_1; // Set
/* TIM5 clock enable */
RCC->APB1ENR |= RCC_APB1ENR_TIM5EN;
TIM5->PSC = 168000 - 1; // Set prescaler to 16800 = 168 000 000Hz/16800 = 100000 Hz = 10 ms
TIM5->ARR = 5000 - 1; // Auto reload value 5000 = 500mS
TIM5->DIER = TIM_DIER_UIE; // Enable update interrupt (timer level)
TIM5->CR1 = TIM_CR1_CEN; // Enable timer
NVIC_EnableIRQ(TIM5_IRQn); // Enable interrupt from TIM5 (NVIC level)
while (1)
{
}
}
===================================================================
TIM_HandleTypeDef TIM_Handle;
int
main(
void
)
{
__TIM4_CLK_ENABLE();
TIM_Handle.Init.Prescaler = 671;
TIM_Handle.Init.CounterMode = TIM_COUNTERMODE_UP;
TIM_Handle.Init.Period = 62499;
TIM_Handle.Instance = TIM4;
//Same timer whose clocks we enabled
HAL_TIM_Base_Init(&TIM_Handle);
// Init timer
HAL_TIM_Base_Start_IT(&TIM_Handle);
// start timer interrupts
HAL_NVIC_SetPriority(TIM4_IRQn, 0, 1);
HAL_NVIC_ClearPendingIRQ(TIM4_IRQn);
HAL_NVIC_EnableIRQ(TIM4_IRQn);
while
(1)
{
}
}
void
TIM4_IRQHandler(
void
)
{
if
(__HAL_TIM_GET_FLAG(&TIM_Handle, TIM_FLAG_UPDATE) != RESET)
//In case other interrupts are also running
{
if
(__HAL_TIM_GET_ITSTATUS(&TIM_Handle, TIM_IT_UPDATE) != RESET)
{
__HAL_TIM_CLEAR_FLAG(&TIM_Handle, TIM_FLAG_UPDATE);
/*put your code here */
}
}
}
Комментариев нет:
Отправить комментарий