| 
 
| STM32H743 SPI2采用DMA方式进行数据收发,在不加BOOTLOAD功能时SPI数据收发正常,当加入BOOTLOAD 功能后程序能够从BOOT程序跳转到APP程序指示灯等功能正常,但SPI2在DMA方式时无法接到数据,改为非DMA方式时数据接收正常,由于收发数据量比较大所以无法将SPI的DMA方式改为非DMA方式,地址偏移量设置:#define VECT_TAB_OFFSET  0x100000UL//0x00020000UL BOOT跳转程序代码如下
 static void JumpToApp(void)
 {
 uint32_t i=0;
 void (*AppJump)(void);         /* 声明一个函数指针 */
 
 /* 关闭全局中断 */
 DISABLE_INT();
 
 /* 设置所有时钟到默认状态,使用HSI时钟 */
 HAL_RCC_DeInit();
 SPI2->CR1&=~(1<<0);                        //SPE=1,停止SPI2
 RCC->APB1LENR&=~(1<<14);        //关闭SPI2时
 RCC->APB1LRSTR&=~(1<<14);        //停止复位SPI2
 
 RCC->AHB1ENR&=~(1<<0);                //禁止DMA1时钟使能
 DMA1_Stream1->CR&=~(1<<0);         //关闭DMA传输
 DMA1_Stream0->CR&=~(1<<0);         //关闭DMA传输
 
 /* 关闭滴答定时器,复位到默认值 */
 SysTick->CTRL = 0;
 SysTick->LOAD = 0;
 SysTick->VAL = 0;
 
 /* 关闭所有中断,清除所有中断挂起标志 */
 for (i = 0; i < 8; i++)
 {
 NVIC->ICER[i]=0xFFFFFFFF;
 NVIC->ICPR[i]=0xFFFFFFFF;
 }
 
 /* 使能全局中断 */
 ENABLE_INT();
 
 /* 跳转到应用程序,首地址是MSP,地址+4是复位中断服务程序地址 */
 AppJump = (void (*)(void)) (*((uint32_t *) (AppAddr + 4)));
 
 /* 设置主堆栈指针 */
 __set_MSP(*(uint32_t *)AppAddr);
 
 /* 在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针 */
 __set_CONTROL(0);
 
 /* 跳转到系统BootLoader */
 AppJump();
 
 /* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
 while (1)
 {
 
 }
 }
 SPI2 DMA读写函数
 void SPI2_DMA_WRITE(uint8_t* Addref, uint8_t* pTxBuf, uint16_t tx_len)
 {
 uint16_t i;
 
 if (tx_len > W5500_SPI_BUFFER_SIZE)
 {
 return;
 }
 
 memset(SPI2_DMA_TxBuff, 0, tx_len + 3);
 
 SPI2_DMA_TxBuff[0] = Addref[0];
 SPI2_DMA_TxBuff[1] = Addref[1];
 SPI2_DMA_TxBuff[2] = Addref[2];
 
 for(i=0; i<tx_len; i++)
 SPI2_DMA_TxBuff[3 + i] = pTxBuf[i];
 
 wTransferState = TRANSFER_WAIT;
 W5500_1_CS0();
 //        SPI2_TransmitReceive_DMA((uint8_t*)SPI2_DMA_TxBuff, (uint8_t *)SPI2_DMA_RxBuff, tx_len+3);
 if(HAL_SPI_TransmitReceive_DMA(&hspi2, (uint8_t*)SPI2_DMA_TxBuff, (uint8_t *)SPI2_DMA_RxBuff, tx_len+3) != HAL_OK)
 {
 Error_Handler(__FILE__, __LINE__);
 }
 while (wTransferState == TRANSFER_WAIT){;}
 W5500_1_CS1();
 }
 
 void SPI2_DMA_READ(uint8_t* Addref, uint8_t* pRxBuf, uint16_t rx_len)
 {
 if (rx_len > W5500_SPI_BUFFER_SIZE)
 {
 return;
 }
 
 memset(SPI2_DMA_TxBuff, 0, rx_len + 3);
 memset(SPI2_DMA_RxBuff, 0, rx_len + 3);
 
 SPI2_DMA_TxBuff[0] = Addref[0];
 SPI2_DMA_TxBuff[1] = Addref[1];
 SPI2_DMA_TxBuff[2] = Addref[2];
 wTransferState = TRANSFER_WAIT;
 
 W5500_1_CS0();
 //        SPI2_TransmitReceive_DMA((uint8_t*)SPI2_DMA_TxBuff, (uint8_t *)SPI2_DMA_RxBuff, rx_len+3);
 if(HAL_SPI_TransmitReceive_DMA(&hspi2, (uint8_t*)SPI2_DMA_TxBuff, (uint8_t *)SPI2_DMA_RxBuff, rx_len+3) != HAL_OK)
 {
 Error_Handler(__FILE__, __LINE__);
 }
 while (wTransferState == TRANSFER_WAIT){;}
 W5500_1_CS1();
 memcpy(pRxBuf, SPI2_DMA_RxBuff + 3, rx_len);
 }
 
 | 
 |