本帖最后由 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,实在不晓得问题出在哪了,各位大神,求帮助!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
原子哥,我的问题解决了,但是还是有想不明白的地方,麻烦您再帮忙想想。我具体的解决步骤我说一下:
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 ,是有怎样的考虑。
谢谢原子哥!
一周热门 更多>