STM32F10xSDIO.docx
- 文档编号:24462090
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:62
- 大小:32.72KB
STM32F10xSDIO.docx
《STM32F10xSDIO.docx》由会员分享,可在线阅读,更多相关《STM32F10xSDIO.docx(62页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- STM32F10xSDIO
![提示](https://static.bdocx.com/images/bang_tan.gif)