Ini adalah kode untuk timer di proyek saya di STM32F429:
//timer initialization
void timerInit()
{
uwPrescalerValue2 = (uint32_t) ((SystemCoreClock / 2) / 100000) - 1;
RS485Timer.Instance = TIM5;
RS485Timer.Init.Period = 67400000; // high value to notice interrupt even without debugging
RS485Timer.Init.Prescaler = 400000;
RS485Timer.Init.ClockDivision = 0;
RS485Timer.Init.CounterMode = TIM_COUNTERMODE_UP;
HAL_TIM_Base_Init(&RS485Timer);
}
void timerReset()
{
HAL_TIM_Base_Stop_IT(&RS485Timer);
HAL_TIM_Base_DeInit(&RS485Timer);
HAL_TIM_Base_Init(&RS485Timer);
HAL_TIM_Base_Start_IT(&RS485Timer);
printf("%d timer reset\n", countereset);
countereset++;
}
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
/*##-1- Enable peripherals and GPIO Clocks #################################*/
/* TIMx Peripheral clock enable */
__TIM5_CLK_ENABLE();
/*##-2- Configure the NVIC for TIMx #########################################*/
/* Set the TIMx priority */
HAL_NVIC_SetPriority(TIM5_IRQn, 7, 1);
/* Enable the TIMx global Interrupt */
HAL_NVIC_EnableIRQ(TIM5_IRQn);
}
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim)
{
__TIM5_FORCE_RESET();
__TIM5_RELEASE_RESET();
HAL_NVIC_DisableIRQ(TIM5_IRQn);
}
void TIM5_IRQHandler(void)
{
if (__HAL_TIM_GET_FLAG(&RS485Timer, TIM_FLAG_UPDATE) != RESET) //In case other interrupts are also running
{
if (__HAL_TIM_GET_ITSTATUS(&RS485Timer, TIM_IT_UPDATE) != RESET)
{
__HAL_TIM_CLEAR_FLAG(&RS485Timer, TIM_FLAG_UPDATE);
HAL_TIM_IRQHandler(&RS485Timer);
printf("timer interrupt\n");
}
}
}
Dan setelah menjalankan timerReset()
fungsi di tengah program saya, interupsi dimulai tidak beberapa detik kemudian, tetapi segera. Saya mencoba beberapa timer lain untuk memeriksa apakah tidak ada masalah perangkat keras, tetapi tidak, tidak.
microcontroller
c
stm32
interrupts
timer
m0drzew
sumber
sumber
Jawaban:
Saya mengalami ini dengan STM32F105. Fungsi Pustaka Periferal Standar STM32F1xx sedikit berbeda dari apa yang Anda gunakan, tetapi idenya harus sama.
Mengeluarkan
TIM_TimeBaseInit()
fungsi menyebabkan bendera TIM_SR_UIF menjadi diatur. Saya belum kembali untuk mencari tahu mengapa. Setelah bit ini diatur, interupsi akan memicu segera setelah diaktifkan.Untuk memperbaikinya, setelah menelepon
TIM_TimeBaseInit()
, saya langsung meneleponTIM_ClearITPendingBit()
. Maka saya akan mengaktifkan interupsi denganTIM_ITConfig()
. Ini memperbaiki masalah.Rutin inisialisasi lengkap saya terlihat seperti ini:
sumber
__HAL_TIM_CLEAR_FLAG(&htim6, TIM_SR_UIF);
Karena saya memiliki masalah yang sama dan saya belum menemukan jawaban, saya membagikan pengalaman saya dengan harapan dapat membantu orang lain.
Saya percaya bahwa dalam kasus Anda, pengaturan URS (Perbarui Permintaan Sumber) sebelum menginisialisasi timer juga memecahkan masalah.
Dalam kasus saya, saya menggunakan driver low-layer, jadi kode contohnya adalah:
Masalahnya adalah saya menggunakan
LL_TIM_SetPrescaler(TIM16, 7999)
danLL_TIM_SetAutoReload(TIM16, 2999)
fungsi - fungsi untuk mengkonfigurasi basis waktu, dan saya menemukan bahwa ketika menggunakan fungsi-fungsi ini, nilai-nilai tidak diperbarui, jadi saya harus membuat acara untuk memperbarui nilai menggunakanLL_TIM_GenerateEvent_UPDATE(TIM16)
.Anda kemudian dapat menghapus bendera acara menggunakan
LL_TIM_ClearFlag_UPDATE(TIM16)
sebelum mengaktifkan interupsi, atau menggunakanLL_TIM_SetUpdateSource(TIM16, LL_TIM_UPDATESOURCE_COUNTER)
sebelum membuat acara.sumber
Saya punya masalah serupa di mod One Pulse dan saya menemukan solusi untuk perpustakaan HAL. Ketika saya mengontrol flag timer di fungsi "TIM2_IRQHandler", saya melihat "capture compare flag 1" sudah diset. Jadi saya membersihkan "capture bandingkan flag 1". Tapi kali ini saya melihat "capture bandingkan bendera 2" telah diselesaikan. Jadi saya membersihkan semua flag pembanding (dari 1 hingga 4) dalam fungsi "TIM2_IRQHandler" saya dengan menggunakan kode berikut.
sumber
Masalah yang sama dengan TIM_TimeBaseInit () dan STM32F0xx. String terakhir dari fungsi ini:
Ini mengatur acara pembaruan di Event Generation Register. Itu sebabnya saya memberi tanda centang pada IRQ Handler:
sumber