找回密码
 成为LPLD会员
查看: 3064|回复: 19

[固件库编程] OSKinetis V3固件库BUG反馈贴

[复制链接]

4

主题

218

帖子

1720

积分

超级版主

Rank: 8Rank: 8

积分
1720
发表于 2014-11-26 11:14:45 | 显示全部楼层 |阅读模式
本帖最后由 洋葱圈 于 2014-11-26 11:18 编辑

大家好,为了更加完善我们的OSKinetis V3固件库,我们希望各位开发者、使用者、学习者以及所有用户参与到OSKinetis固件库的维护中来,如果你在编程中遇到任何疑似固件库BUG的问题,都可以直接再本帖、或者本区发帖反馈。
你的参与能为所有使用OSKinetis固件库进行开发的朋友带来帮助,同时我们会再成功提交BUG反馈的用户中,抽取部分幸运者赠予Kinetis开发的相关书籍,希望大家积极参与。


【官方小道消息
我们将在近期更新固件库版本,兼容不带Z的K60芯片。。。
回复

使用道具 举报

0

主题

1

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2015-1-19 10:39:26 | 显示全部楼层
初始化SD卡的地方有个bug
在没插入SD卡时,循环体里的timeout的自增会因为前面的continue语句跳过,导致死循环


[C] 纯文本查看 复制代码
/*
 * LPLD_SDHC_InitCard
 * 初始化SDHC模块及SD卡,设置正常工作波特率为40MHz
 * 
 * 参数:
 *    无
 *
 * 输出:
 *    SDHCSTA_OK--状态正常
 *    SDHCSTA_NOINIT--驱动未初始化
 *    SDHCSTA_NODISK--为插入卡
 *    SDHCSTA_PROTECT--卡写保护
 */
SDHCSTATUS LPLD_SDHC_InitCard(void)
{
  uint32 param, c_size, c_size_mult, read_bl_len, time_out = 0;
  ESDHC_COMMAND_STRUCT command;
  SDHCSTATUS result;
  
  //分配SD卡信息结构体的数据空间并初始化
  sdcard_ptr = (SDCARD_STRUCT_PTR)malloc(sizeof(SDCARD_STRUCT));
  sdcard_ptr->CARD = ESDHC_CARD_NONE;
  sdcard_ptr->TIMEOUT = 0;
  sdcard_ptr->NUM_BLOCKS = 0;
  sdcard_ptr->ADDRESS = 0;
  sdcard_ptr->HC = FALSE;
  sdcard_ptr->VERSION2 = FALSE;
  sdcard_ptr->STATUS = SDHCSTA_OK;
   
  while(time_out < 1000)
  {
    
    //初始化SDHC模块并检测卡
    if (SDHCRES_OK != (result=LPLD_SDHC_IOC (IO_IOCTL_ESDHC_INIT, NULL)))
    {
      continue;
    }
    
    //SDHC检查
    param = 0;
    if (SDHCRES_OK != (result=LPLD_SDHC_IOC (IO_IOCTL_ESDHC_GET_CARD, ¶m)))
    {
      continue;
    }
    if ((ESDHC_CARD_SD == param) || (ESDHC_CARD_SDHC == param) || (ESDHC_CARD_SDCOMBO == param) || (ESDHC_CARD_SDHCCOMBO == param))
    {
      if ((ESDHC_CARD_SDHC == param) || (ESDHC_CARD_SDHCCOMBO == param))
      {
        sdcard_ptr->HC = TRUE;
        break;
      }
      else if(ESDHC_CARD_SD == param)
      {
        break;
      }
    }
    else
    {
      continue;
    }
    time_out++;
  }
  
  if(time_out >= 1000)
    return SDHCRES_NOTRDY;
  
  //卡识别
  command.COMMAND = ESDHC_CMD2;
  command.ARGUMENT = 0;
  command.BLOCKS = 0;
  if (SDHCRES_OK != (result=LPLD_SDHC_IOC (IO_IOCTL_ESDHC_SEND_COMMAND, &command)))
  {
    return result;
  }
  
  //获取卡地址
  command.COMMAND = ESDHC_CMD3;
  command.ARGUMENT = 0;
  command.BLOCKS = 0;
  if (SDHCRES_OK != (result=LPLD_SDHC_IOC (IO_IOCTL_ESDHC_SEND_COMMAND, &command)))
  {
    return result;
  }
  sdcard_ptr->ADDRESS = command.RESPONSE[0] & 0xFFFF0000;
  
  //获取卡参数
  command.COMMAND = ESDHC_CMD9;
  command.ARGUMENT = sdcard_ptr->ADDRESS;
  command.BLOCKS = 0;
  if (SDHCRES_OK != (result=LPLD_SDHC_IOC (IO_IOCTL_ESDHC_SEND_COMMAND, &command)))
  {
    return result;
  }
  if (0 == (command.RESPONSE[3] & 0x00C00000))
  {
    read_bl_len = (command.RESPONSE[2] >> 8) & 0x0F;
    c_size = command.RESPONSE[2] & 0x03;
    c_size = (c_size << 10) | (command.RESPONSE[1] >> 22);
    c_size_mult = (command.RESPONSE[1] >> 7) & 0x07;
    sdcard_ptr->NUM_BLOCKS = (c_size + 1) * (1 << (c_size_mult + 2)) * (1 << (read_bl_len - 9));
  }
  else
  {
    sdcard_ptr->VERSION2 = TRUE;
    c_size = (command.RESPONSE[1] >> 8) & 0x003FFFFF;
    sdcard_ptr->NUM_BLOCKS = (c_size + 1) << 10;
  }
  
  //设置正常工作波特率为40MHz
  //param = 40000000;    
  param = 25000000;      
  if (SDHCRES_OK != (result=LPLD_SDHC_IOC (IO_IOCTL_ESDHC_SET_BAUDRATE, ¶m)))
  {
    return result;
  }
  
  //选择卡
  command.COMMAND = ESDHC_CMD7;
  command.ARGUMENT = sdcard_ptr->ADDRESS;
  command.BLOCKS = 0;
  if (SDHCRES_OK != (result=LPLD_SDHC_IOC (IO_IOCTL_ESDHC_SEND_COMMAND, &command)))
  {
    return result;
  }
  
  //设置块大小为512字节
  command.COMMAND = ESDHC_CMD16;
  command.ARGUMENT = IO_SDCARD_BLOCK_SIZE;
  command.BLOCKS = 0;
  if (SDHCRES_OK != (result=LPLD_SDHC_IOC (IO_IOCTL_ESDHC_SEND_COMMAND, &command)))
  {
    return result;
  }
  
  if (ESDHC_BUS_WIDTH_4BIT == ESDHC_BUS_WIDTH_4BIT)
  {
    //特殊应用命令
    command.COMMAND = ESDHC_CMD55;
    command.ARGUMENT = sdcard_ptr->ADDRESS;
    command.BLOCKS = 0;
    if (SDHCRES_OK != (result=LPLD_SDHC_IOC (IO_IOCTL_ESDHC_SEND_COMMAND, &command)))
    {
      return result;
    }
    
    //设置总线宽度为4bit
    command.COMMAND = ESDHC_ACMD6;
    command.ARGUMENT = 2;
    command.BLOCKS = 0;
    if (SDHCRES_OK != (result=LPLD_SDHC_IOC (IO_IOCTL_ESDHC_SEND_COMMAND, &command)))
    {
      return result;
    }
    
    param = ESDHC_BUS_WIDTH_4BIT;
    if (SDHCRES_OK != (result=LPLD_SDHC_IOC (IO_IOCTL_ESDHC_SET_BUS_WIDTH, ¶m)))
    {
      return result;
    }
  }
  
  return SDHCRES_OK;
}

回复 支持 反对

使用道具 举报

4

主题

218

帖子

1720

积分

超级版主

Rank: 8Rank: 8

积分
1720
 楼主| 发表于 2015-1-19 10:54:32 | 显示全部楼层
dengxun 发表于 2015-1-19 10:39
初始化SD卡的地方有个bug
在没插入SD卡时,循环体里的timeout的自增会因为前面的continue语句跳过,导致死 ...

这个地方我会关注一下的,谢谢。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

23

积分

新手上路

Rank: 1

积分
23
发表于 2015-1-29 13:54:06 | 显示全部楼层
LPLD库不支持FX啊~ 好像现在好多人用FX…… 浮点运算能力强啊~ 还多一路FTM……
回复 支持 反对

使用道具 举报

0

主题

2

帖子

23

积分

新手上路

Rank: 1

积分
23
发表于 2015-1-30 08:46:41 | 显示全部楼层
kbt54654 发表于 2015-1-29 13:54
LPLD库不支持FX啊~ 好像现在好多人用FX…… 浮点运算能力强啊~ 还多一路FTM……

昨天改了一下午 发现改几个寄存器,再加上fx的.h文件就行了=_=
回复 支持 反对

使用道具 举报

2

主题

17

帖子

106

积分

注册会员

Rank: 2

积分
106
QQ
发表于 2015-1-30 21:41:28 | 显示全部楼层
kbt54654 发表于 2015-1-30 08:46
昨天改了一下午 发现改几个寄存器,再加上fx的.h文件就行了=_=

分享出来呗!
回复 支持 反对

使用道具 举报

4

主题

218

帖子

1720

积分

超级版主

Rank: 8Rank: 8

积分
1720
 楼主| 发表于 2015-1-31 16:59:55 | 显示全部楼层
kbt54654 发表于 2015-1-30 08:46
昨天改了一下午 发现改几个寄存器,再加上fx的.h文件就行了=_=

关注我们的GitHub,近期会更新支持MK60D10\F12\F15系列https://github.com/LPLDTeam/
回复 支持 反对

使用道具 举报

0

主题

1

帖子

21

积分

新手上路

Rank: 1

积分
21
发表于 2015-3-21 20:54:03 | 显示全部楼层
洋葱圈 发表于 2015-1-31 16:59
关注我们的GitHub,近期会更新支持MK60D10\F12\F15系列https://github.com/LPLDTeam/

开启iar的C-Runtime的时候编译会出错.....最近老是越界,以后能不能打印出进入HardFault中断的原因..

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?成为LPLD会员

x
回复 支持 反对

使用道具 举报

4

主题

218

帖子

1720

积分

超级版主

Rank: 8Rank: 8

积分
1720
 楼主| 发表于 2015-3-22 11:14:31 | 显示全部楼层
_痕迹 发表于 2015-3-21 20:54
开启iar的C-Runtime的时候编译会出错.....最近老是越界,以后能不能打印出进入HardFault中断的原因..

硬件错误中断的原因很多,代码无法判断。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

21

积分

新手上路

Rank: 1

积分
21
发表于 2015-3-27 11:27:50 | 显示全部楼层
PIT初始化问题
PIT_PeriodUs、PIT_PeriodMs、PIT_PeriodS至少一个初始化,但如果只初始化PIT_PeriodMs,调试时发现.PIT_PeriodUs是一个很大的数,定时间隔莫名变长,是不是应该都要初始化才保险?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 成为LPLD会员

本版积分规则

    Archiver|手机版|小黑屋|

GMT+8, 2017-6-26 08:07 , Processed in 0.115578 second(s), 22 queries .

© 2001-2011 Powered by Discuz! X3.1. Theme By Yeei!

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