银杏科技有限公司旗下技术文档发布平台 | |||
技术支持电话 | 0379-69926675-801 | ||
技术支持邮件 | Gingko@vip.163.com | ||
版本 | 日期 | 作者 | 修改内容 |
---|---|---|---|
V1.0 | 2020-07-29 | 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.配置USB_OTG_FS 8.配置USB_DEVICE 9.配置QUADAPI 引脚配置 10.时钟源设置,选择外部高速时钟源,配置为最大主频 11.工程文件的设置, 这里就是工程的各种配置 我们只用到有限几个,其他的默认即可 IDE我们使用的是 MDK V5.27 12.点击Code Generator,进行进一步配置
1.主函数
int main(void) { /* MCU配置*/ /* 重置所有外围设备,初始化Flash接口和Systick */ 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_QUADSPI_Init(); MX_USB_DEVICE_Init(); LED_ON; BSP_QSPI_Init(); /* 无限循环 */ while (1) { } }
2.QUADSPI初始化函数 本实验中QSPI我们只是用到了配置的IO,参数没有用到。
uint8_t BSP_QSPI_Init(void) { QSPIHandle.Instance = QUADSPI; /* 调用DeInit函数重置驱动程序 */ if (HAL_QSPI_DeInit(&QSPIHandle) != HAL_OK) { return QSPI_ERROR; } /* 系统级初始化 */ BSP_QSPI_MspInit(&QSPIHandle, NULL); /* QSPI初始化 */ /* 时钟预分频器设置为1,因此QSPI时钟= 240MHz /(1 + 1)= 120MHz */ QSPIHandle.Init.ClockPrescaler = 1; //时钟预分频器 QSPIHandle.Init.FifoThreshold = POSITION_VAL(W25Q64_FLASH_SIZE) - 1; //指定FIFO中的阈值字节数 QSPIHandle.Init.SampleShifting = QSPI_SAMPLE_SHIFTING_NONE; //指定样本移位 QSPIHandle.Init.FlashSize = POSITION_VAL(W25Q64_FLASH_SIZE) - 1; //闪存尺寸 QSPIHandle.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_6_CYCLE; //指定片选高电平时间 QSPIHandle.Init.ClockMode = QSPI_CLOCK_MODE_0; //指定时钟模式 QSPIHandle.Init.FlashID = QSPI_FLASH_ID_1; //指定要使用的Flash QSPIHandle.Init.DualFlash = QSPI_DUALFLASH_DISABLE; //指定双闪存模式状态 if (HAL_QSPI_Init(&QSPIHandle) != HAL_OK) { } return QSPI_OK; }
void HAL_QSPI_MspInit(QSPI_HandleTypeDef* qspiHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(qspiHandle->Instance==QUADSPI) { /* QUADSPI时钟使能*/ __HAL_RCC_QSPI_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); /**QUADSPI GPIO 配置 PB6 ------> QUADSPI_BK1_NCS PF7 ------> QUADSPI_BK1_IO2 PB2 ------> QUADSPI_CLK PD13 ------> QUADSPI_BK1_IO3 PD12 ------> QUADSPI_BK1_IO1 PD11 ------> QUADSPI_BK1_IO0 */ GPIO_InitStruct.Pin = GPIO_PIN_6; //要配置的GPIO引脚 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; //所选引脚的操作模式 GPIO_InitStruct.Pull = GPIO_NOPULL; //所选引脚的上拉或下拉激活 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;//引脚的速度 GPIO_InitStruct.Alternate = GPIO_AF10_QUADSPI;//外设要连接到选定的引脚 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);//根据GPIO_Init中的指定参数初始化GPIOx外设 GPIO_InitStruct.Pin = GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI; HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_12|GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); } }
3.STORAGE_Read_FS函数
#define BLK_NBR 0x800 //块数量 #define BLK_SIZ 0x1000 //块大小
int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) { BSP_QSPI_Read(buf, blk_addr * BLK_SIZ, blk_len * BLK_SIZ); return (USBD_OK); }
4.STORAGE_Write_FS函数
int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) { BSP_QSPI_Write(buf, blk_addr * BLK_SIZ, blk_len * BLK_SIZ); return (USBD_OK); }
5.STORAGE_GetCapacity_FS函数
int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size) //获取存储容量 { *block_num = BLK_NBR; *block_size = BLK_SIZ; return (USBD_OK); }