STM32CubeMX + HAL库学习「附工程源码」( 二 )


STM32CubeMX + HAL库学习「附工程源码」文章插图
STM32CubeMX + HAL库学习「附工程源码」文章插图
RTC_DateTypeDef sDate; RTC_TimeTypeDef sTime;uint8_t second_tmp = 0;HAL_RTC_GetTime( // 读取时间 HAL_RTC_GetDate( // 读取日期 if(second_tmp != sTime.Seconds) { // 读取秒second_tmp = sTime.Seconds;printf("20%d%d-%d%d-%d%d\r\n",sDate.Year/10%10, sDate.Year%10,sDate.Month/10%10, sDate.Month%10,sDate.Date/10%10, sDate.Date%10);printf("%d%d:%d%d:%d%d\r\n",sTime.Hours/10%10, sTime.Hours%10,sTime.Minutes/10%10, sTime.Minutes%10,sTime.Seconds/10%10, sTime.Seconds%10); }SDIO + FATFS

  1. 选择SDIO功能 , Pinout --tt-darkmode-color: #809CB9;"> , Connectivity -> SDIO -> Mode: SD 4bit Wide bus -> 勾选NVIC

STM32CubeMX + HAL库学习「附工程源码」文章插图
  1. 配置SDIO时钟 , Clock Configuration , SDIO模块输入要求为48MHz , 系统提示可以自动设置时钟问题 , 选择Yes 。 SDIO时钟分频系数CLKDIV , 计算公式为SDIO_CK=48MHz/(CLKDIV+2)也可手动修改时钟配置 。

STM32CubeMX + HAL库学习「附工程源码」文章插图
  1. 启用文件系统中间件 , Pinout --tt-darkmode-color: #809CB9;"> , Middleware -> FATFS , 模式选择SD卡 , 配置文件系统:如果要支持中文文件名 , 则配置CODE_PAGE为Simplified Chinese如果要支持长文件名 , 则要使能USE_LEN

STM32CubeMX + HAL库学习「附工程源码」文章插图
  1. 继续上面界面 , Advanced Settings勾选Use dma template

STM32CubeMX + HAL库学习「附工程源码」文章插图
  1. 设置DMA传输 , Pinout --tt-darkmode-color: #809CB9;"> , Connectivity -> SDIO-> DMA Settings

STM32CubeMX + HAL库学习「附工程源码」文章插图
  1. 配置NVIC , Pinout --tt-darkmode-color: #809CB9;"> , System Core -> NVIC 。
注意 , SDIO中断优先级必须高于DMA2 stream3和DMA2 stream6的中断优先级
STM32CubeMX + HAL库学习「附工程源码」文章插图
  1. 堆栈设置 , Progect Manager -> Project -> Linker Settings , 加大堆栈大小(注意:由于刚才设置长文件名动态缓存存储在堆中 , 故需要增大堆大小 , 如果不修改则程序运行时堆会生成溢出 , 程序进入硬件错误中断(HardFault) , 死循环) 。

STM32CubeMX + HAL库学习「附工程源码」文章插图
  1. 生成工程 , GENERATE CODE, 用KEIL打开

STM32CubeMX + HAL库学习「附工程源码」文章插图
UINT bw; retSD = f_mount( if(retSD != FR_OK) {printf("Mount Error :%d\r\n", retSD); } retSD = f_open( if(retSD != FR_OK){printf("Open Error :%d\r\n", retSD); } retSD = f_write( if(retSD != FR_OK){printf("Write Error :%d\r\n", retSD); } f_close( retSD = f_open( char buff[10] = {0}; retSD = f_read( if(retSD == FR_OK){printf("%s\r\n", buff); } f_close(