으로 실행되지 않습니다. STM32에서 외부 인터럽트를 설정하는 데 어려움을 겪고 있으며, 많은 독서를하고 다른 사람들의 코드를 사용하고 있습니다. 그러나 운이 없다. 두 개의 버튼이 있는데 둘 중 하나를 누르면 LED가 켜질 것으로 예상됩니다.이 예제는 작동시키기위한 것일뿐입니다. 진행하기 전에 기능을 갖추고 싶었고 나머지 코드를 빌드하고 싶었습니다. 코드가 약간 지저분한 경우 미안하지만 코딩 기술을 신경 쓰지 않도록 노력하고 있습니다. 설명서 및 데이터 시트를 살펴 보았지만 아무 도움도되지 않습니다. 여기 STM32L1의 외부 인터럽트 설정이 4 일 동안 ISR
는 stm32l1xx_it.c#include "stm32l1xx_hal.h"
#include "stm32l1xx.h"
#include "stm32l1xx_it.h"
#include "buttons.h"
extern volatile uint8_t RightButtonFlag;
extern volatile uint8_t RightButtonFlag;
void EXTI15_10_IRQHandler(void)
{
if(GPIOC->IDR & GPIO_IDR_IDR_10){
RightButtonFlag = 1;
EXTI->PR |= EXTI_PR_PR10;
}
if(GPIOC->IDR & GPIO_IDR_IDR_11){
LeftButtonFlag = 1;
EXTI->PR |= EXTI_PR_PR11;
}
}
buttons.c
void controls_Interrupt_Init(void){
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; /* Enable System Configuration Register */
SYSCFG->EXTICR[3] |= SYSCFG_EXTICR3_EXTI11_PC; /* Set up External Interrupt for Pin 11 Port C */
SYSCFG->EXTICR[3] |= SYSCFG_EXTICR3_EXTI10_PC; /* Set up External Interrupt for Pin 10 Port C */
EXTI->IMR |= EXTI_IMR_MR11;
EXTI->IMR |= EXTI_IMR_MR10;
EXTI->FTSR |= EXTI_FTSR_TR11; /* Falling trigger Selection Reg. Trigger 11 */
EXTI->FTSR |= EXTI_FTSR_TR10; /* Falling trigger Selection Reg. Trigger 10 */
NVIC_SetPriority(EXTI15_10_IRQn,1); /* Set Interrupt priority for pins 10-15 */
NVIC_EnableIRQ(EXTI15_10_IRQn); /* Enable NVIC for Pins Between 10-15 */
}
및 buttons.h
void controls_Interrupt_Init(void);
#define Blue_ON() (HAL_GPIO_WritePin(BLUE_LED_PORT, BLUE_LED_PIN, 1))
#define Green_ON() (HAL_GPIO_WritePin(GREEN_LED_PORT, GREEN_LED_PIN, 1))
의 일부 얹는 내 main.c를
#include "stm32l1xx_hal.h"
#include "buttons.h"
static void MX_GPIO_Init(void);
bool RightButtonFlag = 0;
bool LeftButtonFlag = 0;
int main(void)
{
HAL_Init();
SystemClock_Config();
controls_Interrupt_Init();
MX_GPIO_Init();
while (1)
{
if(RightButtonFlag){
Blue_ON();
}
if(LeftButtonFlag){
Green_ON();
}
}
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
{
입니다
코딩에 익숙하지 않고 불쌍한 경험으로 아주 간단한 것을 망쳐 놓을 것으로 예상됩니다.
'MX_GPIO_Init()'는 어디에서 호출하나요? 'EXT15_10_IRQHandler()'에 중단 점을 설정하면 버튼을 누를 때 중단 점에 충돌합니까? – kkrambo
오, 그래! 미안 해요! main() 함수에서 호출되었으며이 문제와 관련이없는 많은 항목을 제거하여이 코드를 줄였습니다. MX_GPIO_Init()를 사고로 제거해야합니다. 실제 코드에 포함되어 있습니다. 혼란을 피하기 위해 이것을 편집 할 것입니다. –
메모리 뷰에서 해당 핀에 대한 PR (보류중인 레지스터)의 비트가 항상 0이며 디버거에서 1로 설정하려고 시도하면 디버거가 0으로 유지된다는 것을 알았습니다. –