STM32F103芯片属于中低端的32位ARM微控制器,ARM 32位的Cortex-M3的核,高达72MHz工作频率,小容量型号的FLASH大小是16K和32K、中容量型号的FLASH大小是64K和128K、大容量型号的FLASH大小是256K、384K和512K。
该芯片用的比较多,主要是低功耗,性能出色,集成的外设也多,满足大部分的电子产品应用功能开发。本次主要是用STM32F103自带的AD或者外扩高精度的ADC芯片采集数据,并将数据实时保存在SD卡上。
STM32F103芯片属于中低端的32位ARM微控制器,ARM 32位的Cortex-M3的核,高达72MHz工作频率,小容量型号的FLASH大小是16K和32K、中容量型号的FLASH大小是64K和128K、大容量型号的FLASH大小是256K、384K和512K。
该芯片用的比较多,主要是低功耗,性能出色,集成的外设也多,满足大部分的电子产品应用功能开发。本次主要是用STM32F103自带的AD或者外扩高精度的ADC芯片采集数据,并将数据实时保存在SD卡上。
SD卡有两种模式:SD模式(也称为SDIO模式)和SPI模式,这两种模式的引脚定义是不同的。
SD模式下,通常可以使用四根数据线进行传输(4-bits Data),传输速度非常快。四位数据传输要使用引脚1、7、8和9(DAT0~DAT3);在某些不支持四线数据的场合,也可以使用单根线进行数据传输(1-bit Data),此时使用引脚7(DAT0)。
SPI通信需要四根线:两条数据线(SPI_MISO、SPI_MOSI),一条时钟线(SPI_SCK)和一条片选(Chip Select)信号线。在SPI模式下,SD卡的8号、9号针脚没有用到。
普通SD卡和微型SD卡(Micro SD card,TF card),打卡正反面:
小卡TF卡的正反面
SD卡三种模式的针脚定义
存储容量不足的时候,程序会判别,进行早期数据的擦除处理的、
SD_Error SD_Erase(uint32_t startaddr, uint32_t endaddr) { SD_Error errorstatus = SD_OK; uint32_t delay = 0; __IO uint32_t maxdelay = 0; uint8_t cardstate = 0; /*!< Check if the card coomnd class supports erase command */ if (((CSD_Tab[1] >> 20) & SD_CCCC_ERASE) == 0) { errorstatus = SD_REQUEST_NOT_APPLICABLE; return(errorstatus); } maxdelay = 120000 / ((SDIO->CLKCR & 0xFF) + 2); if (SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED) //卡已上锁 { errorstatus = SD_LOCK_UNLOCK_FAILED; return(errorstatus); } if (CardType == SDIO_HIGH_CAPACITY_SD_CARD) { //在 sdhc 卡中,地址参数为块地址,每块 512 字节,而 sdsc 卡地址为字节地址 //所以若是 sdhc 卡要对地址/512 进行转换 startaddr /= 512; endaddr /= 512; } /*!< According to sd-card spec 1.0 ERASE_GROUP_START (CMD32) and erase_group_end(CMD33) */ if ((SDIO_STD_CAPACITY_SD_CARD_V1_1 == CardType) || (SDIO_STD_CAPACITY_SD_CARD_V2_0 == CardType) || (SDIO_HIGH_CAPACITY_SD_CARD == CardType)) { /*!< Send CMD32 SD_ERASE_GRP_START with argument as addr */ SDIO_CmdInitStructure.SDIO_Argument = startaddr; SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_ERASE_GRP_START; SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; //R1 SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; SDIO_SendCommand(&SDIO_CmdInitStructure); errorstatus = CmdResp1Error(SD_CMD_SD_ERASE_GRP_START); if (errorstatus != SD_OK) { return(errorstatus); } /*!< Send CMD33 SD_ERASE_GRP_END with argument as addr */ SDIO_CmdInitStructure.SDIO_Argument = endaddr; SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_ERASE_GRP_END; SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; SDIO_SendCommand(&SDIO_CmdInitStructure); errorstatus = CmdResp1Error(SD_CMD_SD_ERASE_GRP_END); if (errorstatus != SD_OK) { return(errorstatus); } } /*!< Send CMD38 ERASE */ SDIO_CmdInitStructure.SDIO_Argument = 0; SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_ERASE; SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; SDIO_SendCommand(&SDIO_CmdInitStructure); errorstatus = CmdResp1Error(SD_CMD_ERASE); if (errorstatus != SD_OK) { return(errorstatus); } for (delay = 0; delay < maxdelay; delay++) {} /*!< Wait till the card is in programming state */ errorstatus = IsCardProgramming(&cardstate); while ((errorstatus == SD_OK) && ((SD_CARD_PROGRAMMING == cardstate) || (SD_CARD_RECEIVING == cardstate))) { errorstatus = IsCardProgramming(&cardstate); } return(errorstatus); }