STM32F10xSDIO.docx

上传人:b****4 文档编号:24462090 上传时间:2023-05-27 格式:DOCX 页数:62 大小:32.72KB
下载 相关 举报
STM32F10xSDIO.docx_第1页
第1页 / 共62页
STM32F10xSDIO.docx_第2页
第2页 / 共62页
STM32F10xSDIO.docx_第3页
第3页 / 共62页
STM32F10xSDIO.docx_第4页
第4页 / 共62页
STM32F10xSDIO.docx_第5页
第5页 / 共62页
点击查看更多>>
下载资源
资源描述

STM32F10xSDIO.docx

《STM32F10xSDIO.docx》由会员分享,可在线阅读,更多相关《STM32F10xSDIO.docx(62页珍藏版)》请在冰豆网上搜索。

STM32F10xSDIO.docx

STM32F10xSDIO

SDIO库函数入下表:

No

库函数名

作用

操作对象

1

SDIO_DeInit

初始化SDIO外设寄存器

8个寄存器的的初始值

2

SDIO_Init

初始化SDIO_InitStruct结构体

SDIO->CLKCR

配置CLKCR

3

SDIO_StructInit

初始化SDIO_InitStruct内的结构成员

配置CLKCR寄存所需要的参数缺省值

4

SDIO_ClockCmd

开启/关闭SDIO时钟

*(vu32*)CLKCR_CLKEN_BB

配置CLKCR

5

SDIO_SetPowerState

设置电源控制状态

SDIO->POWER

POWER操作

6

SDIO_GetPowerState

读取电源控制状态

SDIO->POWER

7

SDIO_ITConfig

开启或关闭中断

SDIO->MASK

8

SDIO_DMACmd

开启或关闭DMA

*(vu32*)DCTRL_DMAEN_BB

9

SDIO_SendCommand

初始化SDIO_CmdInitStruct并发送配置命令

SDIO->ARG/CMD

10

SDIO_CmdStructInit

为SDIO_CmdInitStruct结构体填充缺省值

11

SDIO_GetCommandResponse

返回命令反馈信息(命令索引值)

SDIO->RESPCMD

12

SDIO_GetResponse

返回上次从SD卡传回的命令响应

*(vu32*)(SDIO_RESP_ADDR+SDIO_RESP)

13

SDIO_DataConfig

初始化SDIO_DataInitStruct以设置数据路径

SDIO->DTIMER/DLEN/DCTRL

14

SDIO_DataStructInit

初始化SDIO_DataInitStruct结构体的成员

15

SDIO_GetDataCounter

返回待传输的数据字节数

SDIO->DCOUNT

16

SDIO_ReadData

从RxFIFO读出已收到的数据

SDIO->FIFO

17

SDIO_WriteData

向TxFIFO写入待发送的数据

SDIO->FIFO

18

SDIO_GetFIFOCount

返回FIFO内的(发送或接受的)数据字数

SDIO->FIFOCNT

19

SDIO_StartSDIOReadWait

开启读等待操作

*(vu32*)DCTRL_RWSTART_BB

DCTRL的[读]位操作

20

SDIO_StopSDIOReadWait

关闭读等待操作

*(vu32*)DCTRL_RWSTOP_BB

21

SDIO_SetSDIOReadWaitMode

设置两个插入读等待间隔之一的选项

*(vu32*)DCTRL_RWMOD_BB

22

SDIO_SetSDIOOperation

使能或失能SDIO模式

*(vu32*)DCTRL_SDIOEN_BB

DCTRL

23

SDIO_SendSDIOSuspendCmd

使能或失能SDIO模式暂停命令(正发送)

*(vu32*)CMD_SDIOSUSPEND_BB

24

SDIO_CommandCompletionCmd

使能或失能命令完成信号

*(vu32*)CMD_ENCMDCOMPL_BB

25

SDIO_CEATAITCmd

使能或失能CE-ATA中断

*(vu32*)CMD_NIEN_BB

26

SDIO_SendCEATACmd

发送CE-ATA命令(CMD61)

*(vu32*)CMD_ATACMD_BB

27

SDIO_GetFlagStatus

检查SDIO的标志位是否已被设置

SDIO->STA

28

SDIO_ClearFlag

清除SDIO挂起标志位

SDIO->ICR

29

SDIO_GetITStatus

检查SDIO中断是已否发生

SDIO->STA

30

SDIO_ClearITPendingBit

清除SDIO中断挂起位

SDIO->ICR

/*【01】函数SDIO_DeInit

******************************************************************************

*FunctionName:

SDIO_DeInit

*Description:

DeinitializestheSDIOperipheralregisterstotheirdefaultresetvalues.

*Input:

None

*Output:

None

*Return:

None

*******************************************************************************/

voidSDIO_DeInit(void)

{

SDIO->POWER=0x00000000;

SDIO->CLKCR=0x00000000;

SDIO->ARG=0x00000000;

SDIO->CMD=0x00000000;

SDIO->DTIMER=0x00000000;

SDIO->DLEN=0x00000000;

SDIO->DCTRL=0x00000000;

SDIO->ICR=0x00C007FF;//清除所有中断标志

SDIO->MASK=0x00000000;

}

/*【02】函数SDIO_Init

******************************************************************************

*FunctionName:

SDIO_Init

*Description:

InitializestheSDIOperipheralaccordingtothespecifiedparametersintheSDIO_InitStruct.

*Input:

SDIO_InitStruct:

pointertoaSDIO_InitTypeDefstructurethatcontainstheconfiguration

informationfortheSDIOperipheral.

*Output:

None

*Return:

None

*******************************************************************************/

SDIO_Init的结构体如下:

typedefstruct

{

u8SDIO_ClockDiv;//8bit分频系数

u32SDIO_ClockEdge;

u32SDIO_ClockBypass;

u32SDIO_ClockPowerSave;

u32SDIO_BusWide;

u32SDIO_HardwareFlowControl;

}SDIO_InitTypeDef;

上述结构体的参数设置如下:

Table.2-1SD时钟相位选择

参数SDIO_ClockEdge的值

描述/SDIO_CLKCR.NEGEDGE/bit13

#define

SDIO_ClockEdge_Rising

SDIOCLK的上升沿产生SDIO_CK

0x00000000

SDIO_ClockEdge_Falling

SDIOCLK的下降沿产生SDIO_CK

0x00002000

Table.2-2SD时钟旁路选择

参数SDIO_ClockBypass的值

描述/SDIO_CLKCR.Bypass/bit10

#define

SDIO_ClockBypass_Disable

SDIOCLK分频驱动SDIO_CK输出

0x00000000

根据CLKDIV[7:

0]分频

SDIO_ClockBypass_Enable

SDIOCLK直接驱动SDIO_CK输出

0x00000400

Table.2-3SD省电配置

参数SDIO_ClockPowerSave的值

描述/SDIO_CLKCR.Bypass/bit9

#define

SDIO_ClockPowerSave_Disable

始终输出SDIO_CK

0x00000000

SDIO_ClockPowerSave_Enable

仅在总线活动时才输出SDIO_CK

0x00000200

Table.2-4SD宽总线模式使能

参数SDIO_BusWide的值

描述/SDIO_CLKCR.WIDBUS[1:

0]

#define

bit12-11

SDIO_BusWide_1b

1位总线模式,使用SDIO_D[0]

0x00000000

默认

SDIO_BusWide_4b

4位总线模式,使用SDIO_D[3:

0]

0x00000800

SDIO_BusWide_8b

8位总线模式,使用SDIO_D[7:

0]

0x00001000

Table.2-5SD宽总线模式使能

参数SDIO_HardwareFlowControl的值

描述/SDIO_CLKCR.HWFC_EN/bit14

#define

SDIO_HardwareFlowControl_Disable

关闭硬件流控制

0x00000000

SDIO_HardwareFlowControl_Enable

开启硬件流控制

0x00004000

【注】函数在被调用之前,必须对结构体进行具体数值初始化。

函数原型如下:

voidSDIO_Init(SDIO_InitTypeDef*SDIO_InitStruct)

{

u32tmpreg=0;

/*Checktheparameters*/

assert_param(IS_SDIO_CLOCK_EDGE(SDIO_InitStruct->SDIO_ClockEdge));

assert_param(IS_SDIO_CLOCK_BYPASS(SDIO_InitStruct->SDIO_ClockBypass));

assert_param(IS_SDIO_CLOCK_POWER_SAVE(SDIO_InitStruct->SDIO_ClockPowerSave));

assert_param(IS_SDIO_BUS_WIDE(SDIO_InitStruct->SDIO_BusWide));

assert_param(IS_SDIO_HARDWARE_FLOW_CONTROL(SDIO_InitStruct->SDIO_HardwareFlowControl));

/*----------------------------SDIOCLKCRConfiguration------------------------*/

/*GettheSDIOCLKCRvalue*/

tmpreg=SDIO->CLKCR;

/*ClearCLKDIV,PWRSAV,BYPASS,WIDBUS,NEGEDGE,HWFC_ENbits*/

tmpreg&=CLKCR_CLEAR_MASK;//CLKCR_CLEAR_MASK=0xFFFF8100,其中CLKEN位保持不变更。

/*SetCLKDIVbitsaccordingtoSDIO_ClockDivvalue*/

/*SetPWRSAVbitaccordingtoSDIO_ClockPowerSavevalue*/

/*SetBYPASSbitaccordingtoSDIO_ClockBypassvalue*/

/*SetWIDBUSbitsaccordingtoSDIO_BusWidevalue*/

/*SetNEGEDGEbitsaccordingtoSDIO_ClockEdgevalue*/

/*SetHWFC_ENbitsaccordingtoSDIO_HardwareFlowControlvalue*/

tmpreg|=(SDIO_InitStruct->SDIO_ClockDiv|SDIO_InitStruct->SDIO_ClockPowerSave|

SDIO_InitStruct->SDIO_ClockBypass|SDIO_InitStruct->SDIO_BusWide|

SDIO_InitStruct->SDIO_ClockEdge|SDIO_InitStruct->SDIO_HardwareFlowControl);

/*WritetoSDIOCLKCR*/

SDIO->CLKCR=tmpreg;

}

/*【03】函数SDIO_StructInit

******************************************************************************

*FunctionName:

SDIO_StructInit

*Description:

FillseachSDIO_InitStructmemberwithitsdefaultvalue.

*Input:

SDIO_InitStruct:

pointertoanSDIO_InitTypeDefstructurewhichwillbeinitialized.

*Output:

None

*Return:

None

*******************************************************************************/

对SDIO->CLKCR涉及到的参数结构体(SDIO_InitTypeDef)进行缺省值注入。

函数原型如下:

voidSDIO_StructInit(SDIO_InitTypeDef*SDIO_InitStruct)

{

/*SDIO_InitStructmembersdefaultvalue*/

SDIO_InitStruct->SDIO_ClockDiv=0x00;//不分频

SDIO_InitStruct->SDIO_ClockEdge=SDIO_ClockEdge_Rising;//上升沿触发产生SDIO_CK

SDIO_InitStruct->SDIO_ClockBypass=SDIO_ClockBypass_Disable;//关闭旁路,直接用SDIOCLK驱动SDIO_CK输出

SDIO_InitStruct->SDIO_ClockPowerSave=SDIO_ClockPowerSave_Disable;//关闭节能功能,时钟输出SDIO_CK

SDIO_InitStruct->SDIO_BusWide=SDIO_BusWide_1b;//默认状态下,总线宽度只占1位。

SDIO_InitStruct->SDIO_HardwareFlowControl=SDIO_HardwareFlowControl_Disable;//关闭硬件流控制

}

/*【04】函数SDIO_ClockCmd

******************************************************************************

*FunctionName:

SDIO_ClockCmd

*Description:

EnablesordisablestheSDIOClock.

*Input:

NewState:

newstateoftheSDIOClock.Thisparametercanbe:

ENABLEorDISABLE.

*Output:

None

*Return:

None

*******************************************************************************/

voidSDIO_ClockCmd(FunctionalStateNewState)

{

/*Checktheparameters*/

assert_param(IS_FUNCTIONAL_STATE(NewState));

*(vu32*)CLKCR_CLKEN_BB=(u32)NewState;

}

SDIO->CLKCR的CLKEN位地址定义如下:

/*AliaswordaddressofCLKENbit*/

#defineCLKCR_OFFSET(SDIO_OFFSET+0x04)

#defineCLKEN_BitNumber0x08

#defineCLKCR_CLKEN_BB(PERIPH_BB_BASE+(CLKCR_OFFSET*32)+(CLKEN_BitNumber*4))

其中:

【1】#definePERIPH_BB_BASE((u32)0x42000000)

【2】#defineSDIO_OFFSET(SDIO_BASE-PERIPH_BASE)

#defineSDIO_BASE(PERIPH_BASE+0x18000)//即SDIO_OFFSET=0x18000

最终结果是:

&CLKCR_CLKEN_BB=0x424B00E8

/*【05】函数SDIO_SetPowerState

******************************************************************************

*FunctionName:

SDIO_SetPowerState

*Description:

Setsthepowerstatusofthecontroller.

*Input:

SDIO_PowerState:

newstateofthePowerstate.

*Thisparametercanbeoneofthefollowingvalues:

*-SDIO_PowerState_OFF

*-SDIO_PowerState_ON

*Output:

None

*Return:

None

*******************************************************************************/

POWER寄存器的参数设置如下:

Table5-1SDIO的电源状态配置

参数SDIO_PowerState值

描述/SDIO->POWER.bit1-0

#define

备注

SDIO_PowerState_OFF

电源关闭,卡的时钟停止

0x00000000

PWRCTRL[1:

0]。

另:

0x1保留

SDIO_PowerState_ON

上电状态,卡的时钟开启

0x00000003

SDIO_PowerState_UP

保留的上电状态

0x00000002

本函数没有用到

其函数原型如下:

voidSDIO_SetPowerState(u32SDIO_PowerState)

{

/*Checktheparameters*/

assert_param(IS_SDIO_POWER_STATE(SDIO_PowerState));//只能输入On和Off两个状态,Up状态不配置

SDIO->POWER&=PWR_PWRCTRL_MASK;//0xFFFFFFFC,清除PWRCTRL[1:

0]控制位

SDIO->POWER|=SDIO_PowerState;//写入新控制方式

}

/*【06】函数SDIO_GetPowerState

******************************************************************************

*FunctionName:

SDIO_GetPowerState

*Description:

Getsthepowerstatusofthecontroller.

*Input:

None

*Output:

None

*Return:

Powerstatusofthecontroller.Thereturnedvaluecan

*beoneofthefollowing:

*-0x00:

PowerOFF

*-0x02:

PowerUP

*-0x03:

PowerON

*******************************************************************************/

u32SDIO_GetPowerState(void)

{

return(SDIO->POWER&(~PWR_PWRCTRL_MASK));//0xFFFFFFFC,读出PWRCTRL[1:

0]控制位配置:

0b00、0b10、0b11

}

/*【07】函数SDIO_ITConfig

******************************************************************************

*FunctionName:

SDIO_ITConfig

*Description:

EnablesordisablestheSDIOinterrupts.

*Input:

-SDIO_IT:

specifiestheSDIOinterruptsourcestobeenabledordisabled.

*Thisparametercanbeoneoracombinationofthefollowingvalues:

*-SDIO_IT_CCRCFAIL:

Commandresponsereceived(CRCcheckfailed)interrupt

*-SDIO_IT_DCRCFAIL:

Datablocksent/received(CR

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1