📄 main.c
字号:
/******************************************************************************
* 文件名 : main.c
* 功能描述 : 主程序
*******************************************************************************/
/* 头文件 ------------------------------------------------------------------*/
#include "stm32f10x_lib.h"
#include "sdcard.h"
#include <stdio.h>
#include "main.h"
/* 结构体变量定义 -----------------------------------------------------------*/
typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;
/* 宏变量定义 ------------------------------------------------------------*/
#define BlockSize 512 /* 块尺寸512byte */
#define BufferWordsSize (BlockSize >> 2)
#define NumberOfBlocks 2 /* 多块读/写操作*/
#define MultiBufferWordsSize ((BlockSize * NumberOfBlocks) >> 2)
/* 变量定义 ---------------------------------------------------------*/
static vu32 TimingDelay = 0;
SD_CardInfo SDCardInfo;
u32 Buffer_Block_Tx[BufferWordsSize], Buffer_Block_Rx[BufferWordsSize];
u32 Buffer_MultiBlock_Tx[MultiBufferWordsSize], Buffer_MultiBlock_Rx[MultiBufferWordsSize];
volatile TestStatus EraseStatus = FAILED, TransferStatus1 = FAILED, TransferStatus2 = FAILED;
SD_Error Status = SD_OK;
ErrorStatus HSEStartUpStatus;
/* 功能函数 -----------------------------------------------*/
void RCC_Configuration(void);
void NVIC_Configuration(void);
void Fill_Buffer(u32 *pBuffer, u16 BufferLenght, u32 Offset);
TestStatus Buffercmp(u32* pBuffer1, u32* pBuffer2, u16 BufferLength);
TestStatus eBuffercmp(u32* pBuffer, u16 BufferLength);
extern void usart1(void);
int main(void)
{
#ifdef DEBUG
debug();
#endif
/* 系统时钟配置 */
RCC_Configuration();
/* 向量表配置 */
NVIC_Configuration();
/* systick配置 */
SysTick_Config();
/* LCD初始化 */
STM3210E_LCD_Init();
/* 清屏 */
LCD_Clear(White);
LCD_SetBackColor(Blue);
/* 设置显示字串信息 */
LCD_SetTextColor(White);
LCD_DisplayStringLine(Line0, " EM_STM32E Demo ");
LCD_DisplayStringLine(Line1, " STDIO_Test ");
LCD_DisplayStringLine(Line2, " welcome to Embest ");
LCD_DisplayStringLine(Line3, " www.embedinfo.com ");
LCD_SetBackColor(White); // 设底色 */
LCD_SetTextColor(Blue); // 设字体色 */
usart1();
/*-------------------------- SD初始化 ----------------------------- */
Status = SD_Init();
if (Status == SD_OK)
{
/*----------------- 读CSD/CID 寄存器 ------------------*/
printf("\n\rCard Detection OK!\n\r");
LCD_DisplayStringLine(Line4, "Card Detection OK! ");
Status = SD_GetCardInfo(&SDCardInfo);
}
if (Status == SD_OK)
{
/*----------------- 选卡 --------------------------------*/
printf("\n\rCard information OK!\n\r");
Status = SD_SelectDeselect((u32) (SDCardInfo.RCA << 16));
}
if (Status == SD_OK)
{
/*----------------- 设位模式=4b ------------------------------*/
printf("\n\rCard Selection OK!\n\r");
Status = SD_EnableWideBusOperation(SDIO_BusWide_4b);
}
/*------------------- 块删除 -----------------------------*/
if (Status == SD_OK)
{
/* Erase NumberOfBlocks Blocks of WRITE_BL_LEN(512 Bytes) */
printf("\n\rCard BusWidth OK!\n\r");
Status = SD_Erase(0x00, (BlockSize * NumberOfBlocks));
}
/* 设 DMA模式 */
if (Status == SD_OK)
{
/*------------------- 设SD 模式------------------------------*/
printf("\n\rCard Erase OK!\n\r");
LCD_DisplayStringLine(Line5, "Card Erase OK!");
Status = SD_SetDeviceMode(SD_DMA_MODE);
}
if (Status == SD_OK)
{
/*------------------- Card Read -------------------------------*/
printf("\n\rCard Mode(DMA) OK!\n\r");
Status = SD_ReadMultiBlocks(0x00, Buffer_MultiBlock_Rx, BlockSize, NumberOfBlocks);
}
if (Status == SD_OK)
{
printf("\n\rCard Read OK!\n\r");
LCD_DisplayStringLine(Line6, "Card Read OK!");
EraseStatus = eBuffercmp(Buffer_MultiBlock_Rx, MultiBufferWordsSize);
}
/*------------------- 块读/写 --------------------------*/
/* Fill the buffer to send */
Fill_Buffer(Buffer_Block_Tx, BufferWordsSize, 0xFFFF);
if (Status == SD_OK)
{
/* Write block of 512 bytes on address 0 */
Status = SD_WriteBlock(0x00, Buffer_Block_Tx, BlockSize);
}
if (Status == SD_OK)
{
/* Read block of 512 bytes from address 0 */
Status = SD_ReadBlock(0x00, Buffer_Block_Rx, BlockSize);
}
if (Status == SD_OK)
{
/* Check the corectness of written dada */
TransferStatus1 = Buffercmp(Buffer_Block_Tx, Buffer_Block_Rx, BufferWordsSize);
}
if(TransferStatus1 == PASSED)
{
printf("\n\rCard Write(single block) OK!\n\r");
LCD_DisplayStringLine(Line7, "Card Write(single)!");
}
/*--------------- 从块读/写---------------------*/
/* Fill the buffer to send */
Fill_Buffer(Buffer_MultiBlock_Tx, MultiBufferWordsSize, 0x0);
if (Status == SD_OK)
{
/* Write multiple block of many bytes on address 0 */
Status = SD_WriteMultiBlocks(0x00, Buffer_MultiBlock_Tx, BlockSize, NumberOfBlocks);
}
if (Status == SD_OK)
{
/* Read block of many bytes from address 0 */
Status = SD_ReadMultiBlocks(0x00, Buffer_MultiBlock_Rx, BlockSize, NumberOfBlocks);
}
if (Status == SD_OK)
{
/* Check the corectness of written dada */
TransferStatus2 = Buffercmp(Buffer_MultiBlock_Tx, Buffer_MultiBlock_Rx, MultiBufferWordsSize);
}
if(TransferStatus2 == PASSED)
{
printf("\n\rCard Write(multi block) OK!\n\r");
LCD_DisplayStringLine(Line8, "Card Write(multi)!");
}
/* Infinite loop */
while (1)
{}
}
/*******************************************************************************
* 函数名 : RCC_Configuration
* 描述 : 系统时钟配置
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void RCC_Configuration(void)
{
/* RCC system reset(for debug purpose) */
RCC_DeInit();
/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON);
/* Wait till HSE is ready */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
/* Enable Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* Flash 2 wait state */
FLASH_SetLatency(FLASH_Latency_2);
/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2);
/* PLLCLK = 8MHz * 9 = 72 MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
/* Enable PLL */
RCC_PLLCmd(ENABLE);
/* Wait till PLL is ready */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
/* Select PLL as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* Wait till PLL is used as system clock source */
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}
}
/*******************************************************************************
* 函数名 : NVIC_Config
* 描述 : 配置 SDIO IRQ 通道.
* 输入 : 无
* 输出 : 无
* 返回 : 地
*******************************************************************************/
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* 配置NVIC抢占优先级位 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*******************************************************************************
* 函数名 : Buffercmp
* 描述 : 比较两个缓存
* 输入 : - pBuffer1, pBuffer2: buffers to be compared.
* : - BufferLength: buffer's length
* 输出 : 无
* 返回 : PASSED: pBuffer1 identical to pBuffer2
* FAILED: pBuffer1 differs from pBuffer2
*******************************************************************************/
TestStatus Buffercmp(u32* pBuffer1, u32* pBuffer2, u16 BufferLength)
{
while (BufferLength--)
{
if (*pBuffer1 != *pBuffer2)
{
return FAILED;
}
pBuffer1++;
pBuffer2++;
}
return PASSED;
}
/*******************************************************************************
* 函数名 : Fill_Buffer
* 描述 : 填用户预设数据入缓存
* 输入 : - pBuffer: pointer on the Buffer to fill
* - BufferLenght: size of the buffer to fill
* - Offset: first value to fill on the Buffer
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void Fill_Buffer(u32 *pBuffer, u16 BufferLenght, u32 Offset)
{
u16 index = 0;
/* Put in global buffer same values */
for (index = 0; index < BufferLenght; index++ )
{
pBuffer[index] = index + Offset;
}
}
/*******************************************************************************
* 函数名 : eBuffercmp
* 描述 : 检查一个缓存值是否为零
* 输入 : - pBuffer: 缓存区比较.
* : - BufferLength:缓存区长度
* 输出 : 无
* 返回 : PASSED: 缓存区值为零
* FAILED: 缓存区值不为零.
*******************************************************************************/
TestStatus eBuffercmp(u32* pBuffer, u16 BufferLength)
{
while (BufferLength--)
{
if (*pBuffer != 0x00)
{
return FAILED;
}
pBuffer++;
}
return PASSED;
}
#ifdef DEBUG
/*******************************************************************************
* 函数名 : assert_failed
* 描述 :用于报错
* 输入 : - file: 文件名指针
* - line: 行号指针
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void assert_failed(u8* file, u32 line)
{
while (1)
{}
}
#endif
/*******************************************************************************
* 函数名 : SysTick_Config
* 描述 : 配置SysTick时基10ms.
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void SysTick_Config(void)
{
/* 配置HCLK作为SysTick时钟源 */
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
/* SysTick interrupt each 100 Hz with HCLK equal to 72MHz */
SysTick_SetReload(720000);
/* 使能SysTick中断 */
SysTick_ITConfig(ENABLE);
}
/*******************************************************************************
* 函数名 : Delay
* 描述 : 延时函数.
* 输入 : nCount: 规定延时值.
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void Delay(u32 nCount)
{
TimingDelay = nCount;
/* 使能SysTick计数器 */
SysTick_CounterCmd(SysTick_Counter_Enable);
while(TimingDelay != 0)
{
}
/* 禁止SysTick计数器 */
SysTick_CounterCmd(SysTick_Counter_Disable);
/* SysTick清零*/
SysTick_CounterCmd(SysTick_Counter_Clear);
}
/*******************************************************************************
* 函数名 : Decrement_TimingDelay
* 描述 : 延时递减
* 输入 : 无
* 输出 : 延时
* 返回 : 无
*******************************************************************************/
void Decrement_TimingDelay(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}
/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -