STM32CubeMX 및 keil을 기반으로 버튼 외부 인터럽트 방식을 사용하여 LED 및 부저를 제어합니다.

머리말

이 기사에서는 LED의 켜짐 및 꺼짐과 부저 스위치를 제어하는 ​​외부 인터럽트 방법을 자세히 기록하며, 회로도의 시작 부분부터 기능의 최종 구현까지 자세히 설명합니다.
이 칼럼의 모든 내용은 STM32F407ZET6 칩을 기반으로 하며 블로거는 Puzhong의 Tianma F407 개발 보드를 사용합니다.

구현 기능: LED0 및 LED1은 기본적으로 꺼져 있으며 부저는 기본적으로 꺼져 있습니다. KEY0 키를 눌러 LED0을 켜고 끄고, KEY1 키를 눌러 LED1을 켜고 끄고,
KEY2 키를 눌러 버저 스위치를 제어하세요.


1. 회로도 이해

1.1 LED 및 KEY 구성도 이해

여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.

LED部分:
3.3V 전압은 저항 R12를 통해 DS0 발광 다이오드에 연결되며, VCC와 LED0의 해당 핀 사이에 전압 강하가 발생하면 DS0이 켜지고 빛을 방출합니다.
3.3V 전압은 저항 R14를 통해 DS1 발광 다이오드에 연결되며, VCC와 LED1의 해당 핀 사이에 전압 강하가 있으면 DS1이 켜지고 빛을 방출합니다.

따라서 LED를 먼저 켜려면 LED0 및 LED1 라벨 출력에 해당하는 핀을 로우 레벨로 만들어 LED0 및 LED1이 켜질 수 있도록 해야 합니다. 그러나 기본 상태는 LED가 어두운 것이므로 , 먼저 고전압으로 설정해야 합니다.

KEY部分:
KEY0-2 버튼 3개 중 한쪽 끝이 접지되어 있으므로 KEY0-2를 먼저 높게 당겨야 합니다. 레벨의 상승 또는 하강 에지에 의해 인터럽트가 발생하므로 레벨의 변화가 있어야 합니다.
그런 다음 KEY_UP을 사용하려면 가능하지만 기본적으로 낮게 설정되어야 합니다.

1.2 BEEP 부저

여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.

처음에 부저가 울리지 않게 하려면 다음과 같은 이유로 여기의 BEEP 핀의 초기 상태가 0이어야 합니다.

  1. Q2는 NPN 트랜지스터이므로 콜렉터에서 트랜스미터까지의 구간이 접지되어야만 부저 PG 사이에 전압 강하가 발생하고 부저가 울립니다.
  2. 처음에 부저가 울리지 않으면 NPN 트랜지스터가 도통되지 않고 베이스에 전류가 흐르지 않고 전압 강하가 없어야 함을 의미합니다.
  3. R38이 접지에 연결되어 있기 때문에 R38 위의 이 지점의 전압은 0입니다. 즉, 트랜지스터의 기본 전압은 이미 0입니다. BEEP 끝의 전압이 3.3V이면 저항 R37을 통해 전류가 생성됩니다. 그러면 트랜지스터가 전도되고 윙윙거리게 됩니다. 장치에서 경고음이 울립니다.

2. 외부 인터럽트 구성 설명

STM32CubeMX를 사용하여 외부 인터럽트를 구성하는 것은 매우 편리합니다. 구성해야 하는 핀을 선택하고 외부 인터럽트 모드로 설정한 다음 활성화하기만 하면 됩니다. 후속 CodeGenerate가 자동으로 구성합니다. 이것이 더 좋습니다. 표준 라이브러리 자체 구성이 훨씬 빠릅니다.
이 외부 인터럽트는 직렬 포트 전송 인터럽트와 약간 다르며 전자는 항상 트리거될 수 있지만 후자는 사용할 때 한 번만 트리거될 수 있습니다. 나중에 콜백 함수를 작성하는 것과 조금 다르기 때문에 언급합니다.

3. STM32CubeMX 구성

이 세 개의 KEY 핀은 각각 외부 인터럽트로 설정되며, 여기서 KEY2는 GPIO_EXIT2, KEY1은 GPIO_EXIT3, KEY0은 GPIO_EXIT4에 해당합니다.
여기에 이미지 설명을 삽입하세요.

LED0, LED1 및 BEEP의 해당 핀은 각각 GPIO_Output으로 설정됩니다.
여기에 이미지 설명을 삽입하세요.

GPIO 핀 구성

KEY 구성의 경우

여기에 이미지 설명을 삽입하세요.

LED 및 BEEP 구성
여기에 이미지 설명을 삽입하세요.

인터럽트 활성화

여기에 이미지 설명을 삽입하세요.

외부 수정 발진기 구성

여기에 이미지 설명을 삽입하세요.
디버깅을
위한 인터페이스는 디버깅 인터페이스 장치에 따라 다르며 일반적으로 SerialWire입니다.

여기에 이미지 설명을 삽입하세요.

클록 트리 구성

여기서 최종 클록은 최대로 설정되고 소프트웨어는 클록 소스와 주파수 분배기 계수를 자동으로 선택합니다.

여기에 이미지 설명을 삽입하세요.
코드 생성

keil이 코드 플랫폼으로 사용되므로 여기서는 MDK-ARM이 선택되었습니다.
여기에 이미지 설명을 삽입하세요.

다음 두 가지 옵션은 개인 취향에 따라 선택되며 이는 단지 소개에 불과합니다.

여기에 이미지 설명을 삽입하세요.
구성이 완료되면 오른쪽 상단의 를 클릭하여 여기에 이미지 설명을 삽입하세요.대상 프로젝트에 대한 코드를 생성합니다.

아래 그림은 생성된 타겟 코드를 보여줍니다.우리의 인터럽트 구성은 주로 소스 파일의 보라색 상자에 있고 코드 프레임은 빨간색 상자에 표시됩니다.

여기에 이미지 설명을 삽입하세요.


4. 코드 작성

4.1 코드 작성 아이디어

키를 누르면 해당 인터럽트 서비스 루틴을 통해 외부 인터럽트가 트리거됩니다.
예를 들어 아래 그림의 EXTI4_IRQHandle(void) 함수는 KEY0을 눌렀을 때 호출되는 인터럽트 서비스 루틴이다.
다른 EXTI2, 3에도 동일하게 적용됩니다.
여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.
모든 인터럽트 서비스 루틴은 결국 `HAL_GPIO_EXTI_IRQHandler(xxx) 함수를 호출하고 이 함수의 정의를 찾습니다.

여기에 이미지 설명을 삽입하세요.

해당하는 모든 외부 인터럽트가 실제로 이 함수를 결국 호출하지만 전달된 핀 매개변수가 다르다는 것을 알 수 있습니다. 다른 핀 매개변수에는 다른 핀의 외부 인터럽트에 대해 다른 인터럽트 서비스 루틴이 필요합니다.

모든 인터럽트 서비스 루틴은 매개변수에 관계없이 이 함수를 호출합니다. HAL_GPIO_EXTI_Callback(GPIO_Pin)이는 인터럽트가 발생한 후 콜백 함수입니다. 이것은 무엇을 의미 하는가? 즉, 버튼을 누른 후 외부 인터럽트가 트리거되고, 외부 인터럽트가 트리거된 후 시스템에 무엇을 해야 하는지 알려줍니다.

이 함수 정의를 다시 찾으세요.
여기에 이미지 설명을 삽입하세요.
우리는 이것이 다시 작성할 수 있는 인터페이스인 약한 함수라는 것을 발견했습니다.
따라서 인터럽트가 발생한 후 해당하는 모든 작업은 실제로 이 콜백 함수에 기록될 수 있습니다. 이는 인터럽트가 발생할 때마다 무언가를 해야 한다는 것을 의미합니다.


4.2 콜백 함수 다시 작성

이제 코드를 수정할 위치를 알았으므로 콜백 함수를 다시 작성하는 것 외에는 아무것도 없습니다.
구현해야 하는 기능은 다음과 같습니다.

LED0과 LED1은 기본적으로 켜져 있고 부저는 기본적으로 꺼져 있습니다. KEY0 키를 눌러 LED0을 켜고 끄고, KEY1 키를 눌러 LED1을 켜고 끄고,
KEY2 키를 눌러 버저 스위치를 제어하세요.

그러면 여기서 내가 하는 일은 어떤 인터럽트가 트리거되었는지 확인하고 해당 상태를 조정하는 것입니다.

KEY0을 누르면 LED0이 밝은 상태에서 어두운 상태로 변경됩니다. 즉, 레벨이 반전됩니다.
다른 사람들에게도 마찬가지입니다.

여기에 이미지 설명을 삽입하세요.

콜백 함수 소스 코드:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	switch(GPIO_Pin){
		case KEY0_Pin:
		{
			 HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
				break;
		}
		case KEY1_Pin:
		{
				HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
			break;
		}
		case KEY2_Pin:
		{
				HAL_GPIO_TogglePin(BEEP_GPIO_Port,BEEP_Pin);
			break;
		}
	}
}

나머지는 컴파일하고, 굽고, 실행하는 작업이므로 여기서는 설명하지 않겠습니다.
컴파일 중에 오류가 발생하면 내 블로그를 참조하세요. STM32 keil 굽기 중에 프로그램 알고리즘 오류가 발생합니다.

Puzhong Tianma F407ZET6을 구입했기 때문에 함께 제공된 디버깅 프로그래머는 DAP에서 나온 것이므로 이 프로그래머는 해당 프로그래머에 따라 수정되어야 할 수도 있습니다.

여기에 이미지 설명을 삽입하세요.

귀하의 것이 STlink라면 귀하의 디버거에 따라 수정하십시오.

여기에 이미지 설명을 삽입하세요.

keil5의 자동 완성 기능은 실제로 그다지 좋지 않습니다. 동일한 구성 방법을 사용하면 다른 컴퓨터에서 완성이 작동하지 않습니다.
하지만 내 데스크탑 자동 완성 기능은 괜찮기 때문에 약간 짜증이 납니다.

Keil이 자동 완성되도록 하려면 아래와 같이 하세요.
여기에 이미지 설명을 삽입하세요.

그 다음에
여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.

왼쪽에 있는 것이 없으면 주로 중국어 버전이 아닌 케일을 다시 설치하십시오. 중국어 버전에는 자동 완성 기능이 없습니다.

그래도 이 설정이 안되면 다른 STM32CubeIDE 프로젝트를 생성해서 코드를 동일하게 만들어서 STM32IDE에 작성해 보세요. 결국 자동 완성은 좋은데 디버거는 제한적이어서 ST사 제품이어야 합니다. 나와 같은 DAP와 같은 상점에서 제공하는 디버거를 사용하려면 여전히 keil을 사용해야 합니다.


요약하다

이 블로그는 오래전에 시작해서 아직 완성되지 않았으며, 비교적 간단하지만 인터럽트의 전체 호출 과정과 STM32CubeMX+Keil의 협력 사용 과정을 자세히 설명하고 있습니다. 일반적으로 글을 써서 뭔가를 얻는 것은 괜찮습니다.

Supongo que te gusta

Origin blog.csdn.net/Edwinwzy/article/details/129763949
Recomendado
Clasificación