问题:CUBE MX+STM32H743+SPI6+BDMA无法进入SPI中断回调函数HAL_SPI_TxCpltCallback
BDMA仅可以范围地址0x3800 0000 #define __ATTR_RAM_D3 __attribute__ ((section(".RAM_D3"))) __attribute__ ((aligned (4))) uint8_t g_ucBufHead10 __ATTR_RAM_D3; uint8_t ucaSpiData10[DBUF_NUM][SPI_PACKET_LEN] __ATTR_RAM_D3;
发现无法进入SPI6_IRQHandler(); 发现时钟SPI6的时钟设置为了80MHZ,STM32的SPI外设可用作通讯的主机及从机,支持最高的SCK时钟频率为fpclk/2 修改后改为40MHZ;STM32H7的主频400MHz时,SPI1, 2, 3最高通信时钟是100MHz,而SPI4, 5, 6是50MHz。
经调试发现可以进入SPI6中断了,但是没有进入HAL_SPI_RxCpltCallback
检查 SPI_SR 寄存器状态: · RXNE(接收缓冲区非空标志) · OVR(溢出标志) uint32_t spi_status = SPI6->SR; printf("SPI6->SR: 0x%08lX\n", spi_status);
调试打印出: SPI6->SR: 0x0001E007 加上一些清除标志位的可以进入一次SPI回调函数。 void SPI6_IRQHandler(void)
{
/* USER CODE BEGIN SPI6_IRQn 0 */
printf("SPI6 Interrupt Triggered\n");
// 检查 RXNE 标志
if (__HAL_SPI_GET_FLAG(&hspi6, SPI_FLAG_RXNE))
{
printf("RXNE Flag Set\n");
HAL_SPI_RxCpltCallback(&hspi6);
}
// 清除 OVR 标志
if (__HAL_SPI_GET_FLAG(&hspi6, SPI_FLAG_OVR))
{
printf("Clearing OVR Flag\n");
__HAL_SPI_CLEAR_OVRFLAG(&hspi6);
}
// 清除 MODF 标志
if (__HAL_SPI_GET_FLAG(&hspi6, SPI_FLAG_MODF))
{
printf("Clearing MODF Flag\n");
__HAL_SPI_CLEAR_MODFFLAG(&hspi6);
}
/* USER CODE END SPI6_IRQn 0 */
HAL_SPI_IRQHandler(&hspi6);
/* USER CODE BEGIN SPI6_IRQn 1 */
uint32_t spi_status = SPI6->SR;
printf("SPI6->SR: 0x%08lX\n", spi_status);
/* USER CODE END SPI6_IRQn 1 */
}
|