OpenEdv-开源电子网

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

STM32F429在UCOSIII下移植录音机实验,程序在SAI_Disable函数死循环

[复制链接]

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2014-4-14
在线时间
31 小时
发表于 2018-4-3 21:54:54 | 显示全部楼层 |阅读模式
4金钱
本帖最后由 san兄弟 于 2018-4-3 22:00 编辑

买的STM32F429核心板,自己做的母板,在UCOSIII下移植录音机实验,在移植了相关C文件和H文件后,在初始化部分执行[mw_shl_code=c,true]WM8978_Init();                                    //初始化WM8978
        WM8978_HPvol_Set(40,40);            //耳机音量设置
        WM8978_SPKvol_Set(50);                    //喇叭音量设置[/mw_shl_code]

在系统启动后,在一个线程内调用recoder_enter_rec_mode()函数进入录音状态,结果指示灯不闪烁,线程卡死,其他线程正常。
[mw_shl_code=c,true]//led0任务函数
void led0_task(void *p_arg)
{
        OS_ERR err;
        p_arg = p_arg;
        LED0 = 0;
        LED1 = 0;
        recoder_enter_rec_mode();        //进入录音模式,此时耳机可以听到咪头采集到的音频
        while(1)
        {
                LED0=~LED0;
//                LED1=~LED1;
                OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); //延时500ms
        }
}[/mw_shl_code]

如果将recoder_enter_rec_mode()函数放在start_task中创建任务之前则所有任务不执行。通过单步仿真发现问题出在SAIA_Init函数中的HAL_SAI_DeInit子函数,一路追踪到SAI_Disable(hsai)函数中的如下代码段:
[mw_shl_code=c,true]while((hsai->Instance->CR1 & SAI_xCR1_SAIEN) != RESET)
  {
    /* Check for the Timeout */
    if((HAL_GetTick() - tickstart ) > SAI_TIMEOUT_VALUE)
    {         
      /* Update error code */
      hsai->ErrorCode |= HAL_SAI_ERROR_TIMEOUT;
      
      status = HAL_TIMEOUT;
      
      /* Change the SAI state */
      HAL_SAI_ErrorCallback(hsai);
    }
  }[/mw_shl_code]

程序在这个while中死循环。HAL_GetTick() 的返回值一直没变,也就是systick中断函数SysTick_Handler不响应,uwTick++;没有执行,通过查看寄存器SysTick->CTRL一直为0x00010007,实在不晓得问题出在哪了,各位大神,求帮助!


最佳答案

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

原子哥,我的问题解决了,但是还是有想不明白的地方,麻烦您再帮忙想想。我具体的解决步骤我说一下: 1. 首次移植是采用的STM32F429 阿波罗开发板LWIP例程和教程中的例程网络实验9 NETCONN_UDP实验(UCOSIII版本),移植"实验46 录音机实验"中的相关代码,结果在SAI_Disable(hsai)函数出现死循环; 2. 根据您的提示是否与OS有关,我采用了“网络实验4 RAW_UDP实验”移植"实验46 录音机实验"中的相关代码,结果依然死循环; 3. ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2014-4-14
在线时间
31 小时
 楼主| 发表于 2018-4-3 21:54:55 | 显示全部楼层
本帖最后由 san兄弟 于 2018-4-5 21:50 编辑
正点原子 发表于 2018-4-5 01:49
你是说在我们板子上,同样的代码,就正常
到你的板子就不正常了吗?

原子哥,我的问题解决了,但是还是有想不明白的地方,麻烦您再帮忙想想。我具体的解决步骤我说一下:
1. 首次移植是采用的STM32F429 阿波罗开发板LWIP例程和教程中的例程网络实验9 NETCONN_UDP实验(UCOSIII版本),移植"实验46 录音机实验"中的相关代码,结果在SAI_Disable(hsai)函数出现死循环;
2. 根据您的提示是否与OS有关,我采用了“网络实验4 RAW_UDP实验”移植"实验46 录音机实验"中的相关代码,结果依然死循环;
3. 采用“实验1 跑马灯实验”从头开始移植"实验46 录音机实验",没问题,之后再将“网络实验4 RAW_UDP实验”中LWIP相关代码移植到这个工程中,没问题了
4. 将步骤2 和步骤3中移植之后的代码采用BCompare软件对比,发现问题出现在malloc.h中内部SRAM的大小参数#define MEM1_MAX_SIZE中,以前的例程中该参数均为160K,在最新的LWIP例程中都改成了100K(注释还是160K),我把之前移植的几个工程(步骤1和2中的)中该参数改为160K后都可以正常运行了。
5. 目前想不明白为什么SRAM管理空间大小和这个死循环相关,为什么会导致systick无法中断;另外为什么最新的LWIP例程(步骤1中链接里的)改成了100K ,是有怎样的考虑。

谢谢原子哥!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-4-4 00:39:53 | 显示全部楼层
不用OS的时候,正常么?
回复

使用道具 举报

7

主题

17

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2017-8-9
在线时间
18 小时
发表于 2018-4-4 08:12:57 | 显示全部楼层
SysTick_Handler不响应,你看一下时钟配置正不正常
回复

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2014-4-14
在线时间
31 小时
 楼主| 发表于 2018-4-4 09:01:03 来自手机 | 显示全部楼层
大力水手吃菠菜 发表于 2018-4-4 08:12
SysTick_Handler不响应,你看一下时钟配置正不正常

时钟配置是直接移植的,对照手册大概看了,应该是没问题的。核心板是买的,所以时钟方面用原子的程序肯定没问题。
回复

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2014-4-14
在线时间
31 小时
 楼主| 发表于 2018-4-4 09:04:26 来自手机 | 显示全部楼层
正点原子 发表于 2018-4-4 00:39
不用OS的时候,正常么?

没试不用OS的情况,因为要用到udp所以是在您的UCOSIII的lwip那个例程下改的,录音部分驱动是从不带OS的录音机实验程序移植的。和UCOSIII有关?
回复

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2014-4-14
在线时间
31 小时
 楼主| 发表于 2018-4-4 09:26:09 来自手机 | 显示全部楼层
正点原子 发表于 2018-4-4 00:39
不用OS的时候,正常么?

录音机程序和UCOSIII的lwip程序在开发板上都正常,移植之后到我自己母板上我udp没问题,自己的液晶按键也没问题,就是加录音的时候不正常了,我只调用了初始化wm8978和进入录音状态的子函数。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-4-5 01:49:32 | 显示全部楼层
san兄弟 发表于 2018-4-4 09:26
录音机程序和UCOSIII的lwip程序在开发板上都正常,移植之后到我自己母板上我udp没问题,自己的液晶按键也 ...

你是说在我们板子上,同样的代码,就正常
到你的板子就不正常了吗?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2014-4-14
在线时间
31 小时
 楼主| 发表于 2018-4-5 14:23:42 | 显示全部楼层
正点原子 发表于 2018-4-5 01:49
你是说在我们板子上,同样的代码,就正常
到你的板子就不正常了吗?

不是,我的意思是不管在你们的板子上还是我自己的板子上,单独运行录音机程序没问题,单独运行UCOSIII的UDP程序也没问题,和在一起有问题。昨晚在你们的429开发板上重新用NETCONN_UDP实验(UCOSIII版本)移植了一遍录音机程序,还是有同样的问题。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-4-7 02:26:31 | 显示全部楼层
san兄弟 发表于 2018-4-3 21:54
原子哥,我的问题解决了,但是还是有想不明白的地方,麻烦您再帮忙想想。我具体的解决步骤我说一下:
1. ...

估计是内存不够,可能内存申请的时候出错了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2014-4-14
在线时间
31 小时
 楼主| 发表于 2018-4-22 22:59:25 来自手机 | 显示全部楼层
正点原子 发表于 2018-4-7 02:26
估计是内存不够,可能内存申请的时候出错了。

出差半月回来原子哥已经给设置最佳答案了,我处理晚了哈
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-7 13:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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