OpenEdv-开源电子网

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

求助!把USMART加进工程,程序就会卡死在挂载SD卡函数上

[复制链接]

61

主题

350

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1411
金钱
1411
注册时间
2021-4-28
在线时间
527 小时
发表于 2021-10-18 11:48:24 | 显示全部楼层 |阅读模式
1金钱
把USMART加进工程,不调用(不用,主函数也不添加)也会导致程序卡死,但把USAMART移除程序就能正常跑了!

测试.zip

3.3 MB, 下载次数: 15

最佳答案

查看完整内容[请看2#楼]

解决方案 oid delay_init(uint16_t sysclk) { HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8); /* SYSTICK使用内核时钟源8分频,因systick的计数器最大值只有2^24 */ g_fac_us = sysclk / 8; /* 不论是否使用OS,g_fac_us都需要使用,作为1us的基础时基 */ } void delay_us(uint32_t nus) { uint32_t temp; SysTick->LOAD = nus * g_fac_us; /* ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

61

主题

350

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1411
金钱
1411
注册时间
2021-4-28
在线时间
527 小时
 楼主| 发表于 2021-10-18 11:48:25 | 显示全部楼层
解决方案
oid delay_init(uint16_t sysclk)
{

    HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);   /* SYSTICK使用内核时钟源8分频,因systick的计数器最大值只有2^24 */

    g_fac_us = sysclk / 8;                                      /* 不论是否使用OS,g_fac_us都需要使用,作为1us的基础时基 */
}

void delay_us(uint32_t nus)
{
    uint32_t temp;
    SysTick->LOAD = nus * g_fac_us; /* 时间加载 */
    SysTick->VAL = 0x00;            /* 清空计数器 */
    SysTick->CTRL |= 1 << 0 ;       /* 开始倒数 */

    do
    {
        temp = SysTick->CTRL;
    } while ((temp & 0x01) && !(temp & (1 << 16))); /* CTRL.ENABLE位必须为1, 并等待时间到达 */

    SysTick->CTRL &= ~(1 << 0) ;    /* 关闭SYSTICK */
    SysTick->VAL = 0X00;            /* 清空计数器 */
}

/**
* @brief       延时nms
* @param       nms: 要延时的ms数 (0< nms <= 65535)
* @retval      无
*/
void delay_ms(uint16_t nms)
{
    uint32_t repeat = nms / 1000;   /*  这里用1000,是考虑到可能有超频应用,
                                     *  比如128Mhz的时候, delay_us最大只能延时1048576us左右了
                                     */
    uint32_t remain = nms % 1000;

    while (repeat)
    {
        delay_us(1000 * 1000);      /* 利用delay_us 实现 1000ms 延时 */
        repeat--;
    }

    if (remain)
    {
        delay_us(remain * 1000);    /* 利用delay_us, 把尾数延时(remain ms)给做了 */
    }
}


替换为
void delay_init(u8 SYSCLK)
{
    HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);//SysTick频率为HCLK
        fac_us=SYSCLK;                                                //不论是否使用OS,fac_us都需要使用
}
//延时nus
//nus为要延时的us数.       
//nus:0~190887435(最大值即2^32/fac_us@fac_us=22.5)
void delay_us(u32 nus)
{               
        u32 ticks;
        u32 told,tnow,tcnt=0;
        u32 reload=SysTick->LOAD;                                //LOAD的值                     
        ticks=nus*fac_us;                                                 //需要的节拍数
        told=SysTick->VAL;                                        //刚进入时的计数器值
        while(1)
        {
                tnow=SysTick->VAL;
                if(tnow!=told)
                {            
                        if(tnow<told)tcnt+=told-tnow;        //这里注意一下SYSTICK是一个递减的计数器就可以了.
                        else tcnt+=reload-tnow+told;            
                        told=tnow;
                        if(tcnt>=ticks)break;                        //时间超过/等于要延迟的时间,则退出.
                }  
        };
}

//延时nms
//nms:要延时的ms数
void delay_ms(u16 nms)
{
        u32 i;
        for(i=0;i<nms;i++) delay_us(1000);
}
   
/**
  * @brief HAL库内部函数用到的延时
           HAL库的延时默认用Systick,如果我们没有开Systick的中断会导致调用这个延时后无法退出
  * @param Delay 要延时的毫秒数
  * @retval None
  */
void HAL_Delay(uint32_t Delay)
{
     delay_ms(Delay);                                                                         //这个必须要加上去否则程序还是会卡死
}

为什么这样换可以  但我还是不清楚
回复

使用道具 举报

61

主题

350

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1411
金钱
1411
注册时间
2021-4-28
在线时间
527 小时
 楼主| 发表于 2021-10-18 11:49:13 | 显示全部楼层
精英F103测试
回复

使用道具 举报

6

主题

890

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1481
金钱
1481
注册时间
2020-8-19
在线时间
336 小时
发表于 2021-10-19 09:54:49 | 显示全部楼层
帮顶   
回复

使用道具 举报

9

主题

251

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1368
金钱
1368
注册时间
2014-11-25
在线时间
185 小时
发表于 2021-10-19 16:15:47 | 显示全部楼层
可能是c脚本里有其他编码的东西
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13118
金钱
13118
注册时间
2012-11-26
在线时间
3813 小时
发表于 2021-10-19 17:21:23 | 显示全部楼层
debug下死在哪个位置了   
回复

使用道具 举报

61

主题

350

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1411
金钱
1411
注册时间
2021-4-28
在线时间
527 小时
 楼主| 发表于 2021-10-19 20:08:12 | 显示全部楼层
jermy_z 发表于 2021-10-19 17:21
debug下死在哪个位置了

卡死在         f_mount(fs[0],"0:",1);         这个函数中
回复

使用道具 举报

61

主题

350

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1411
金钱
1411
注册时间
2021-4-28
在线时间
527 小时
 楼主| 发表于 2021-10-19 20:08:41 | 显示全部楼层
CJC529 发表于 2021-10-19 20:08
卡死在         f_mount(fs[0],"0:",1);         这个函数中

这个是挂载SD卡
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2021-10-20 00:03:22 | 显示全部楼层
内存不够?跟踪进去这个函数,看看死在那里?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

61

主题

350

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1411
金钱
1411
注册时间
2021-4-28
在线时间
527 小时
 楼主| 发表于 2021-10-21 16:20:47 | 显示全部楼层
正点原子 发表于 2021-10-20 00:03
内存不够?跟踪进去这个函数,看看死在那里?

    do
    {
        temp = SysTick->CTRL;
    } while ((temp & 0x01) && !(temp & (1 << 16))); /* CTRL.ENABLE位必须为1, 并等待时间到达 */

在这里出不去了
回复

使用道具 举报

61

主题

350

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1411
金钱
1411
注册时间
2021-4-28
在线时间
527 小时
 楼主| 发表于 2021-10-21 20:58:00 | 显示全部楼层
正点原子 发表于 2021-10-20 00:03
内存不够?跟踪进去这个函数,看看死在那里?

原子哥,请问内存不足是什么原因造成的呀
回复

使用道具 举报

61

主题

350

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1411
金钱
1411
注册时间
2021-4-28
在线时间
527 小时
 楼主| 发表于 2021-10-21 23:00:47 | 显示全部楼层
顶!!!求助
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2021-10-22 01:14:42 | 显示全部楼层
CJC529 发表于 2021-10-21 20:58
原子哥,请问内存不足是什么原因造成的呀

就是说单片机内存不够了,申请内存的时候失败了。但是你得具体仿真跟踪,以确认问题是不是内存不够的bug?
看返回值。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

61

主题

350

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1411
金钱
1411
注册时间
2021-4-28
在线时间
527 小时
 楼主| 发表于 2021-10-23 21:16:36 | 显示全部楼层
不是内存不足  看了map也不大呀
回复

使用道具 举报

61

主题

350

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1411
金钱
1411
注册时间
2021-4-28
在线时间
527 小时
 楼主| 发表于 2021-10-23 21:17:07 | 显示全部楼层
usamart 也能正常使用  就是程序 会卡死在f_mount上 为什么啊
回复

使用道具 举报

61

主题

350

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1411
金钱
1411
注册时间
2021-4-28
在线时间
527 小时
 楼主| 发表于 2021-10-23 21:57:45 | 显示全部楼层
正点原子 发表于 2021-10-22 01:14
就是说单片机内存不够了,申请内存的时候失败了。但是你得具体仿真跟踪,以确认问题是不是内存不够的bug ...

原子哥,我通过修改#define SDMMC_DATATIMEOUT                  ((uint32_t)0xFFFFFFFFU)
的值可以让程序不卡死  但是SD卡初始化会失败  测试了许多值 要不是程序卡死,就是 程序SD卡初始化失败
回复

使用道具 举报

61

主题

350

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1411
金钱
1411
注册时间
2021-4-28
在线时间
527 小时
 楼主| 发表于 2021-10-26 23:35:58 | 显示全部楼层
jermy_z 发表于 2021-10-19 17:21
debug下死在哪个位置了


程序卡在
    do
    {
        temp = SysTick->CTRL;
    } while ((temp & 0x01) && !(temp & (1 << 16))); /* CTRL.ENABLE位必须为1, 并等待时间到达 */
这个while循环了
把延时函数改了就能正常跑了
但我不知道为什么会卡这
回复

使用道具 举报

1

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2021-10-19
在线时间
38 小时
发表于 2021-11-4 15:37:35 | 显示全部楼层
我也遇到类似问题了,还有这个 f_mount(fs[0],"0:",1); 用了这后,关闭文件后,要怎么 unmount呢?或者打开文件要使用f_open等,还需要另外注册一个工作区吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 10:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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