gpt4 book ai didi

c - STM32 HAL SPI 中断处理

转载 作者:太空宇宙 更新时间:2023-11-04 03:21:33 25 4
gpt4 key购买 nike

我正在使用 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&Receive 函数,我可以正确地发送和接收。

我的问题是我不明白应该如何使用这个函数。例如:Callback 函数应该在哪里调用start"function",是否需要清除Interruptflags,等等...

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

例如:

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 初始化函数:

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();
}
}

最佳答案

试试这个。我假设计数器是 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 我知道应该是注释,但是很难在注释中放置较长的代码片段

关于c - STM32 HAL SPI 中断处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45461753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com