二维码
微世推网

扫一扫关注

当前位置: 首页 » 企业商讯 » 汽车行业 » 正文

学习STM32编程_参数持久化存储应用程序设计

放大字体  缩小字体 发布日期:2022-11-27 01:00:08    作者:高台远    浏览次数:150
导读

关键代码:diskio.cDSTATUS disk_status (BYTE pdrv){DSTATUS stat = STA_NOINIT;switch (pdrv) {case DEV_SDIO_SD :stat &= ~STA_NOINIT;return stat;case DEV_SPI_FLASH :return stat;}return STA_NOINIT;}DSTATUS disk_initialize (BYTE pdrv){DSTATUS stat = STA_NOINIT;switc

关键代码:

diskio.c

DSTATUS disk_status (BYTE pdrv ){ DSTATUS stat = STA_NOINIT; switch (pdrv) { case DEV_SDIO_SD : stat &= ~STA_NOINIT; return stat; case DEV_SPI_FLASH : return stat; } return STA_NOINIT;}DSTATUS disk_initialize (BYTE pdrv ){ DSTATUS stat = STA_NOINIT; switch (pdrv) { case DEV_SDIO_SD : if( SD_Init() == SD_OK ) { stat &= ~STA_NOINIT; return stat; } case DEV_SPI_FLASH : return stat; } return STA_NOINIT;}DRESULT disk_read (BYTE pdrv, BYTE *buff, DWORD sector, UINT count ){ DRESULT res = RES_PARERR; SD_Error SD_status; switch (pdrv) { case DEV_SDIO_SD : SD_status = SD_ReadMultiBlocks(buff, sector*SDCardInfo.CardBlockSize, SDCardInfo.CardBlockSize, count); if(SD_status != SD_OK) return res = RES_ERROR; SD_status = SD_WaitReadOperation(); if(SD_status != SD_OK) return res = RES_ERROR; while(SD_GetStatus() != SD_TRANSFER_OK); res = RES_OK; return res; case DEV_SPI_FLASH : res = RES_OK; return res; } return RES_PARERR;}#if FF_FS_READonLY == 0DRESULT disk_write (BYTE pdrv, const BYTE *buff, DWORD sector, UINT count ){ DRESULT res = RES_PARERR; SD_Error SD_status; if (!count) { return RES_PARERR; } switch (pdrv) { case DEV_SDIO_SD : SD_status = SD_WriteMultiBlocks((uint8_t *)buff, sector * \ SDCardInfo.CardBlockSize,SDCardInfo.CardBlockSize, count); if(SD_status != SD_OK) return res = RES_ERROR; SD_status = SD_WaitWriteOperation(); if(SD_status != SD_OK) return res = RES_ERROR; while(SD_GetStatus() != SD_TRANSFER_OK) ; res = RES_OK; return res; case DEV_SPI_FLASH : res = RES_OK; return res; } return RES_PARERR;}#endifDRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void *buff ){ DRESULT res = RES_PARERR; switch (pdrv) { case DEV_SDIO_SD : switch (cmd) { case CTRL_SYNC: res = RES_OK; break; case GET_SECTOR_COUNT: *(DWORD *)buff = SDCardInfo.CardCapacity/SDCardInfo.CardBlockSize; res = RES_OK; break; case GET_SECTOR_SIZE : *(WORD * )buff = SDCardInfo.CardBlockSize; res = RES_OK; break; case GET_BLOCK_SIZE : *(DWORD * )buff = 1; res = RES_OK; break; default: res = RES_PARERR; break; } break; case DEV_SPI_FLASH : break; } return res;}__weak uint32_t get_fattime(void){ uint16_t year; uint8_t month,day,hour,minute,second; RTC_TimeTypeDef RTC_TimeStructure; RTC_DateTypeDef RTC_DateStructure; RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure); RTC_GetDate(RTC_Format_BIN, &RTC_DateStructure); year = RTC_DateStructure.RTC_Year + 2000; month = RTC_DateStructure.RTC_Month; day = RTC_DateStructure.RTC_Date; hour = RTC_TimeStructure.RTC_Hours; minute = RTC_TimeStructure.RTC_Minutes; second = RTC_TimeStructure.RTC_Seconds; return ((uint32_t)(year - 1980) << 25) | ((uint32_t)month << 21) | ((uint32_t)day << 16) | ((uint32_t)hour << 11) | ((uint32_t)minute << 5) | ((uint32_t)second >> 1); }

bsp_rtc.c

void RTC_CLK_Config(uint8_t RTC_Clock_Type){ RTC_InitTypeDef RTC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); PWR_BackupAccessCmd(ENABLE); if(RTC_Clock_Type == 0) { RCC_LSICmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET); RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); } else if(RTC_Clock_Type == 1) { RCC_LSEConfig(RCC_LSE_ON); while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET); RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); } RCC_RTCCLKCmd(ENABLE); // 使能 RTC 时钟 RTC_WaitForSynchro(); // 等待 RTC 得 APB 寄存器同步 RTC_InitStructure.RTC_AsynchPrediv = ASYNCH_PREDIV; RTC_InitStructure.RTC_SynchPrediv = SYNCH_PREDIV; RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24; if(RTC_Init(&RTC_InitStructure) == ERROR) { printf("\n\r RTC 时钟初始化失败 \r\n"); } else { printf("\n\r RTC 时钟初始化成功 \r\n"); }}void RTC_Set_DateTime(void){ RTC_TimeTypeDef RTC_TimeStructure; RTC_DateTypeDef RTC_DateStructure; RTC_DateStructure.RTC_WeekDay = WEEKDAY; RTC_DateStructure.RTC_Date = DATE; RTC_DateStructure.RTC_Month = MONTH; RTC_DateStructure.RTC_Year = YEAR; RTC_SetDate(RTC_Format_BINorBCD, &RTC_DateStructure); RTC_TimeStructure.RTC_H12 = RTC_H12_AMorPM; RTC_TimeStructure.RTC_Hours = HOURS; RTC_TimeStructure.RTC_Minutes = MINUTES; RTC_TimeStructure.RTC_Seconds = SECONDS; RTC_SetTime(RTC_Format_BINorBCD, &RTC_TimeStructure); RTC_WriteBackupRegister(RTC_BKP_DR0, 0x5F5F);}static void RTC_Get_DateTime(void){ RTC_GetTime(RTC_Format_BIN, &myRTC_TimeStructure); RTC_GetDate(RTC_Format_BIN, &myRTC_DateStructure);}uint8_t RTC_Get_Year(void){ RTC_Get_DateTime(); return myRTC_DateStructure.RTC_Year;}uint8_t RTC_Get_Month(void){ RTC_Get_DateTime(); return myRTC_DateStructure.RTC_Month;}uint8_t RTC_Get_Date(void){ RTC_Get_DateTime(); return myRTC_DateStructure.RTC_Date;}uint8_t RTC_Get_WeekDay(void){ RTC_Get_DateTime(); return myRTC_DateStructure.RTC_WeekDay;}uint8_t RTC_Get_Hour(void){ RTC_Get_DateTime(); return myRTC_TimeStructure.RTC_Hours;}uint8_t RTC_Get_Minute(void){ RTC_Get_DateTime(); return myRTC_TimeStructure.RTC_Minutes;}uint8_t RTC_Get_Second(void){ RTC_Get_DateTime(); return myRTC_TimeStructure.RTC_Seconds;}

main.c

bool Check_Certain_Hour(void){ uint8_t hour,minute,second; RTC_TimeTypeDef RTC_TimeStructure; RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure); hour = RTC_TimeStructure.RTC_Hours; minute = RTC_TimeStructure.RTC_Minutes; second = RTC_TimeStructure.RTC_Seconds; if(minute == 0 && second == 0) { if(hour != currentHour) { currentHour = hour; return true; } } return false;}void Save_Data(void){ uint16_t year; uint8_t month,day,hour,minute,second; res = f_mount(&sysFs,"3:",1); if(res == FR_NO_FILESYSTEM) { printf(">>> No file system, formatting...\r\n"); res = f_mkfs("3:", FM_FAT32, Buff, sizeof(Buff)); if(res == FR_OK) { printf(">>> SD memory card is successfully formatted.\r\n"); res = f_mount(NULL,"3:",1); // 格式化后,先取消挂载 res = f_mount(&sysFs,"3:",1); // 重新挂载 } else { printf(">>> Format failed. (%d)\r\n",res); while(1); } } else if(res != FR_OK) { printf(">>> Mount FS failed. (%d)\r\n",res); // 给出错误提示和错误类型 while(1); } else if(res == FR_OK) { printf(">>> Mount FS success, you can operate read write test.\r\n"); } bh1750Light = BH1750_Measure(); // 读取 BH1750 得光照强度值 DHT11_Read_Data(&temperature,&humidity); // 读取 DHT11 得温湿度值 year = RTC_Get_Year() + 2000; // “年份”值需要加 2000 month = RTC_Get_Month(); day = RTC_Get_Date(); hour = RTC_Get_Hour(); minute = RTC_Get_Minute(); sprintf(strFinal,"%d;%0.2d-%0.2d;%0.2d:00;%d;%d;%d\r\n",year,month,day,\ hour,temperature,humidity,bh1750Light); res = f_open(&fil, "sd:/Data.txt", FA_OPEN_ALWAYS | FA_WRITE ); f_lseek(&fil, f_size(&fil)); if (res == FR_OK) { printf(">>> Open/Create file(.txt) success, writting...\r\n"); res=f_write(&fil,strFinal,strlen(strFinal),&fnum); if(res==FR_OK) { printf(">>> 文件写入成功,共写入字节数据: %d\r\n",fnum); printf(">>> 此次写入得数据是 :\r\n%s\r\n",strFinal); } else { printf(">>> 文件写入失败 :(%d)\n",res); } f_close(&fil); } else { printf(">>> Open/Create file(.txt) failed.\r\n"); }}int main(void){ delay_init(168); // 延时函数初始化 LED_Init(); //LED 端口初始化 Key_Init(); // 按键初始化 EXTIx_Init(); // 外部中断初始化 USART1_Init(115200); //USART1 初始化 IIC_Init(); //IIC 总线初始化 BH1750_Init(); //BH1750 初始化 RTC_CLK_Config(1); //RTC 配置,时钟源选择 LSE SDIO_NVIC_Configuration(); //SDIO 中断和 DMA 中断 NVIC 初始化 while(DHT11_Init()) //DHT11 初始化 { printf("DHT11 Init Error!\r\n"); delay_ms(500); } printf("DHT11 Init Success!\r\n"); if (RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x5F5F) { RTC_Set_DateTime(); // 重新设置时间和日期 } else { printf("\r\n 不需要重新配置 RTC....\r\n"); RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); PWR_BackupAccessCmd(ENABLE); RTC_WaitForSynchro(); } currentHour = RTC_Get_Hour(); // 首次获取当前小时值 printf("System Started!\r\n"); while(1) { if(keyValue == KEY_L_PRESS) { SD_Test(); keyValue = 0; } if(Check_Certain_Hour()) { printf(" 过了一个小时 \r\n"); Save_Data();// 存储时间戳和环境参数至 SD 存储卡 } }}

 
(文/高台远)
打赏
免责声明
• 
本文为高台远原创作品•作者: 高台远。欢迎转载,转载请注明原文出处:http://www.udxd.com/qysx/show-131533.html 。本文仅代表作者个人观点,本站未对其内容进行核实,请读者仅做参考,如若文中涉及有违公德、触犯法律的内容,一经发现,立即删除,作者需自行承担相应责任。涉及到版权或其他问题,请及时联系我们邮件:weilaitui@qq.com。
 

Copyright©2015-2023 粤公网安备 44030702000869号

粤ICP备16078936号

微信

关注
微信

微信二维码

WAP二维码

客服

联系
客服

联系客服:

24在线QQ: 770665880

客服电话: 020-82301567

E_mail邮箱: weilaitui@qq.com

微信公众号: weishitui

韩瑞 小英 张泽

工作时间:

周一至周五: 08:00 - 24:00

反馈

用户
反馈