You are on page 1of 22

MICROCONTROLLER ENGINEERING

Prof. SI HYUN LEE

November 12, 2021 -1-

Full Class Schedule


Day Subject Contents Reference (Text Book) Remark
Class-1: ARM STM32F429ZIT Architecture p.1-25
NUCLEO-F429ZI B/D &
Day-01 Class-2: NUCLEO-F429ZI Reference Board p.1-25
Development Environment
Class-3: STM32CubeIDE Installation & Code Analysis p.1-25
Class-1: Introduction, GPIO_EX3_1 p.57
Day-02 GPIO(1) Class-2: GPIO_EX3_4 p.69
Class-3: GPIO_EX3_8, Summary p.73
Class-1: Introduction, GPIO_EX3_3 p.64
Day-03 GPIO(2) Class-2: GPIO_EX3_7 p.71
Class-3: GPIO_EX3_9, Summary p.76
Class-1: Introduction, INTERRUPT_EX4_1 p.88 Polling method
Day-04 Interrupt(1) Class-2: INTERRUPT_EX4_5 p.94
Class-3: INTERRUPT_EX4_6, Summary p.96
NVIC :
Class-1: Introduction, INTERRUPT_EX4_8 p.101
Interrupt method
Day-05 Interrupt(2)
Class-2: INTERRUPT_EX4_11 p.111
Class-3: INTERRUPT_EX4_12, Summary p.112
Fundamental
Class-1: Introduction, ADC_EX5_1 p.120
Reference
Day-06 ADC(1)
Class-2: ADC_EX5_2 p.123
Class-3: ADC_EX5_3, Summary p.132
Class-1: Introduction, ADC_EX5_4 p.134 Advanced
Day-07 ADC(2) Class-2: ADC_EX5_5 p.136 Structure : 3-ways
Class-3: ADC_EX5_6, Summary p.138
Class-1: Introduction, TIMER_EX1
Day-08 Timer(1) Class-2: TIMER_EX2
Class-3: TIMER_EX3, Summary
Class-1: Introduction, TIMER_EX4
Day-09 Timer(2) Class-2: TIMER_EX4
Class-3: TIMER_EX5, Summary
Class-1: Introduction, Buzzer p.178, p.181, p.183 Final Exam. : 90Min
Day-10 Application Programming Class-2: Light_Sensor, Water Sensor p.195, p.201
Class-3: UART, Summary p.241
November 12, 2021 -2-

1
Florida, Orlando, Key West, Miami Travel

November 12, 2021 -3-

DAY-5 : Fundamental Interrupt Programming(2)

Learning Object

How to Design a Control Program That Turns On/Off of 1 LED with a switch using the
interrupt method

Class Application Program Example

• Using interrupt method INT_EX4_8. p.101 (NVIC : Nested


Class-1
• Using GPIO Port Setting Vectored Interrupt Controller )

• Using interrupt method INT_EX4_11. p.111


Class-2
• Without using GPIO Port Setting Function call & return value

• Using interrupt method


INT_EX4_12. p.112
Class-3 • Without using GPIO Port Setting
Practice / textbook p. 114
• Using Direct Register Access

November 12, 2021 -4-

2
Refer p.88

1. 인터럽트 (Interrupt)
• 인터럽트는 프로그램을 실행하는 도중에 예기치 않은 상황이 발생할 경우 현재 실행중인 작업을 즉시 중단하고
발생된 상황을 우선 처리한 후 실행 중이던 작업으로 복귀하여 계속 처리하는 것

2. 인터럽트 발생 종류
• 외부 인터럽트
• 내부 인터럽트
• 소프트웨어 인터럽트

November 12, 2021 -5-

Refer p.88

main() 함수 인터럽트 서비스 루틴

• 인터럽트가 요구되면 현재 수행하던


명 령 을 종 료 하 고 interrupt vector • 인터럽트 레지스터 확인 (EXTI_IMR,
table로 무조건 점프 EXTI_EMR, EXTI_RTSR, EXTI_FTSR)

명령어N • PC (Program Counter) 저장 Push Operation


Jump • 레지스터 값을 저장
인터럽트 발생 명령어N+1 Vector Table
명령어N+2
명령어N+3
• 인터럽트 서비스 수행
Return

• PC (Program Counter) 값 반환 Pop Operation


• 레지스터 값을 복구
main() 함수

인터럽트 서비스 루틴을 종료하고 호출 함수로 복귀

November 12, 2021 -6-

3
Refer p.88
3. 인터럽트 (interrupt) 처리 방식 (1 of 2)

(1) 폴링 (polling) 방식의 인터럽트 : DAY4


• GPIO와 Switch를 사용하여 LED를 On/Off

(2) NVIC (Nested Vectored Interrupt Controller) 방식의 인터럽트 : DAY5


•HAL_NVIC_SetPriority() 함수 : 인터럽트 우선 순위 설정
•HAL_NVIC_EnableIRQ 함수 : NVIC 인터럽트 컨트롤러에서 장치별 인터럽트를 활성화
•HAL_GPIO_EXTI_IRQHandler 함수 : GPIO에서 발생한 EXTI 인터럽트 요청을 처리
•HAL_GPIO_EXTI_Callback 함수 : GPIO에서 발생한 EXTI 인터럽트를 처리하는 Callback 함수이다.

November 12, 2021 -7-

Refer p.88

4. 인터럽트 요청 시 처리 과정

• 인터럽트 발생  인터럽트 요구

• 프로그램 수행 중단 -현재 수행중인 명령의 수행이 완료된 시점에서 중단 ...

• Push Stack (레지스터 복사(대피), 현재 수행 중인 번지 저장)

• 인터럽트 벡터 테이블로 점프  인터럽트 전처리 실행 : Refer, App./p.372

• 인터럽트 처리 루틴 수행

• Pop Stack (레지스터 복사, 이전 수행 다음 번지로 복귀)

November 12, 2021 -8-

4
Class-1 : How to design a control program that turns
on/off 1 LED with a switch using the
interrupt method

INT_Ex4_8 : refer p.101

-Using STM32 project


-using CubeMX for PD0 Port setting
-using interrupt mode
-press SW1  LED1 ON,
-press SW2  LED1 OFF
-Same operation as Example INT_EX4_8, INT_EX4_11, INT_EXT4_12

November 12, 2021 -9-

1. Create a Project Refer p.101

1. File / New / Project / stm32 project

2. MCU/MPU Selector
-Core : Arm Cortex-M4
-Series : STM32F4
-Line : STM32F429/439
-Package : LQFP144

-Next
-Project Name : INT_EX4_8
-Finish

November 12, 2021 -10-

5
2. Pinout & Configuration (1 of 4) Refer p.101

Must be set like this. If it is set to Disable, the LED does


not turn on.

November 12, 2021 -11-

2. Pinout & Configuration (2 of 4) Refer p.101

반드시 이렇게 설정해야 함


Disable: LED가 ON되지 않음

set up for debugging

November 12, 2021 -12-

6
2. Pinout & Configuration (3 of 4) Refer p.101

If INT0 and INT1 are not set in


PG0 and PG1 ports and the
EXTI0/1 interrupt item of NVIC
is not checked, the interrupt
handler code is not generated.

If you don't set NVIC here,


see Stm32f4xx_it.c on next
page You must add two handlers
in the file.

November 12, 2021 -13-

2. Pinout & Configuration (4 of 4) Refer p.101

-Set the GPIOD port to CubeMX -Set the port output of GPIOD (LED1) to CubeMX with CubeMX
-Set the ports of GPIOG (SW1, SW2) as interrupts with CubeMX
-PD0  LED1 Output
-PG0/1  SW1, SW2 (using interrupt method)

November 12, 2021 -14-

7
3. Clock Configuration Refer p.101

It does not matter whether the clock setting is the default setting value

November 12, 2021 -15-

Interrupt? Refer p.101

First of all today, we will be started with an example program as a way to understand the
concept of interrupt handling. Because there is a lot of content related to interrupts.

In the next time, we will be added more details about interrupts and interrupt service
routines.

The contents (ADC, TIMER) that continue from the next time describe the contents of the
interrupt.

Interrupt Service Routine


1. Interrupt request
2. Jump interrupt vector table
3. Call interrupt handler
4. Call interrupt callback function
5. Return main routine

November 12, 2021 -16-

8
4. Coding : main.h & main.c Refer p.101

main.h (1 of 1)

-No additional code in this file

November 12, 2021 -17-

5. Coding : main.h & main.c Refer p.101

main.h (1 of 1)

-No additional code in this file

November 12, 2021 -18-

9
main.c (1 of 4) Refer p.101

/* Private variables ---------------------------------------------------------*/


/* USER CODE BEGIN PV */

uint16_t flag= 0;

/* USER CODE END PV */

November 12, 2021 -19-

main.c (2 of 4) Refer p.101

int main(void)
{
/* Initialize all configured peripherals */

/* USER CODE BEGIN 2 */

HAL_NVIC_SetPriority (EXTI0_IRQn, 0, 0);


HAL_NVIC_EnableIRQ (EXTI0_IRQn);

HAL_NVIC_SetPriority (EXTI1_IRQn, 0, 0);


HAL_NVIC_EnableIRQ (EXTI1_IRQn);

/* USER CODE END 2 */

November 12, 2021 -20-

10
main.c (3 of 4) Refer p.101

/* Infinite loop */
/* USER CODE BEGIN WHILE */

while (1)
{
if (flag == 1){
HAL_GPIO_WritePin (GPIOD, GPIO_PIN_0, GPIO_PIN_SET);
}

if (flag== 0)
{
HAL_GPIO_WritePin (GPIOD, GPIO_PIN_0, GPIO_PIN_RESET);
}

/* USER CODE END WHILE */

November 12, 2021 -21-

main.c (4 of 4) Refer p.101

/* USER CODE BEGIN 4 */

void HAL_GPIO_EXTI_Callback (uint16_t GPIO_PIN)


{
if (GPIO_PIN == GPIO_PIN_0 )
flag= 1;
if (GPIO_PIN == GPIO_PIN_1 )
flag= 0;
}

/* USER CODE END 4 */

November 12, 2021 -22-

11
stm32f4xx_it.c (1 of 2) This file is where Interrupt Service Routines are defined. Refer p.101

If INT0 and INT1 are not set in


PG0 and PG1 ports and the
EXTI0/1 interrupt item of NVIC
is not checked, the interrupt
handler code is not generated.

If you don't set NVIC here,


see Stm32f4xx_it.c on next
page You must add two handlers
in the file.

November 12, 2021 -23-

stm32f4xx_it.c (2 of 2) Refer p.101

// brief This function handles EXTI line0 interrupt.

void EXTI0_IRQHandler (void)


{
/* USER CODE BEGIN EXTI0_IRQn 0 */
/* USER CODE END EXTI0_IRQn 0 */

HAL_GPIO_EXTI_IRQHandler (GPIO_PIN_0);

/* USER CODE BEGIN EXTI0_IRQn 1 */


/* USER CODE END EXTI0_IRQn 1 */
}
This code is automatically generated when you
// brief This function handles EXTI line1 interrupt. set EXTI0 and EXTI1 of the previous page in
PG0 and PG1 by CubeMX.
void EXTI1_IRQHandler(void)
{
/* USER CODE BEGIN EXTI1_IRQn 0 */
/* USER CODE END EXTI1_IRQn 0 */ If you do not set it in CubeMX, you need to
add these two codes in stm32f4xx_it.c
HAL_GPIO_EXTI_IRQHandler (GPIO_PIN_1);

/* USER CODE BEGIN EXTI1_IRQn 1 */


/* USER CODE END EXTI1_IRQn 1 */
}

November 12, 2021 -24-

12
Class-2 : How to design a control program that turns
on/off 1 LED with a switch using the
interrupt method

INT_Ex4_11 : refer p.111

-Using STM32 project


-Without using CubeMX for PD0 Port setting
-Using interrupt mode
-press SW1  LED1 ON,
-press SW2  LED1 OFF
-Same operation as Example INT_EX2, INT_EX3

November 12, 2021 -25-

5. Coding : main.h & main.c Refer p.111

main.h (1 of 1)

-No additional code in this file

November 12, 2021 -26-

13
main.c (1 of 3) Refer p.111

/* USER CODE BEGIN 2 */

__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOG_CLK_ENABLE();

GPIO_InitTypeDef LEDConfig;
GPIO_InitTypeDef SWConfig;

LEDConfig.Pin = GPIO_PIN_0;
LEDConfig.Mode = GPIO_MODE_OUTPUT_PP; // Without this code, the LED will not turn on
HAL_GPIO_Init (GPIOD, &LEDConfig);

SWConfig.Pin = GPIO_PIN_0 | GPIO_PIN_1;


SWConfig.Mode = GPIO_MODE_IT_RISING;
HAL_GPIO_Init (GPIOG, &SWConfig);

HAL_NVIC_SetPriority (EXTI0_IRQn, 0, 0); // Activate SW1


HAL_NVIC_EnableIRQ (EXTI0_IRQn);

HAL_NVIC_SetPriority (EXTI1_IRQn, 0, 0); // Activate SW2


HAL_NVIC_EnableIRQ (EXTI1_IRQn);

/* USER CODE END 2 */

November 12, 2021 -27-

main.c (2 of 3) Refer p.111

while(1)
{

-No additional code in this file

November 12, 2021 -28-

14
main.c (3 of 3) Refer p.111

/* USER CODE BEGIN 4 */

void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin)


{
if (GPIO_Pin == GPIO_PIN_0 )
HAL_GPIO_WritePin (GPIOD, GPIO_PIN_0, GPIO_PIN_SET);

if (GPIO_Pin == GPIO_PIN_1 )
HAL_GPIO_WritePin (GPIOD, GPIO_PIN_0, GPIO_PIN_RESET);
}

/* USER CODE END 4 */

November 12, 2021 -29-

stm32f4xx_it.c (1 of 1) Refer p.111

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

/* USER CODE BEGIN 1 */

void EXTI0_IRQHandler (void)


{
HAL_GPIO_EXTI_IRQHandler (GPIO_PIN_0);
}

void EXTI1_IRQHandler (void)


{
HAL_GPIO_EXTI_IRQHandler (GPIO_PIN_1);
}

/* USER CODE END 1 */

November 12, 2021 -30-

15
Class-3 : How to design a control program that turns
on/off 1 LED with a switch using the
interrupt method and register direct access

INT_Ex4_12 : refer p.112

-Using STM32 project


-Without using CubeMX for PD0 Port setting
-Using register direct access method
-Using interrupt mode
-press SW1  LED1 ON
-press SW2  LED1 OFF
-Same operation as Example INT_EX4_8, INT_EX4_11

November 12, 2021 -31-

Refer p.112

1. Project
-Same as INT_EX4_8, INT_EX4_11

2. Clock Configuration
-Same as Example INT_EX4, INT_EX4_11

3. Pinout & Configuration


-Coded in code without setting GPIOD port to CubeMX
-Coded the port output of GPIOD (LED1) with CubeMX without setting it to CubeMX
-Coded in code without setting the ports of GPIOG (SW1, SW2) to interrupt with
CubeMX

4. Coding : main.h & main.c


-Same as Example INT_EX4_8, INT_EX4_11

November 12, 2021 -32-

16
5. Coding : main.h & main.c Refer p.112

main.h (1 of 1)

-No additional code in this file

November 12, 2021 -33-

main.c (1 of 4) Refer p.112

/* Private variables ---------------------------------------------------------*/


/* USER CODE BEGIN PV */

uint16_t flag=0;

/* USER CODE END PV */

November 12, 2021 -34-

17
main.c (2 of 4) Refer p.112
int main(void) These two codes are absolutely necessary
{
/* USER CODE BEGIN 2 */

RCC->AHB1ENR = (1<<3)|(1<<6); // Provides clocks to RCC, GPIOD, and GPIOG ports


RCC->APB2ENR |= (1<<14); // APB2: EXTI, SYSCFG supply clock to peripherals

// GPIOD PD0 output


GPIOD->MODER |= 00005555;

// GPIOG PG0~PG1 input SYSCFG external interrupt configuration registers, Address offset: 0x08-0x14
GPIOG->OSPEEDR &= 0x00000000;
GPIOG->PUPDR &= 0x00000000; -If an interrupt is applied to pin PG0/1 If I delete this
code, it doesn't work
// SYSCFG
SYSCFG->EXTICR[0] = (SYSCFG_EXTICR1_EXTI0_PG | SYSCFG_EXTICR1_EXTI1_PG);

EXTI->IMR |= 0x0000000F; #define SYSCFG_EXTICR1_EXTI0_PG 0x0006U


// EXTI->EMR &= 0x00000003;
EXTI->RTSR |= 0x0000000F; #define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE)
// EXTI->FTSR &= 0x0000000C;

NVIC_SetPriority (EXTI0_IRQn,0);
NVIC_EnableIRQ (EXTI0_IRQn);

NVIC_SetPriority (EXTI1_IRQn,0);
NVIC_EnableIRQ (EXTI1_IRQn);

// __enable_irq(); // interrupt enabled by CPU (even if not enabled)

/* USER CODE END 2 */


November 12, 2021 -35-

main.c (2 of 4) for explanation Refer p.112

RCC->APB2ENR |= (1<<14); // APB2: EXTI, SYSCFG supply clock to peripherals

November 12, 2021 -36-

18
main.c (2 of 4) for explanation Refer p.112

PIN0 EXTI0 is assigned to pin 0 of PG port

SYSCFG->EXTICR[0] = (SYSCFG_EXTICR1_EXTI0_PG | SYSCFG_EXTICR1_EXTI1_PG);

EXTI1 is assigned to pin 1 of PG port


SYSCFG_EXTRICR1 : EXTI0, EXTO1, EXTO2, EXTI3
SYSCFG_EXTRICR2 : EXTI4, EXTI5, EXTI6, EXTI7
SYSCFG_EXTRICR3 : EXTI8, EXTI9, EXTI10, EXTI11
SYSCFG_EXTRICR4 : EXTI12, EXTI13, EXTI14, EXTI15

#define SYSCFG_EXTICR1_EXTI0_PG 0x0006U


#define SYSCFG_EXTICR1_EXTI1_PG 0x0060U

6 6

November 12, 2021 -37-

for explanation Refer p.112


stm32f429xx.h

@brief System configuration controller

typedef struct
{
__IO uint32_t MEMRMP; /*!< SYSCFG memory remap register, Address offset: 0x00 */
__IO uint32_t PMC; /*!< SYSCFG peripheral mode configuration register, Address offset: 0x04 */
__IO uint32_t EXTICR[4]; /*!< SYSCFG external interrupt configuration registers, Address offset: 0x08-0x14 */
uint32_t RESERVED[2]; /*!< Reserved, 0x18-0x1C */
__IO uint32_t CMPCR; /*!< SYSCFG Compensation cell control register, Address offset: 0x20 */
} SYSCFG_TypeDef;

#define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE)

#define SYSCFG_EXTICR1_EXTI0_PG 0x0006U

November 12, 2021 -38-

19
main.c (2 of 4) for explanation Refer p.112

EXTI->IMR |= 0x0000000F; // interrupt enable  INT0, INT1, INT2, INT3

EXTI->IMR

1 1 1 1

EXTI->EMR &= 0x00000003;

EXTI->EMR

GPIOG1, GPIOG0

November 12, 2021 -39-

main.c (2 of 4) for explanation Refer p.112

EXTI->RTSR |= 0x0000000F;

EXTI->RTSR

1 1 1 1

EXTI->FTSR &= 0x0000000C;

EXTI->FTSR

8 4 2 1

1 0 1 0

November 12, 2021 -40-

20
main.c (3 of 4) Refer p.112

/* Infinite loop */

/* USER CODE BEGIN WHILE */

while (1)
{
if(flag ==1)
GPIOD->ODR |= 0x00000001;

if(flag ==0)
GPIOD->ODR &= 0xFFFF0000;

/* USER CODE END WHILE */

November 12, 2021 -41-

main.c (4 of 4) Refer p.112

/* USER CODE BEGIN 4 */

void HAL_GPIO_EXTI_Callback (uint16_t GPIO_PIN)


{
if (GPIO_PIN == (GPIOG->IDR & 0x01) )
flag= 1;
if (GPIO_PIN == (GPIOG->IDR & 0x02) )
flag= 0;
}

/* USER CODE END 4 */

November 12, 2021 -42-

21
Stm32f4xx_it.c Refer p.112

/* USER CODE BEGIN 1 */

void EXTI0_IRQHandler (void)


{
HAL_GPIO_EXTI_IRQHandler ((GPIOG->IDR & 0x01));
}
Because this code did not set NVIC in
void EXTI1_IRQHandler (void)
CubMX I added this code separately
{
HAL_GPIO_EXTI_IRQHandler ((GPIOG->IDR & 0x02));
}

/* USER CODE END 1 */

November 12, 2021 -43-

Summary : Day-5

Class-1: Introduction, INTERRUPT_EX4_8 p.101

Day-04 Interrupt(1) Class-2: INTERRUPT_EX4_11 p.111

Class-3: INTERRUPT_EX4_12, Summary p.112

November 12, 2021 -44-

22

You might also like