2017-02-16 11 views
1

CubeMX를 사용하여 주변 장치를 초기화하는 간단한 프로젝트가 있습니다.STM32F0 SPI가 인터럽트를받지 않음

SPI는 슬레이브 모드이며 올바르게 초기화 된 것처럼 보이지만 8 비트 데이터를 클럭 할 때 인터럽트는 호출되지 않습니다.

여기 spi_interrupt() 인터럽트 행동에 대한 내 특정 코드, 그리고에서 브레이크 포인트가 터지지 않 코드를

/* SPI1 init function */ 
static void MX_SPI1_Init(void) 
{ 

    hspi1.Instance = SPI1; 
    hspi1.Init.Mode = SPI_MODE_SLAVE; 
    hspi1.Init.Direction = SPI_DIRECTION_2LINES; 
    hspi1.Init.DataSize = SPI_DATASIZE_8BIT; 
    hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; 
    hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; 
    hspi1.Init.NSS = SPI_NSS_SOFT; 
    hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; 
    hspi1.Init.TIMode = SPI_TIMODE_DISABLE; 
    hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; 
    hspi1.Init.CRCPolynomial = 7; 
    hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; 
    hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; 

    if (HAL_SPI_Init(&hspi1) != HAL_OK) 
    { 
    Error_Handler(); 
    } 

} 

void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) 
{ 

    GPIO_InitTypeDef GPIO_InitStruct; 
    if(hspi->Instance==SPI1) 
    { 
    /* USER CODE BEGIN SPI1_MspInit 0 */ 

    /* USER CODE END SPI1_MspInit 0 */ 
    /* Peripheral clock enable */ 
    __HAL_RCC_SPI1_CLK_ENABLE(); 

    /**SPI1 GPIO Configuration  
    PA5  ------> SPI1_SCK 
    PA6  ------> SPI1_MISO 
    PA7  ------> SPI1_MOSI 
    */ 
    GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; 
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; 
    GPIO_InitStruct.Pull = GPIO_NOPULL; 
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; 
    GPIO_InitStruct.Alternate = GPIO_AF0_SPI1; 
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); 

    /* Peripheral interrupt init */ 
    HAL_NVIC_SetPriority(SPI1_IRQn, 0, 0); 
    HAL_NVIC_EnableIRQ(SPI1_IRQn); 
    /* USER CODE BEGIN SPI1_MspInit 1 */ 

    /* USER CODE END SPI1_MspInit 1 */ 
    } 

} 

void SPI1_IRQHandler(void) 
{ 
    /* USER CODE BEGIN SPI1_IRQn 0 */ 

    /* USER CODE END SPI1_IRQn 0 */ 
    HAL_SPI_IRQHandler(&hspi1); 
    /* USER CODE BEGIN SPI1_IRQn 1 */ 
    spi_interrupt(); 
    /* USER CODE END SPI1_IRQn 1 */ 
} 

을합니다.

나는 CLKIN 핀에 스코프를 가지고 있으며, 확실히 8 클럭을 가지고있다.

+1

코드의 어디에서나 HAL_SPI_Receive_IT를 호출 했습니까? 실제로 인터럽트를 활성화하기 위해서 당신은이 매크로를 호출해야하기 때문에'HAL_SPI_ENABLE_IT (hspi, (SPI_IT_RXNE | SPI_IT_ERR));'HAL_SPI_Receive_IT' 함수가 그것을 호출하고 IRQ 핸들러는 주어진 바이트 수가 수신 된 후에 IRQ 핸들러를 비활성화시킵니다. –

+0

Bence의 정확한 해결책은 고맙습니다. – OXO

+0

여기에 다행이 오니, 다음 질문에 답해 드리겠습니다. –

답변

2

ST의 HAL 라이브러리는 초기화 기능에서 실제 주변 장치 인터럽트를 활성화하지 않습니다.

거의 모든 주변 장치에 대해서는 항상 다음과 같은 이름 구조 HAL_<peripheral>_<action>_IT이있는 추가 기능이 호출되어야하므로 SPI RX의 경우에는 HAL_SPI_Receive_IT이라고합니다.

이렇게하면 올바른 비트를 __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR))이라는 매크로로 설정하여 실제로 SPI RX 인터럽트를 사용할 수 있습니다. 예상 바이트 수 (이 값은 사용자에 의해 HAL_SPI_Receive_IT 전달 된) 다음에 도달하면 SPI RX 비활성화 될 HAL_SPI_IRQHandler 따라서 반복 HAL_SPI_Receive_IT 통화가 새로운 수신시 필요한 다시 인터럽트 것을

참고 .