首页 文章

STM32 HAL SPI中断处理

提问于
浏览
1

我正在使用STM32F4xx并希望学习使用ST-HAL进行编程 . 此刻我尝试通过中断发送/接收SPI .

我使用以下函数通过INT接收数据:

初始化功能:

void HAL_MspInit(void)
{
  /* USER CODE BEGIN MspInit 0 */

  /* USER CODE END MspInit 0 */

  HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);

  /* System interrupt init*/
  /* MemoryManagement_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(MemoryManagement_IRQn, 0, 0);
  /* BusFault_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(BusFault_IRQn, 0, 0);
  /* UsageFault_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(UsageFault_IRQn, 0, 0);
  /* SVCall_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SVCall_IRQn, 0, 0);
  /* DebugMonitor_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(DebugMonitor_IRQn, 0, 0);
  /* PendSV_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(PendSV_IRQn, 0, 0);
  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

  /* USER CODE BEGIN MspInit 1 */
    /* Peripheral interrupt init */

    HAL_NVIC_SetPriority(SPI1_IRQn, 1, 1); //<--------------------
    HAL_NVIC_EnableIRQ(SPI1_IRQn);         //<--------------------

  /* USER CODE END MspInit 1 */
}

启动功能:

void main(void)
{
    HAL_SPI_Receive_IT(&hspi1, buff, size);//Start the receiving process?   

    while(1)
    {
     . . . 
    }
}

Interrputhandler:

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

      /* USER CODE END SPI1_IRQn 1 */
}

回调函数(在主文件中定义):

void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
{
    volatile uint8_t y = 5;
}

在我的问题之前:使用“正常”SPI_Transmit和接收功能,我正确地发送和接收 .

我的问题是我不明白我应该如何使用这个功能 . 例如:当回调函数出现时,我应该在哪里调用start“函数”,我必须清除Interruptflags,等等......

目前我在while(1)循环中使用“HAL_SPI_Transmit_IT”和“HAL_SPI_Receive_IT” . 在Rx和Tx回调函数中,我有计数器变量 . 我看到tmpCounterRx计数但是tmpCounterTx dosnt ???

例如 . :

while (1)
{
    HAL_SPI_Transmit_IT(&hspi1, buff, size);
    HAL_Delay(500);
    HAL_SPI_Receive_IT(&hspi1, buff, size);  
}
}

void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
{
    tmpCounterTx++;
    volatile uint8_t x = 5;
}

void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
{
    tmpCounterRx++;
    volatile uint8_t y = 5;
}

第1版:

谢谢你的回复,这里是我的SPI init函数:

void MX_SPI1_Init(void)
{
    hspi1.Instance = SPI1;
    hspi1.Init.Mode = SPI_MODE_MASTER;
    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.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
    hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
    hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
    hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
    hspi1.Init.CRCPolynomial = 10;

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

1 回答

  • 1

    试试这个 . 我假设计数器是 volatile . 至少你会知道触发了什么中断,以及它是否是HAL回调配置问题 .

    volatile uint32_t tmpCounterRx1 = 0, tmpCounterTx1 = 0;
    
    void SPI1_IRQHandler(void)
    {
      if((SPI1 -> SR & SPI_SR_RXNE)) 
      {
        tmpCounterRx1++;
      } else    // intentional else do not remove
      if((SPI1 -> SR & SPI_SR_TXE)) 
      {
        tmpCounterTx1++;
      }
      /* USER CODE BEGIN SPI1_IRQn 0 */
    
      /* USER CODE END SPI1_IRQn 0 */
        HAL_SPI_IRQHandler(&hspi1);
        /* USER CODE BEGIN SPI1_IRQn 1 */
    
          /* USER CODE END SPI1_IRQn 1 */
    }
    

    PS我知道它应该是评论,但很难在评论中放置更长的代码片段

相关问题