stm32的stm32f10x_sdio.c的学习

转载自:http://blog.sina.com.cn/s/blog_6fa48e200101ikyo.html

enSDIO库函数入下表:

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

从Rx FIFO读出已收到的数据

SDIO->FIFO

17

SDIO_WriteData

向Tx FIFO写入待发送的数据

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

           

 

 

void SDIO_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;

}

 

SDIO_Init的结构体如下:

typedef struct

{

  u8 SDIO_ClockDiv;//8bit分频系数

  u32 SDIO_ClockEdge;

  u32 SDIO_ClockBypass;

  u32 SDIO_ClockPowerSave;

  u32 SDIO_BusWide;

  u32 SDIO_HardwareFlowControl;

} SDIO_InitTypeDef;

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

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

参数SDIO_ClockEdge的值

描述/SDIO_CLKCR.NEGEDGE/bit13

#define

 

SDIO_ClockEdge_Rising

SDIOCLK的上升沿产生SDIO_CK

0x00000000

 

SDIO_ClockEdge_Falling

SDIOCLK的下降沿产生SDIO_CK

0x00002000

 

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

参数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-3 SD省电配置

参数SDIO_ClockPowerSave的值

描述/SDIO_CLKCR. Bypass/bit9

#define

 

SDIO_ClockPowerSave_Disable

始终输出SDIO_CK

0x00000000

 

SDIO_ClockPowerSave_Enable

仅在总线活动时才输出SDIO_CK

0x00000200

 

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

参数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-5 SD宽总线模式使能

参数SDIO_ HardwareFlowControl的值

描述/SDIO_CLKCR. HWFC_EN/bit14

#define

 

SDIO_HardwareFlowControl_Disable

关闭硬件流控制

0x00000000

 

SDIO_HardwareFlowControl_Enable

开启硬件流控制

0x00004000

 

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

函数原型如下:

void SDIO_Init(SDIO_InitTypeDef* SDIO_InitStruct)

{

  u32 tmpreg = 0;

   

 

  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));

  

 

 

  tmpreg = SDIO->CLKCR;

 

 

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

 

 

 

 

 

 

 

  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);

 

 

  SDIO->CLKCR = tmpreg;

}

 

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

函数原型如下:

void SDIO_StructInit(SDIO_InitTypeDef* SDIO_InitStruct)

{

 

  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;//关闭硬件流控制

}

 

void SDIO_ClockCmd(FunctionalState NewState)

{

 

  assert_param(IS_FUNCTIONAL_STATE(NewState));

 

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

}

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

#define CLKCR_OFFSET              (SDIO_OFFSET + 0x04)

#define CLKEN_BitNumber           0x08

#define CLKCR_CLKEN_BB            (PERIPH_BB_BASE + (CLKCR_OFFSET * 32) + (CLKEN_BitNumber * 4))

其中:

【1】#define PERIPH_BB_BASE        ((u32)0x42000000)

【2】#define SDIO_OFFSET                (SDIO_BASE - PERIPH_BASE)

     #define SDIO_BASE             (PERIPH_BASE + 0x18000)//即SDIO_OFFSET = 0x18000

最终结果是:&CLKCR_CLKEN_BB = 0x424B 00E8

 

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

     Table5-1 SDIO的电源状态配置

参数SDIO_PowerState值

描述/SDIO->POWER.bit1-0

#define

备注

SDIO_PowerState_OFF

电源关闭,卡的时钟停止

0x00000000

PWRCTRL[1:0]。另:0x1保留

SDIO_PowerState_ON

上电状态,卡的时钟开启

0x00000003

SDIO_PowerState_UP

保留的上电状态

0x00000002

本函数没有用到

其函数原型如下:

void SDIO_SetPowerState(u32 SDIO_PowerState)

{

 

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

 

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

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

}

 

u32 SDIO_GetPowerState(void)

{

  return (SDIO->POWER & (~PWR_PWRCTRL_MASK)); // 0xFFFFFFFC,读出PWRCTRL[1:0]控制位配置:0b00、0b10、0b11

}

 

   Table.7-1 SDIO可屏蔽的中断源取值(SDIO->MASK.bit0-23,共24种中断)如下:

Bit

参数SDIO_IT取值

意义/SDIO->MASK

#define

备注

0

SDIO_IT_CCRCFAIL

收到命令响应,但CRC验证失败

0x00000001

错误类

1

SDIO_IT_DCRCFAIL

传输数据响应,但CRC验证失败(发送/接收)

0x00000002

2

SDIO_IT_CTIMEOUT

命令响应超时

0x00000004

3

SDIO_IT_DTIMEOUT

数据传输超时

0x00000008

4

SDIO_IT_TXUNDERR

发送FIFO数据下溢错误

0x00000010

5

SDIO_IT_RXOVERR

接收FIFO数据上溢错误

0x00000020

6

SDIO_IT_CMDREND

已收到命令响应,且CRC验证成功

0x00000040

 

7

SDIO_IT_CMDSENT

命令已发送响应(但不需要CRC验证)

0x00000080

 

8

SDIO_IT_DATAEND

数据发送结束(SDIO->DCOUNT = 0)

0x00000100

 

9

SDIO_IT_STBITERR

有些数据线没有检测到起始位(宽总线模式)

0x00000200

错误类

10

SDIO_IT_DBCKEND

传输数据块结束,且CRC验证成功

0x00000400

 

11

SDIO_IT_CMDACT

正在传输命令

0x00000800

传输进行中

12

SDIO_IT_TXACT

正在传输数据

0x00001000

13

SDIO_IT_RXACT

正在接受数据

0x00002000

14

SDIO_IT_TXFIFOHE

发送FIFO半空(FIFO至少还有8个字的空间)

0x00004000

FIFO状态

15

SDIO_IT_RXFIFOHF

接收FIFO半满(FIFO至少已有8个字的存在)

0x00008000

16

SDIO_IT_TXFIFOF

发送FIFO满

0x00010000

17

SDIO_IT_RXFIFOF

接受FIFO满(硬件流控制:差2个字节->有效)

0x00020000

18

SDIO_IT_TXFIFOE

发送FIFO空(硬件流控制:仅2个字节->有效)

0x00040000

19

SDIO_IT_RXFIFOE

接收FIFO空

0x00080000

20

SDIO_IT_TXDAVL

在发送FIFO中的数据可用

0x00100000

数据状况

21

SDIO_IT_RXDAVL

在接收FIFO中的数据可用

0x00200000

22

SDIO_IT_SDIOIT

收到SDIO中断

0x00400000

 

23

SDIO_IT_CEATAEND

收到 CE-ATA命令 完成信号(For CMD61)

0x00800000

 

函数原型如下:

void SDIO_ITConfig(u32 SDIO_IT, FunctionalState NewState)

{

 

  assert_param(IS_SDIO_IT(SDIO_IT));

  assert_param(IS_FUNCTIONAL_STATE(NewState));

 

  if (NewState != DISABLE)

  {

   

    SDIO->MASK |= SDIO_IT;//开启中断允许

  }

  else

  {

   

    SDIO->MASK &= ~SDIO_IT; //关闭中断允许

  }

}

 

void SDIO_DMACmd(FunctionalState NewState)

{

 

  assert_param(IS_FUNCTIONAL_STATE(NewState));

 

  *(vu32 *) DCTRL_DMAEN_BB = (u32)NewState;//位地址操作

}

位地址操作意义如下:

【1】

#define DCTRL_OFFSET              (SDIO_OFFSET + 0x2C) //【B】 = 0x1802C

#define DMAEN_BitNumber           0x03//【C】

#define DCTRL_DMAEN_BB            (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (DMAEN_BitNumber * 4))

【2】

#define SDIO_OFFSET                (SDIO_BASE - PERIPH_BASE)// = 0x18000

【3】

#define SDIO_BASE             (PERIPH_BASE + 0x18000)

【4】

#define PERIPH_BB_BASE        ((u32)0x42000000) //【A】

【结果】:【A】+ 【B】*32+【C】*4 = 0x4230 058C

 

SDIO_CmdInitStruct结构体如下:

typedef struct

{

  u32 SDIO_Argument;

  u32 SDIO_CmdIndex;

  u32 SDIO_Response;

  u32 SDIO_Wait;

  u32 SDIO_CPSM;

} SDIO_CmdInitTypeDef;

结构体的各参数取值如下:

【1】、 SDIO_CmdIndex取值:< 0x40;[SDIO->CMD. CMDINDEX[5:0]/Bit5-0]

【2】、 SDIO_Respone取值(类型)如下表:

     Table.9-1 SDIO_Respone命令响应类型

参数SDIO_Respone值

描述/SDIO->CMD. WAITRESP[1:0]/bit7-6

#define

备注

SDIO_Response_No

无响应,期待CMDSENT标志

0x00000000

或0x00000080/bit7-6 = 0bx0

SDIO_Response_Short

短响应,期待CMDREND或CCRCFAIL标志

0x00000040

 

SDIO_Response_Long

长响应,期待CMDREND或CCRCFAIL标志

0x000000C0

 

【3】、 SDIO_Wait取值如下表:

     Table.9-2 SDIO_Wait类型

参数SDIO_Wait值

描述/SDIO->CMD. WAITPEND+WAITINT

#define

说明

SDIO_Wait_No

SDIO No Wait, TimeOut is enabled

0x00000000

关闭bit9+bit8

SDIO_Wait_IT

SDIO Wait Interrupt Request

0x00000100

开启bit8

SDIO_Wait_Pend

SDIO Wait End of transfer

0x00000200

开启bit9

【4】、 SDIO_CPSM取值如下表:

    Table.9-3 SDIO_CPSM开启/关闭值

参数SDIO_CPSM值

描述/ SDIO->CMD. CPSMEN/Bit10

#define

备注

SDIO_CPSM_Disable

关闭CPSM

0x00000000

 

SDIO_CPSM_Enable

开启CPSM

0x00000400

 

【5】、 SDIO_Argument为命令(32位)参数(Argument)。

【注】:在调用SDIO_SendCommand函数时,必须实现初始化结构体的上述5个参数。

函数原型如下:

void SDIO_SendCommand(SDIO_CmdInitTypeDef *SDIO_CmdInitStruct)

{

  u32 tmpreg = 0;

 

 

  assert_param(IS_SDIO_CMD_INDEX(SDIO_CmdInitStruct->SDIO_CmdIndex));//SDIO_CmdIndex < 0x40

  assert_param(IS_SDIO_RESPONSE(SDIO_CmdInitStruct->SDIO_Response));

  assert_param(IS_SDIO_WAIT(SDIO_CmdInitStruct->SDIO_Wait));

  assert_param(IS_SDIO_CPSM(SDIO_CmdInitStruct->SDIO_CPSM));

 

 

  SDIO->ARG = SDIO_CmdInitStruct->SDIO_Argument;

 

 

 

  tmpreg = SDIO->CMD;

 

 

  tmpreg &= CMD_CLEAR_MASK;// 0xFFFFF800,清除bit10-0

 

 

 

 

  tmpreg |= (u32)SDIO_CmdInitStruct->SDIO_CmdIndex | SDIO_CmdInitStruct->SDIO_Response

           | SDIO_CmdInitStruct->SDIO_Wait | SDIO_CmdInitStruct->SDIO_CPSM;

 

 

  SDIO->CMD = tmpreg;

}

 

本函数用于设置SDIO_CmdInitStruct的5个结构体参数。【程序过程调用本函数,相当于复位CMD和ARG两个寄存器的初始值】

函数原型如下:

void SDIO_CmdStructInit(SDIO_CmdInitTypeDef* SDIO_CmdInitStruct)

{

 

  SDIO_CmdInitStruct->SDIO_Argument = 0x00;//32位

  SDIO_CmdInitStruct->SDIO_CmdIndex = 0x00;//6位

  SDIO_CmdInitStruct->SDIO_Response = SDIO_Response_No;

  SDIO_CmdInitStruct->SDIO_Wait = SDIO_Wait_No;

  SDIO_CmdInitStruct->SDIO_CPSM = SDIO_CPSM_Disable;

}

 

本函数(用于读取命令响应)原型如下:

u8 SDIO_GetCommandResponse(void)

{

  return (u8)(SDIO->RESPCMD);

}

 

函数原型如下:

u32 SDIO_GetResponse(u32 SDIO_RESP)

{

 

  assert_param(IS_SDIO_RESP(SDIO_RESP));

 

  return (*(vu32 *)(SDIO_RESP_ADDR + SDIO_RESP)); //寄存器的直接地址方式访问操作(没使用别名)

}

函数地址解析如下:

【1】.

#define SDIO_RESP_ADDR           ((u32)(SDIO_BASE + 0x14))//其中0x14是SDIO->RESP1的偏移地址

【2】.RESPx的Address Offset值如下表:

     Table.12-1 RESPx的地址偏移量如下:[不过,本函数定义的偏移量是以RESP1偏移量为基准,故RESP1的偏移量为0x00]

参数SDIO_RESP值

#define Value

说明

SDIO_RESP1

0x00000000

本函数定义的偏移量是以RESP1偏移量为基准,故RESP1的偏移量为0x00

SDIO_RESP2

0x00000004

SDIO_RESP3

0x00000008

SDIO_RESP4

0x0000000C

【3】.SDIO_BASS:

#define SDIO_BASE             (PERIPH_BASE + 0x18000)

【4】PERIPH_BASE:

#define PERIPH_BASE           ((u32)0x40000000)

其结果为:0x4001 8014 + SDIO_RESP

 

SDIO_DataInitStruct的结构体如下:

typedef struct

{

  u32 SDIO_DataTimeOut;

  u32 SDIO_DataLength;

  u32 SDIO_DataBlockSize;

  u32 SDIO_TransferDir;

  u32 SDIO_TransferMode;

  u32 SDIO_DPSM;

} SDIO_DataInitTypeDef;

在调用SDIO_DataConfig函数之前,必须事先对上述结构体进行初始化,其结构体各参数值如下:

【1】、SDIO_DataTimeOut(SDIO->DTIMER):控制数据在SDIO_DataTimeOut时间之内不超时(以卡总线时钟周期为单位的数据超时时

      间),超过这个值,则传输超时。

【2】、DataLength(SDIO->DLEN.bit24-0):指定数据长度(为:数据块的倍数)。其取值范围为:<= 0x01FFFFFF(25bit有效长度)。

【3】、DataBlockSize(SDIO->DCTRL.bit7-4):控制一个数据块有多少字节(Bytes):一个数据块 = 2^((十进制)BLOCKSIZE[3:0])。

     Table.13-1 SDIO_DataBlockSize取值如下:

No

参数SDIO_DataBlockSize取值

描述/ DCTRL.bit7-4

#define

1

SDIO_DataBlockSize_1b

1数据块 = 1字节

0x00000000

2

SDIO_DataBlockSize_2b

1数据块 = 2字节

0x00000010

3

SDIO_DataBlockSize_4b

1数据块 = 4字节

0x00000020

4

SDIO_DataBlockSize_8b

1数据块 = 8字节

0x00000030

5

SDIO_DataBlockSize_16b

1数据块 = 16字节

0x00000040

6

SDIO_DataBlockSize_32b

1数据块 = 32字节

0x00000050

7

SDIO_DataBlockSize_64b

1数据块 = 64字节

0x00000060

8

SDIO_DataBlockSize_128b

1数据块 = 128字节

0x00000070

9

SDIO_DataBlockSize_256b

1数据块 = 256字节

0x00000080

10

SDIO_DataBlockSize_512b

1数据块 = 512字节

0x00000090

11

SDIO_DataBlockSize_1024b

1数据块 = 1024字节

0x000000A0

12

SDIO_DataBlockSize_2048b

1数据块 = 2048字节

0x000000B0

13

SDIO_DataBlockSize_4096b

1数据块 = 4096字节

0x000000C0

14

SDIO_DataBlockSize_8192b

1数据块 = 8196字节

0x000000D0

15

SDIO_DataBlockSize_16384b

1数据块 = 16384字节

0x000000E0

 

【4】、TransferDir(SDIO->DCTRL.bit1):控制数据传输方向。其定义值及意义如下表:

     Table.13-1 SDIO_TransferDir取值如下:

参数SDIO_TransferDir取值

描述/DCTRL.DTDIR

#define Value

SDIO_TransferDir_ToCard

控制器到卡

0x00000000

SDIO_TransferDir_ToSDIO

卡到控制器

0x00000002

【5】、SDIO_TransferMode(SDIO->DCTRL.bit2):控制数据传输模式。其定义与意义如下表:

     Table.13-2 SDIO_TransferMode取值如下:

参数SDIO_TransferMode取值

描述/DCTRL.DTMODE

#define Value

SDIO_TransferMode_Block

块数据传输

0x00000000

SDIO_TransferMode_Stream

流数据传输

0x00000004

【6】、SDIO_DPSM(SDIO->DCTRL.bit0):使能或关闭数据传输

参数SDIO_DPSM取值

描述/DCTRL.DTEN

#define Value

SDIO_DPSM_Disable

关闭数据传输

0x00000000

SDIO_DPSM_Enable

使能传输

0x00000001

 

函数原型如下:

void SDIO_DataConfig(SDIO_DataInitTypeDef* SDIO_DataInitStruct)

{

  u32 tmpreg = 0;

 

 

  assert_param(IS_SDIO_DATA_LENGTH(SDIO_DataInitStruct->SDIO_DataLength));

  assert_param(IS_SDIO_BLOCK_SIZE(SDIO_DataInitStruct->SDIO_DataBlockSize));

  assert_param(IS_SDIO_TRANSFER_DIR(SDIO_DataInitStruct->SDIO_TransferDir));

  assert_param(IS_SDIO_TRANSFER_MODE(SDIO_DataInitStruct->SDIO_TransferMode));

  assert_param(IS_SDIO_DPSM(SDIO_DataInitStruct->SDIO_DPSM));

 

 

  SDIO->DTIMER = SDIO_DataInitStruct->SDIO_DataTimeOut;

   

 

  SDIO->DLEN = SDIO_DataInitStruct->SDIO_DataLength;

 

 

 

  tmpreg = SDIO->DCTRL;

 

 

  tmpreg &= DCTRL_CLEAR_MASK;// 0xFFFFFF08

 

 

 

 

  tmpreg |= (u32)SDIO_DataInitStruct->SDIO_DataBlockSize | SDIO_DataInitStruct->SDIO_TransferDir

           | SDIO_DataInitStruct->SDIO_TransferMode | SDIO_DataInitStruct->SDIO_DPSM;

 

 

  SDIO->DCTRL = tmpreg;

}

 

对SDIO_DataInitStruct结构体内的参数进行缺省值初始化,本函数可以被用于在程序当中复位数据传输模式。

函数原型如下:

void SDIO_DataStructInit(SDIO_DataInitTypeDef* SDIO_DataInitStruct)

{

 

  SDIO_DataInitStruct->SDIO_DataTimeOut = 0xFFFFFFFF;

  SDIO_DataInitStruct->SDIO_DataLength = 0x00;

  SDIO_DataInitStruct->SDIO_DataBlockSize = SDIO_DataBlockSize_1b;

  SDIO_DataInitStruct->SDIO_TransferDir = SDIO_TransferDir_ToCard;

  SDIO_DataInitStruct->SDIO_TransferMode = SDIO_TransferMode_Block; 

  SDIO_DataInitStruct->SDIO_DPSM = SDIO_DPSM_Disable;

}

 

读取数据计数器的值,表明还有多少数据等待传输

函数原型如下:

u32 SDIO_GetDataCounter(void)

{

  return SDIO->DCOUNT;

}

 

u32 SDIO_ReadData(void)

{

  return SDIO->FIFO;

}

 

void SDIO_WriteData(u32 Data)

{

  SDIO->FIFO = Data;

}

 

u32 SDIO_GetFIFOCount(void)

{

  return SDIO->FIFOCNT;

}

 

void SDIO_StartSDIOReadWait(FunctionalState NewState)

{

 

  assert_param(IS_FUNCTIONAL_STATE(NewState));

 

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

}

位地址操作如下:

#define DCTRL_RWSTART_BB          (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTART_BitNumber * 4))

【1】

#define PERIPH_BB_BASE        ((u32)0x42000000)

【2】

#define SDIO_BASE             (PERIPH_BASE + 0x18000)

#define SDIO_OFFSET                (SDIO_BASE - PERIPH_BASE)//SDIO_OFFSET = 0x18000

#define DCTRL_OFFSET              (SDIO_OFFSET + 0x2C)//DCTRL_OFFSET = 0x1802C

【3】

#define RWSTART_BitNumber         0x08

【结果】&DCTRL_RWSTART_BB = 【1】+【2】*32+【3】*4 = 0x4230 05A0。[SDIO->DCTRL.bit8],读等待开始。

 

void SDIO_StopSDIOReadWait(FunctionalState NewState)

{

 

  assert_param(IS_FUNCTIONAL_STATE(NewState));

 

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

}

位地址操作如下:

#define DCTRL_RWSTOP_BB           (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTOP_BitNumber * 4))

【1】

#define PERIPH_BB_BASE        ((u32)0x42000000)

【2】

#define SDIO_BASE             (PERIPH_BASE + 0x18000)

#define SDIO_OFFSET                (SDIO_BASE - PERIPH_BASE)//SDIO_OFFSET = 0x18000

#define DCTRL_OFFSET              (SDIO_OFFSET + 0x2C)//DCTRL_OFFSET = 0x1802C

【3】

#define RWSTOP_BitNumber          0x09

【结果】&DCTRL_RWSTOP_BB = 【1】+【2】*32+【3】*4 = 0x4230 05A4。[SDIO->DCTRL.bit9],读等待停止。

 

 

void SDIO_SetSDIOReadWaitMode(u32 SDIO_ReadWaitMode)

{

 

  assert_param(IS_SDIO_READWAIT_MODE(SDIO_ReadWaitMode));

 

  *(vu32 *) DCTRL_RWMOD_BB = SDIO_ReadWaitMode;

}

其中SDIO_ReadWaitMode的取值如下表:

     Table.21-1 SDIO_ReadWaitMode类型取值如下:

参数SDIO_ReadWaitMode值

描述/DCTRL.RWMOD/bit10

#define

SDIO_ReadWaitMode_CLK

停止SDIO_CK控制读等待

0x00000000

SDIO_ReadWaitMode_DATA2

使用SDIO_D2控制读等待

0x00000001

位地址操作如下:

#define DCTRL_RWMOD_BB            (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWMOD_BitNumber * 4))

【1】

#define PERIPH_BB_BASE        ((u32)0x42000000)

【2】

#define SDIO_BASE             (PERIPH_BASE + 0x18000)

#define SDIO_OFFSET                (SDIO_BASE - PERIPH_BASE)//SDIO_OFFSET = 0x18000

#define DCTRL_OFFSET              (SDIO_OFFSET + 0x2C)//DCTRL_OFFSET = 0x1802C

【3】

#define RWMOD_BitNumber           0x0A

【结果】&DCTRL_RWMOD_BB = 【1】+【2】*32+【3】*4 = 0x4230 05A8。[SDIO->DCTRL.bit10],读等待停止。

 

void SDIO_SetSDIOOperation(FunctionalState NewState)

{

 

  assert_param(IS_FUNCTIONAL_STATE(NewState));

 

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

}

位地址操作如下:

#define DCTRL_SDIOEN_BB           (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (SDIOEN_BitNumber * 4))

【1】

#define PERIPH_BB_BASE        ((u32)0x42000000)

【2】

#define SDIO_BASE             (PERIPH_BASE + 0x18000)

#define SDIO_OFFSET                (SDIO_BASE - PERIPH_BASE)//SDIO_OFFSET = 0x18000

#define DCTRL_OFFSET              (SDIO_OFFSET + 0x2C)//DCTRL_OFFSET = 0x1802C

【3】

#define SDIOEN_BitNumber          0x0B

【结果】&DCTRL_RWMOD_BB = 【1】+【2】*32+【3】*4 = 4230 05AC。[SDIO->DCTRL.bit11],SD I/O使能功能。

 

void SDIO_SendSDIOSuspendCmd(FunctionalState NewState)

{

 

  assert_param(IS_FUNCTIONAL_STATE(NewState));

 

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

}

位地址操作如下:

#define CMD_SDIOSUSPEND_BB        (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (SDIOSUSPEND_BitNumber * 4))

【1】

#define PERIPH_BB_BASE        ((u32)0x42000000)

【2】

#define SDIO_BASE             (PERIPH_BASE + 0x18000)

#define SDIO_OFFSET                (SDIO_BASE - PERIPH_BASE)//SDIO_OFFSET = 0x18000

#define CMD_OFFSET                (SDIO_OFFSET + 0x0C)//CMD_OFFSET = 0x1800C

【3】

#define SDIOSUSPEND_BitNumber     0x0B

【结果】&CMD_SDIOSUSPEND_BB = 【1】+【2】*32+【3】*4 = 4230 01AC。[SDIO->CMD.bit11],SD I/O暂停命令。

 

void SDIO_CommandCompletionCmd(FunctionalState NewState)

{

 

  assert_param(IS_FUNCTIONAL_STATE(NewState));

 

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

}

位地址操作如下:

#define CMD_ENCMDCOMPL_BB         (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (ENCMDCOMPL_BitNumber * 4))

【1】

#define PERIPH_BB_BASE        ((u32)0x42000000)

【2】

#define SDIO_BASE             (PERIPH_BASE + 0x18000)

#define SDIO_OFFSET                (SDIO_BASE - PERIPH_BASE)//SDIO_OFFSET = 0x18000

#define CMD_OFFSET                (SDIO_OFFSET + 0x0C)//CMD_OFFSET = 0x1800C

【3】

#define ENCMDCOMPL_BitNumber      0x0C

【结果】&CMD_ENCMDCOMPL_BB = 【1】+【2】*32+【3】*4 = 0x4230 01B0。[SDIO->CMD.bit12],使能CMD完成。

 

void SDIO_CEATAITCmd(FunctionalState NewState)

{

 

  assert_param(IS_FUNCTIONAL_STATE(NewState));

 

  *(vu32 *) CMD_NIEN_BB = (u32)((~((u32)NewState)) & ((u32)0x1));

                  //nIEN意义:0-允许中断,1-关闭中断,与FunctionState意义刚好相反,故要对NewState取反,并“与”1。

}

位地址操作如下:

#define CMD_NIEN_BB               (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (NIEN_BitNumber * 4))

【1】

#define PERIPH_BB_BASE        ((u32)0x42000000)

【2】

#define SDIO_BASE             (PERIPH_BASE + 0x18000)

#define SDIO_OFFSET                (SDIO_BASE - PERIPH_BASE)//SDIO_OFFSET = 0x18000

#define CMD_OFFSET                (SDIO_OFFSET + 0x0C)//CMD_OFFSET = 0x1800C

【3】

#define NIEN_BitNumber            0x0D

【结果】&CMD_NIEN_BB = 【1】+【2】*32+【3】*4 = 0x4230 01B4。[SDIO->CMD.bit13],关闭中断使能。

 

void SDIO_SendCEATACmd(FunctionalState NewState)

{

 

  assert_param(IS_FUNCTIONAL_STATE(NewState));

 

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

}

位地址操作如下:

#define CMD_ATACMD_BB         (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (ATACMD_BitNumber * 4))

【1】

#define PERIPH_BB_BASE        ((u32)0x42000000)

【2】

#define SDIO_BASE             (PERIPH_BASE + 0x18000)

#define SDIO_OFFSET           (SDIO_BASE - PERIPH_BASE)//SDIO_OFFSET = 0x18000

#define CMD_OFFSET            (SDIO_OFFSET + 0x0C)//CMD_OFFSET = 0x1800C

【3】

#define ATACMD_BitNumber       0x0E

【结果】&CMD_ATACMD_BB = 【1】+【2】*32+【3】*4 = 0x4230 01B8。[SDIO->CMD.bit14],CE-ATA命令。

 

 

 

函数输入参数SDIO_FLAG的值可以参考“【07】SDIO_ITConfig”的取值,因为SDIO->STA各位于SDIO->MASK各位一一对应。

下表给出了SDIO_FLAG取值。

   Table.27-1 SDIO_FLAG取值

Bit

参数SDIO_FLAG

意义/SDIO->STA.bit0-23

#define

备注

0

SDIO_FLAG_CCRCFAIL

收到命令响应,但CRC验证失败

0x00000001

错误类

1

SDIO_FLAG_DCRCFAIL

传输数据响应,但CRC验证失败(发送/接收)

0x00000002

2

SDIO_FLAG_CTIMEOUT

命令响应超时

0x00000004

3

SDIO_FLAG_DTIMEOUT

数据传输超时

0x00000008

4

SDIO_FLAG_TXUNDERR

发送FIFO数据下溢错误

0x00000010

5

SDIO_FLAG_RXOVERR

接收FIFO数据上溢错误

0x00000020

6

SDIO_FLAG_CMDREND

已收到命令响应,且CRC验证成功

0x00000040

 

7

SDIO_FLAG_CMDSENT

命令已发送响应(但不需要CRC验证)

0x00000080

 

8

SDIO_FLAG_DATAEND

数据发送结束(SDIO->DCOUNT = 0)

0x00000100

 

9

SDIO_FLAG_STBITERR

有些数据线没有检测到起始位(宽总线模式)

0x00000200

错误类

10

SDIO_FLAG_DBCKEND

传输数据块结束,且CRC验证成功

0x00000400

 

11

SDIO_FLAG_CMDACT

正在传输命令

0x00000800

传输进行中

12

SDIO_FLAG_TXACT

正在传输数据

0x00001000

13

SDIO_FLAG_RXACT

正在接受数据

0x00002000

14

SDIO_FLAG_TXFIFOHE

发送FIFO半空(FIFO至少还有8个字的空间)

0x00004000

FIFO状态

15

SDIO_FLAG_RXFIFOHF

接收FIFO半满(FIFO至少已有8个字的存在)

0x00008000

16

SDIO_FLAG_TXFIFOF

发送FIFO满

0x00010000

17

SDIO_FLAG_RXFIFOF

接受FIFO满(硬件流控制:差2个字节->有效)

0x00020000

18

SDIO_FLAG_TXFIFOE

发送FIFO空(硬件流控制:仅2个字节->有效)

0x00040000

19

SDIO_FLAG_RXFIFOE

接收FIFO空

0x00080000

20

SDIO_FLAG_TXDAVL

在发送FIFO中的数据可用

0x00100000

数据状况

21

SDIO_FLAG_RXDAVL

在接收FIFO中的数据可用

0x00200000

22

SDIO_FLAG_SDIOIT

收到SDIO中断

0x00400000

 

23

SDIO_FLAG_CEATAEND

收到 CE-ATA命令 完成信号(For CMD61)

0x00800000

 

函数原型如下:

FlagStatus SDIO_GetFlagStatus(u32 SDIO_FLAG)

{

  FlagStatus bitstatus = RESET;

 

 

  assert_param(IS_SDIO_FLAG(SDIO_FLAG));

 

  if ((SDIO->STA & SDIO_FLAG) != (u32)RESET)

  {

    bitstatus = SET;

  }

  else

  {

    bitstatus = RESET;

  }

  return bitstatus;

}

 

函数输入参数SDIO_FLAG的值可以参考“【27】SDIO_GetFlagStatus”的取值,因为SDIO->ICR各位于SDIO->STA各位一一对应。

    但本函数设置的ICR的控制位,比STA的状态位,少了bit11-21位可操作的标志位。

下表给出了可以被清除SDIO_FLAG取值。

   Table.27-1 SDIO_FLAG取值

Bit

参数SDIO_FLAG

意义/SDIO->ICR.bit0-10 + bit22-23

#define

备注

0

SDIO_FLAG_CCRCFAIL

收到命令响应,但CRC验证失败

0x00000001

错误类

1

SDIO_FLAG_DCRCFAIL

传输数据响应,但CRC验证失败(发送/接收)

0x00000002

2

SDIO_FLAG_CTIMEOUT

命令响应超时

0x00000004

3

SDIO_FLAG_DTIMEOUT

数据传输超时

0x00000008

4

SDIO_FLAG_TXUNDERR

发送FIFO数据下溢错误

0x00000010

5

SDIO_FLAG_RXOVERR

接收FIFO数据上溢错误

0x00000020

6

SDIO_FLAG_CMDREND

已收到命令响应,且CRC验证成功

0x00000040

 

7

SDIO_FLAG_CMDSENT

命令已发送响应(但不需要CRC验证)

0x00000080

 

8

SDIO_FLAG_DATAEND

数据发送结束(SDIO->DCOUNT = 0)

0x00000100

 

9

SDIO_FLAG_STBITERR

有些数据线没有检测到起始位(宽总线模式)

0x00000200

错误类

10

SDIO_FLAG_DBCKEND

传输数据块结束,且CRC验证成功

0x00000400

 

11

不可清除状态位,在寄存器内表现为:该位段的数值,寄存器位“保留”状态

正在传输命令

0x00000800

保留

不可用

12

正在传输数据

0x00001000

13

正在接受数据

0x00002000

14

发送FIFO半空(FIFO至少还有8个字的空间)

0x00004000

15

接收FIFO半满(FIFO至少已有8个字的存在)

0x00008000

16

发送FIFO满

0x00010000

17

接受FIFO满(硬件流控制:差2个字节->有效)

0x00020000

18

发送FIFO空(硬件流控制:仅2个字节->有效)

0x00040000

19

接收FIFO空

0x00080000

20

在发送FIFO中的数据可用

0x00100000

21

在接收FIFO中的数据可用

0x00200000

22

SDIO_FLAG_SDIOIT

收到SDIO中断

0x00400000

 

23

SDIO_FLAG_CEATAEND

收到 CE-ATA命令 完成信号(For CMD61)

0x00800000

 

函数原型如下:

void SDIO_ClearFlag(u32 SDIO_FLAG)

{

 

  assert_param(IS_SDIO_CLEAR_FLAG(SDIO_FLAG));

  

  SDIO->ICR = SDIO_FLAG;//写1,清除标志位

}

 

本函数“【29】SDIO_GetITStatus”与“【27】SDIO_GetFlagStatus” 的本质意义是一样的:寄存器操作完全一样、操作值也完全一样。只不过名字换了一下。

   Table.7-1 SDIO可屏蔽的中断源取值(SDIO->MASK.bit0-23,共24种中断)如下:

Bit

参数SDIO_IT取值

意义/SDIO->MASK

#define

备注

0

SDIO_IT_CCRCFAIL

收到命令响应,但CRC验证失败

0x00000001

错误类

1

SDIO_IT_DCRCFAIL

传输数据响应,但CRC验证失败(发送/接收)

0x00000002

2

SDIO_IT_CTIMEOUT

命令响应超时

0x00000004

3

SDIO_IT_DTIMEOUT

数据传输超时

0x00000008

4

SDIO_IT_TXUNDERR

发送FIFO数据下溢错误

0x00000010

5

SDIO_IT_RXOVERR

接收FIFO数据上溢错误

0x00000020

6

SDIO_IT_CMDREND

已收到命令响应,且CRC验证成功

0x00000040

 

7

SDIO_IT_CMDSENT

命令已发送响应(但不需要CRC验证)

0x00000080

 

8

SDIO_IT_DATAEND

数据发送结束(SDIO->DCOUNT = 0)

0x00000100

 

9

SDIO_IT_STBITERR

有些数据线没有检测到起始位(宽总线模式)

0x00000200

错误类

10

SDIO_IT_DBCKEND

传输数据块结束,且CRC验证成功

0x00000400

 

11

SDIO_IT_CMDACT

正在传输命令

0x00000800

传输进行中

12

SDIO_IT_TXACT

正在传输数据

0x00001000

13

SDIO_IT_RXACT

正在接受数据

0x00002000

14

SDIO_IT_TXFIFOHE

发送FIFO半空(FIFO至少还有8个字的空间)

0x00004000

FIFO状态

15

SDIO_IT_RXFIFOHF

接收FIFO半满(FIFO至少已有8个字的存在)

0x00008000

16

SDIO_IT_TXFIFOF

发送FIFO满

0x00010000

17

SDIO_IT_RXFIFOF

接受FIFO满(硬件流控制:差2个字节->有效)

0x00020000

18

SDIO_IT_TXFIFOE

发送FIFO空(硬件流控制:仅2个字节->有效)

0x00040000

19

SDIO_IT_RXFIFOE

接收FIFO空

0x00080000

20

SDIO_IT_TXDAVL

在发送FIFO中的数据可用

0x00100000

数据状况

21

SDIO_IT_RXDAVL

在接收FIFO中的数据可用

0x00200000

22

SDIO_IT_SDIOIT

收到SDIO中断

0x00400000

 

23

SDIO_IT_CEATAEND

收到 CE-ATA命令 完成信号(For CMD61)

0x00800000

 

函数原型如下:

ITStatus SDIO_GetITStatus(u32 SDIO_IT)

{

  ITStatus bitstatus = RESET;

 

 

  assert_param(IS_SDIO_GET_IT(SDIO_IT));

 

  if ((SDIO->STA & SDIO_IT) != (u32)RESET) 

  {

    bitstatus = SET;

  }

  else

  {

    bitstatus = RESET;

  }

  return bitstatus;

}

 

本函数“【30】SDIO_ClearITPendingBit”与函数“【28】SDIO_ClearFlag”的本质意义是完全一样的,而且操作参数也完全一样。

   Table.27-1 SDIO_FLAG取值

Bit

参数SDIO_IT取值

意义/SDIO->ICR

#define

备注

0

SDIO_IT_CCRCFAIL

收到命令响应,但CRC验证失败

0x00000001

错误类

1

SDIO_IT_DCRCFAIL

传输数据响应,但CRC验证失败(发送/接收)

0x00000002

2

SDIO_IT_CTIMEOUT

命令响应超时

0x00000004

3

SDIO_IT_DTIMEOUT

数据传输超时

0x00000008

4

SDIO_IT_TXUNDERR

发送FIFO数据下溢错误

0x00000010

5

SDIO_IT_RXOVERR

接收FIFO数据上溢错误

0x00000020

6

SDIO_IT_CMDREND

已收到命令响应,且CRC验证成功

0x00000040

 

7

SDIO_IT_CMDSENT

命令已发送响应(但不需要CRC验证)

0x00000080

 

8

SDIO_IT_DATAEND

数据发送结束(SDIO->DCOUNT = 0)

0x00000100

 

9

SDIO_IT_STBITERR

有些数据线没有检测到起始位(宽总线模式)

0x00000200

错误类

10

SDIO_IT_DBCKEND

传输数据块结束,且CRC验证成功

0x00000400

 

11

不可清除状态位,在寄存器内表现为:该位段的数值,寄存器位“保留”状态

正在传输命令

0x00000800

保留

不可用

12

正在传输数据

0x00001000

13

正在接受数据

0x00002000

14

发送FIFO半空(FIFO至少还有8个字的空间)

0x00004000

15

接收FIFO半满(FIFO至少已有8个字的存在)

0x00008000

16

发送FIFO满

0x00010000

17

接受FIFO满(硬件流控制:差2个字节->有效)

0x00020000

18

发送FIFO空(硬件流控制:仅2个字节->有效)

0x00040000

19

接收FIFO空

0x00080000

20

在发送FIFO中的数据可用

0x00100000

21

在接收FIFO中的数据可用

0x00200000

22

SDIO_IT_SDIOIT

收到SDIO中断

0x00400000

 

23

SDIO_IT_CEATAEND

收到 CE-ATA命令 完成信号(For CMD61)

0x00800000

 

函数原型如下:

void SDIO_ClearITPendingBit(u32 SDIO_IT)

{

 

  assert_param(IS_SDIO_CLEAR_IT(SDIO_IT));

  

  SDIO->ICR = SDIO_IT;

}


  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值