وقفه خارجی در ARM

کار با وقفه خارجی


خلاصه

در این آموزش با واحد وقفه خارجی آشنا می شویم. سپس در غالب یک پروژه با استفاده از وقفه خارجی، متناظر با هر کلید فشاری یکی از LED های برد آموزشی را روشن و خاموش می کنیم


مشاهده ویدیو


ایجاد پروژه در نرم افزار کیوب


انتخاب پین های متناسب با LED ها و کلید های فشاری برد آموزشی در حالت وقفه خارجی



انجام تنظیمات مربوط به وقفه خارجی


فعال کردن وقفه خارجی



در نرم افزار Keil می توان از قسمت Application/User به برنامه اصلی دسترسی داشت



تشریح کد برنامه


هدرفایل های مورد نیاز پروژه


/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f1xx_hal.h"

پیش تعریف توابع ایجاد شده توسط نرم افزار کیوب


/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);

جزئیات تابغ MX_GPIO_Init



/** Configure pins as 
        * Analog 
        * Input 
        * Output
        * EVENT_OUT
        * EXTI
*/
static void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5, GPIO_PIN_RESET);

  /*Configure GPIO pins : PC2 PC3 PC4 PC5 */
  GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /*Configure GPIO pins : PC6 PC7 PC8 PC9 */
  GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);

}

تابع main


در ابتدای برنامه تمام بخش های میکروکنترلر ریست می شود، واحد کلاک میکرو کنترلر تنظیم می شود و واحد GPIO طبق آنچه که در نرم افزار کیوب انتخاب کردیم تنظیم می شود.


int main(void)
{
  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();

تابع سرویس دهنده به روتین وقفه در فایل stm32f10x_it.c


/******************************************************************************/
/* 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).                    */
/******************************************************************************/

/**
* @brief This function handles EXTI line[9:5] interrupts.
*/
void EXTI9_5_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI9_5_IRQn 0 */

  /* USER CODE END EXTI9_5_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_6);
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_7);
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8);
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_9);
  /* USER CODE BEGIN EXTI9_5_IRQn 1 */

  /* USER CODE END EXTI9_5_IRQn 1 */
}

تابع Callback وقفه


 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	switch (GPIO_Pin){
		case GPIO_PIN_6 : HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);
		break;
		case GPIO_PIN_7 : HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);
		break;
		case GPIO_PIN_8 : HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_4);
		break;
		case GPIO_PIN_9 : HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_5);
		break;		
	}
	
}


پروژه وقفه خارجی

کانال تلگرام نامینیک

گروه تلگرام نامینیک ARM STM32


Tags: , , , , , ,