银杏科技有限公司旗下技术文档发布平台 | |||
技术支持电话 | 0379-69926675-801 | ||
技术支持邮件 | Gingko@vip.163.com | ||
版本 | 日期 | 作者 | 修改内容 |
---|---|---|---|
V1.0 | 2020-07-28 | gingko | 初次建立 |
1.在主界面选择File–>New Project 或者直接点击ACCEE TO MCU SELECTOR。 2.出现芯片型号选择,搜索自己芯片的型号,双击型号,或者点击Start Project进入配置,在搜索栏的下面,提供的各种查找方式,可以选择芯片内核,型号,等等,可以帮助你查找芯片。本实验选取的芯片型号。为:STM32H750IBKx。 3.配置RCC,使用外部时钟源。 4.时基源选择SysTick。 5.将PA10,PB7,PB8设置为GPIO_Output。 6.引脚模式配置。 7.设置串口。 8.在NVIC Settings一栏使能接收中断。 9.配置SPI。 10.配置SPI DMA,选择SPI_TX,SPI_RX。 11.时钟源设置,选择外部高速时钟源,配置为最大主频。 12.工程文件的设置, 这里就是工程的各种配置 我们只用到有限几个,其他的默认即可 IDE我们使用的是 MDK V5.27。 13.点击Code Generator,进行进一步配置。
int main(void) { int i; int temp; int error; unsigned char buffer[4096]; HAL_Init(); SystemClock_Config(); i2c.initialize(); axp152.initialize(); axp152.set_dcdc1(3500);//[ARM & FPGA] axp152.set_dcdc2(1200);//[FPGA INT] axp152.set_dcdc3(3300);//[DCOUT3] axp152.set_dcdc4(3300);//[DCOUT4] axp152.set_aldo1(3300);//[BK3] axp152.set_aldo2(3300);//[ALDOOUT2] axp152.set_dldo1(3300);//[BK0] axp152.set_dldo2(3300);//[BK1] HAL_Delay(200); MX_GPIO_Init(); MX_DMA_Init(); MX_USART2_UART_Init(); MX_SPI4_Init(); usart2.initialize(115200); //串口波特率设置 usart2.printf("\x0c"); //清屏 usart2.printf("\033[1;32;40m"); //设置终端字体为绿色 usart2.printf("Hello,I am iCore4TX!\r\n\r\n"); //串口信息输出 //SPI TEST error = 0; usart2.printf("\033[1;32;40m"); //显示绿色 usart2.printf(" *Write FPGA 10MByte & Read......"); //SPI写数据指令 buffer[0] = 0x04; //写指令 buffer[1] = 0x00; //地址 buffer[2] = 0x00; //地址 for(i = 0;i < 1024;i ++){ buffer[i+3] = i%256; //数据 } buffer[1027] = 0x00; //伪指令 temp = HAL_GetTick(); for(i = 0;i < 10240;i ++){ HAL_SPI_Transmit_DMA(&hspi4,buffer,1028); //通过SPI DMA发送数据 while(!spi4_tc_flag); spi4_tc_flag = 0; } temp = HAL_GetTick() - temp; //计算数据传输时间 memset(buffer,0,sizeof(buffer)); //清空缓存区 //SPI读数据指令 buffer[0] = 0x07; //读指令 buffer[1] = 0x00; //地址 buffer[2] = 0x00; //地址 buffer[3] = 0x00; //伪指令,开始数据传输 HAL_SPI_TransmitReceive_DMA(&hspi4,buffer,buffer,1028); //通过SPI DMA接收数据 while(!spi4_tc_flag); spi4_tc_flag = 0; for(i = 0;i < 1023;i ++){ if(buffer[i+4] != i%256){ error ++; break; } } if(error == 0){ usart2.printf("\t\t\033[1;32;40m[OK]\r\n"); usart2.printf("*Write time:%dms\r\n*Data size :10MByte\r\n",temp); //打印传输1MB数据的时间 usart2.printf("*SPI Speed :%.2fMBytes/s\r\n",10000./temp); //打印SPI传输速度 }else{ usart2.printf("\t\t\033[1;31;40m[Fail]\r\n"); } while (1) { } }
使能SPIx和IO口时钟,初始化IO口为复用功能并配置SPI_DMA,SPI_RX,SPI_TX。
void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(spiHandle->Instance==SPI4) { __HAL_RCC_SPI4_CLK_ENABLE(); //使能SPI时钟 __HAL_RCC_GPIOE_CLK_ENABLE(); //使能GPIO时钟 /**SPI4 GPIO Configuration PE2 ------> SPI4_SCK PE4 ------> SPI4_NSS PE5 ------> SPI4_MISO PE6 ------> SPI4_MOSI */ GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF5_SPI4; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); /* SPI4 DMA Init */ /* SPI4_TX Init */ hdma_spi4_tx.Instance = DMA1_Stream0; //stream0可以被配置成channel 0、1、2、3、4、6任意一个。 hdma_spi4_tx.Init.Request = DMA_REQUEST_SPI4_TX; //SPI4使用DMA接收 hdma_spi4_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; //存储器到外设 hdma_spi4_tx.Init.PeriphInc = DMA_PINC_DISABLE; //外设非增量模式 hdma_spi4_tx.Init.MemInc = DMA_MINC_ENABLE; //外设增量模式 hdma_spi4_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;//外设数据长度:8位 hdma_spi4_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; hdma_spi4_tx.Init.Mode = DMA_NORMAL; //正常模式 hdma_spi4_tx.Init.Priority = DMA_PRIORITY_LOW; //设置 DMA 的优先级别 hdma_spi4_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; if (HAL_DMA_Init(&hdma_spi4_tx) != HAL_OK) { Error_Handler(); } __HAL_LINKDMA(spiHandle,hdmatx,hdma_spi4_tx); /* SPI4_RX Init */ hdma_spi4_rx.Instance = DMA1_Stream1; hdma_spi4_rx.Instance = DMA1_Stream1; hdma_spi4_rx.Init.Request = DMA_REQUEST_SPI4_RX; //SPI4使用DMA发送 hdma_spi4_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; //外设到存储器 hdma_spi4_rx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_spi4_rx.Init.MemInc = DMA_MINC_ENABLE; hdma_spi4_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; hdma_spi4_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; if (HAL_DMA_Init(&hdma_spi4_rx) != HAL_OK) { Error_Handler(); } __HAL_LINKDMA(spiHandle,hdmarx,hdma_spi4_rx); /* SPI4 interrupt Init */ HAL_NVIC_SetPriority(SPI4_IRQn, 0, 0); HAL_NVIC_EnableIRQ(SPI4_IRQn); } }
初始化SPIx,设置SPIx工作模式
void MX_SPI4_Init(void) { hspi4.Instance = SPI4; hspi4.Init.Mode = SPI_MODE_MASTER; //设置 SPI4 为主模式 hspi4.Init.Direction = SPI_DIRECTION_2LINES; //设置双线单向模式 hspi4.Init.DataSize = SPI_DATASIZE_8BIT; //设置 8位数据位 hspi4.Init.CLKPolarity = SPI_POLARITY_HIGH; //时钟极性为高 hspi4.Init.CLKPhase = SPI_PHASE_2EDGE; //时钟相位为2 hspi4.Init.NSS = SPI_NSS_HARD_OUTPUT; //NSS 硬件控制 hspi4.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; hspi4.Init.FirstBit = SPI_FIRSTBIT_MSB; //起始位为MSB hspi4.Init.TIMode = SPI_TIMODE_DISABLE; //帧格式关闭 hspi4.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;//硬件CRC关闭 hspi4.Init.CRCPolynomial = 0x0; hspi4.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; //NSS脉冲关闭 hspi4.Init.NSSPolarity = SPI_NSS_POLARITY_LOW; //NSS极性为低 hspi4.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA; hspi4.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN; hspi4.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN; hspi4.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE; hspi4.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE; hspi4.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE; hspi4.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE; hspi4.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE; hspi4.Init.IOSwap = SPI_IO_SWAP_DISABLE; if (HAL_SPI_Init(&hspi4) != HAL_OK) { Error_Handler(); } }
assert_param(IS_SPI_ALL_INSTANCE(hspi->Instance)); assert_param(IS_SPI_MODE(hspi->Init.Mode)); assert_param(IS_SPI_DIRECTION(hspi->Init.Direction)); assert_param(IS_SPI_DATASIZE(hspi->Init.DataSize)); assert_param(IS_SPI_FIFOTHRESHOLD(hspi->Init.FifoThreshold)); assert_param(IS_SPI_NSS(hspi->Init.NSS)); assert_param(IS_SPI_NSSP(hspi->Init.NSSPMode)); assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler)); assert_param(IS_SPI_FIRST_BIT(hspi->Init.FirstBit)); assert_param(IS_SPI_TIMODE(hspi->Init.TIMode));