如图所示,用winhex看到SD卡的0扇区:
串口收的数据如下:
可以看到,串口发送的还是扇区0的数据,但是例程中读扇区的参数我已经修改,如下:
MSR
#include "led.h"
#include "usart.h"
#include "lcd.h"
#include "key.h"
#include "malloc.h"
#include "MMC_SD.h"
//读取SD卡的指定扇区的内容,并通过串口1输出
//sec:扇区物理地址编号
void SD_Read_Sectorx(u32 sec)
{
u8 *buf;
u16 i;
buf=mymalloc(512); //申请内存
if(SD_ReadDisk(buf,sec,1)==0) //读取648扇区的内容
{
LCD_ShowString(60,190,200,16,16,"Sending Data...");
printf("SECTOR 648 DATA:\r\n");
for(i=0;i<512;i++)
{
printf("%x ",buf);//打印出来的就是16进制,注意就不要再在接收时用16进制显示了
delay_ms(10);
}
printf("\r\nDATA ENDED\r\n");
LCD_ShowString(60,190,200,16,16,"USART1 Send Data Over!");
}
myfree(buf);//释放内存
}
int main(void)
{
u8 key;
u32 sd_size;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
delay_init(); //延时函数初始化
uart_init(9600); //串口初始化为9600
LED_Init(); //初始化与LED连接的硬件接口
LCD_Init(); //初始化LCD
KEY_Init(); //按键初始化
mem_init(); //初始化内存池
  OINT_COLOR=RED;//设置字体为红色
LCD_ShowString(60,50,200,16,16,"Mini STM32");
LCD_ShowString(60,70,200,16,16,"SD CARD TEST");
LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(60,110,200,16,16,"2014/3/13");
LCD_ShowString(60,130,200,16,16,"KEY0:Read Sector 0");
while(SD_Initialize())//检测不到SD卡
{
LCD_ShowString(60,150,200,16,16,"SD Card Error!");
delay_ms(500);
LCD_ShowString(60,150,200,16,16,"Please Check! ");
delay_ms(500);
LED0=!LED0;//DS0闪烁
}
  OINT_COLOR=BLUE;//设置字体为蓝色
//检测SD卡成功
LCD_ShowString(60,150,200,16,16,"SD Card OK ");
LCD_ShowString(60,170,200,16,16,"SD Card Size: MB");
sd_size=SD_GetSectorCount();//得到扇区数
LCD_ShowNum(164,170,sd_size>>11,5,16);//显示SD卡容量
while(1){
key=KEY_Scan(0);
if(key==KEY0_PRES)
{
/* **** SD读数据 */
SD_Read_Sectorx(cnt);//KEY0按,读取SD卡扇区648的内容
}
}
}
|