首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STM32 HAL SPI中断处理

STM32 HAL SPI中断处理
EN

Stack Overflow用户
提问于 2017-08-02 21:07:44
回答 1查看 11.8K关注 0票数 1

我正在使用STM32F4xx,想学习使用ST-HAL编程。在我尝试通过中断发送/接收SPI的时刻。

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

Init函数:

代码语言:javascript
复制
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 */
}

启动函数:

代码语言:javascript
复制
void main(void)
{
    HAL_SPI_Receive_IT(&hspi1, buff, size);//Start the receiving process?   

    while(1)
    {
     . . . 
    }
}

Interrputhandler:

代码语言:javascript
复制
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 */
}

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

代码语言:javascript
复制
void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
{
    volatile uint8_t y = 5;
}

在我的问题之前:使用“正常的”SPI_Transmit&Receive函数,我正确地发送和接收。

我的问题是我不知道该如何使用这些函数。例如:当回调函数到来时,我应该在哪里调用start“function”,我是否必须清除Interruptflag,等等……

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

例如:

代码语言:javascript
复制
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函数:

代码语言:javascript
复制
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();
    }
}
EN

回答 1

Stack Overflow用户

发布于 2017-08-03 00:57:36

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

代码语言:javascript
复制
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我知道它应该是注释,但在注释中放置更长的代码片段是相当困难的

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45461753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档