kali ini, kita akan mempelajari bagaimana cara mengatur sebuah pin GPIO agar menjadi pin interrupt pada sisi naik (rising), sisi turun (falling), atau kedua-duanya. Selain itu, kita akan menulis handler ISR (Interrupt Service Routine) untuk interrupt ini, di mana kita akan mengubah status pin output (misalnya, LED). Terakhir, kita akan memeriksa waktu respons interrupt dan laten interrupt.
Tutorial
1. MEngatur GPIO
|
8 sebagai output |
|
9 sebagai interrupt |
|
yg 9 dibuat tanpapullup-pulldown |
|
set intterupt |
|
set prioritas intterupt |
|
set clock |
|
Set frekuensi |
1. Kode di Main.c
defaultnya aja
#include "main.h" void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); while (1) { } } |
nah ini bagian setting gpio.
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
/*Configure GPIO pin : PA8 */
GPIO_InitStruct.Pin = GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pin : PA9 */
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* EXTI interrupt init*/
HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
}
Baris terakhir dalam fungsi ini melakukan hal berikut: mengonfigurasi tingkat prioritas interrupt pada EXTI line9, dan mengaktifkan sinyal interrupt-nya. Mode pemicu interrupt dipilih dalam konfigurasi pin input itu sendiri (pada sisi naik). Dan tentu saja, Anda dapat mengubahnya sesuai dengan aplikasi yang sedang Anda kembangkan.
bagian file stm32f1xx_hal_gpio.c
ISR (Interrupt Service Routine) yang dipanggil dan dieksekusi saat terjadi interrupt ini dapat ditemukan dalam file stm32f1xx_it.c, jadi mari kita beralih ke sana sekarang!
/******************************************************************************/
/* Cortex-M3 Processor Interruption and Exception Handlers */
/******************************************************************************/
void NMI_Handler(void)
{
/* USER CODE BEGIN NonMaskableInt_IRQn 0 */
/* USER CODE END NonMaskableInt_IRQn 0 */
/* USER CODE BEGIN NonMaskableInt_IRQn 1 */
/* USER CODE END NonMaskableInt_IRQn 1 */
}
// And all other internal exceptions/interrupts handlers
// ..
// ..
// ..
/******************************************************************************/
/* STM32F1xx Peripheral Interrupt Handlers */
/* Add here the Interrupt Handlers for the used peripherals. */
/* For the available peripheral interrupt handler names, */
/* please refer to the startup file (startup_stm32f1xx.s). */
/******************************************************************************/
void EXTI9_5_IRQHandler(void) // <----- The ISR Function We're Looking For!
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_9);
}
Caranya: cara menemukan deklarasi fungsi HAL_GPIO_EXTI_IRQHandler(). Caranya adalah dengan menyorot mouse ke nama fungsi tersebut, kemudian klik kanan dan pilih opsi untuk membuka deklarasinya. Ini akan membawa Anda ke file sumber di mana fungsi tersebut didefinisikan, yaitu file stm32f1xx_hal_gpio.c.
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
/* EXTI line interrupt detected */
if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u)
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); // Clears The Interrupt Flag
HAL_GPIO_EXTI_Callback(GPIO_Pin); // Calls The ISR Handler CallBack Function
}
Kenapa?: fungsi HAL_GPIO_EXTI_IRQHandler() membersihkan sumber interrupt, kemudian memanggil fungsi callback handler ISR. Sekarang, kita akan menulis implementasi callback function ini dalam aplikasi kita (file main.c).
Kembali ke file Main.c
Dalam fungsi callback ISR ini, kita akan memeriksa sumber pin interrupt, kemudian mengubah status pin GPIO output.
bikin jadiseperti ini:
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
// Stay IDLE .. Everything is done in the ISR Handler
}
}
// EXTI Line9 External Interrupt ISR Handler CallBackFun
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_9) // If The INT Source Is EXTI Line9 (A9 Pin)
{
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_8); // Toggle The Output (LED) Pin
}
}
hasil
Dalam gambar yang ditampilkan, garis biru mewakili sinyal input dari tombol tekan (push button), sedangkan garis kuning mewakili keluaran dari pin LED. Pada pandangan normal, keduanya tampak identik dan tidak terlihat adanya penundaan, sehingga respons terlihat langsung dan jejaknya saling tumpang tindih.
Namun, setelah melakukan zoom pada pembagian waktu, kita dapat melihat sedikit penundaan antara saat tombol ditekan (rise to 1) dan perubahan keadaan LED. Penundaan ini diukur hampir 1,6 mikrodetik.
Penundaan ini mencakup laten interrupt, overhead pengalihan konteks, dan prosedur callback ISR serta panggilan fungsi HAL_TogglePin. Secara keseluruhan, waktu respons yang diperoleh sangat bagus. Anda dapat meningkatkannya dengan menulis langsung ke port pin keluaran GPIO tanpa menggunakan fungsi HAL_GPIO. Ini akan menjadi topik untuk tutorial kedepannya!
Download file proteus dan kode simulasi
0 Response to "Tutorial 4: Contoh Interupsi Eksternal STM32"
Posting Komentar
Berkomentarlah dengan baik ^_^