OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1877|回复: 3

精英F1板的实验38图片显示实验的DMA模式为什么用不了?

[复制链接]

10

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2019-8-1
在线时间
27 小时
发表于 2019-8-1 22:39:50 | 显示全部楼层 |阅读模式
1金钱
/初始化SD卡
//返回值:错误代码;(0,无错误)
SD_Error SD_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
  GPIO_InitTypeDef  GPIO_InitStructure;

u8 clkdiv=0;
SD_Error errorstatus=SD_OK;  
  
//SDIO IO口初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,ENABLE);//使能PORTC,PORTD时钟

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_SDIO|RCC_AHBPeriph_DMA2,ENABLE);//使能SDIO,DMA2时钟  
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12; //PC.8~12 复用输出
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //IO口速度为50MHz
  GPIO_Init(GPIOC, &GPIO_InitStructure);      //根据设定参数初始化PC.8~12

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PD2 复用输出
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //IO口速度为50MHz
  GPIO_Init(GPIOD, &GPIO_InitStructure);      //根据设定参数初始化PD2
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //PD7 上拉输入
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;    //复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //IO口速度为50MHz
  GPIO_Init(GPIOD, &GPIO_InitStructure);      //根据设定参数初始化PD7

  //SDIO外设寄存器设置为默认值           
SDIO_DeInit();

NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn;   //SDIO中断配置
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;     //子优先级0
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        //使能外部中断通道
  NVIC_Init(&NVIC_InitStructure);     //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
  errorstatus=SD_PowerON();   //SD卡上电
  if(errorstatus==SD_OK)
  errorstatus=SD_InitializeCards();   //初始化SD卡

  if(errorstatus==SD_OK)
  errorstatus=SD_GetCardInfo(&SDCardInfo); //获取卡信息

  if(errorstatus==SD_OK)
  errorstatus=SD_SelectDeselect((u32)(SDCardInfo.RCA<<16));//选中SD卡

  if(errorstatus==SD_OK)
  errorstatus=SD_EnableWideBusOperation(1); //4位宽度,如果是MMC卡,则不能用4位模式

  if((errorstatus==SD_OK)||(SDIO_MULTIMEDIA_CARD==CardType))
{        
  if(SDCardInfo.CardType==SDIO_STD_CAPACITY_SD_CARD_V1_1||SDCardInfo.CardType==SDIO_STD_CAPACITY_SD_CARD_V2_0)
  {
   clkdiv=SDIO_TRANSFER_CLK_DIV+6; //V1.1/V2.0卡,设置最高72/12=6Mhz
  }else clkdiv=SDIO_TRANSFER_CLK_DIV; //SDHC等其他卡,设置最高72/6=12Mhz
  SDIO_Clock_Set(clkdiv);    //设置时钟频率,SDIO时钟计算公式:SDIO_CK时钟=SDIOCLK/[clkdiv+2];其中,SDIOCLK固定为48Mhz
  errorstatus=SD_SetDeviceMode(SD_DMA_MODE); //设置为DMA模式
  //errorstatus=SD_SetDeviceMode(SD_POLLING_MODE); //设置为查询模式

  }
return errorstatus;   
}

是不是只要把黄色的两行代码选一个就是其功能,我改为DMA模式后就卡死在主程序的这句代码。//---  f_mount(fs[0],"0:",1);   //挂载SD卡 --//,
是原子哥的代码写的有问题???

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-8-2 01:57:50 | 显示全部楼层
建议用查询模式,DMA模式你试试寄存器版本的是否可以用。
回复

使用道具 举报

10

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2019-8-1
在线时间
27 小时
 楼主| 发表于 2019-8-2 09:04:58 | 显示全部楼层
正点原子 发表于 2019-8-2 01:57
建议用查询模式,DMA模式你试试寄存器版本的是否可以用。

我试下
回复

使用道具 举报

10

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2019-8-1
在线时间
27 小时
 楼主| 发表于 2019-8-4 18:04:06 | 显示全部楼层
正点原子 发表于 2019-8-2 01:57
建议用查询模式,DMA模式你试试寄存器版本的是否可以用。

寄存器可以使用,但是显示图片的速度还和一前一样慢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-1 02:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表