完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
I2S 时钟管脚配置
GPIO_InitTypeDef GPIO_InitStructure; I2S_InitTypeDef I2S_InitStructure; // NVIC_InitTypeDef NVIC_InitStructure; RCC_I2SCLKConfig (RCC_I2S2CLKSource_PLLI2S); /* Enable the CODEC_I2S peripheral clock */ RCC_APB1PeriphClockCmd(CODEC_I2S_CLK, ENABLE); //ʹÄÜI2SµÄʱÖÓ!! RCC_AHB1PeriphClockCmd(CODEC_I2S_GPIO_CLOCK, ENABLE); /* CODEC_I2S_2 pins configuration: WS, SCK and SD pins -----------------------------*/ GPIO_InitStructure.GPIO_Pin = CODEC_I2S_2_WS_PIN | CODEC_I2S_2_SCK_PIN | CODEC_I2S_2_SD_PIN | CODEC_I2S_2_ext_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(CODEC_I2S_2_GPIO, GPIO_InitStructure); /* Connect pins to I2S peripheral */ GPIO_PinAFConfig(CODEC_I2S_2_GPIO, CODEC_I2S_2_WS_PINSRC, CODEC_I2S_2_GPIO_AF); GPIO_PinAFConfig(CODEC_I2S_2_GPIO, CODEC_I2S_2_SCK_PINSRC, CODEC_I2S_2_GPIO_AF); GPIO_PinAFConfig(CODEC_I2S_2_GPIO, CODEC_I2S_2_SD_PINSRC, CODEC_I2S_2_GPIO_AF); GPIO_PinAFConfig(CODEC_I2S_2_GPIO, CODEC_I2S_2_ext_PINSRC, CODEC_I2S_2_GPIO_AF); //Ö÷ʱÖÓ! /* CODEC_I2S pins configuration: MCK pin */ GPIO_InitStructure.GPIO_Pin = CODEC_I2S_2_MCK_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(CODEC_I2S_2_MCK_GPIO, GPIO_InitStructure); GPIO_PinAFConfig(CODEC_I2S_2_MCK_GPIO, CODEC_I2S_2_MCK_PINSRC, CODEC_I2S_2_GPIO_AF); DMA配置 void I2S2ext_RX_DMA_Init(u8* buf0,u8 *buf1,u16 num) { NVIC_InitTypeDef NVIC_InitStructure; DMA_InitTypeDef DMA_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1ʱÖÓʹÄÜ //DMA_Cmd(DMA1_Stream3, DISABLE); DMA_DeInit(DMA1_Stream3); while (DMA_GetCmdStatus(DMA1_Stream3) != DISABLE){}//µÈ´ýDMA1_Stream3¿ÉÅäÖà SPI_I2S_DMACmd(I2S2ext, SPI_I2S_DMAReq_Rx, ENABLE); DMA_ClearITPendingBit(DMA1_Stream3,DMA_IT_FEIF3|DMA_IT_DMEIF3|DMA_IT_TEIF3|DMA_IT_HTIF3|DMA_IT_TCIF3);//Çå¿ÕDMA1_Stream3ÉÏËùÓÐÖжϱêÖ¾ /* ÅäÖà DMA Stream */ DMA_InitStructure.DMA_Channel = DMA_Channel_3; DMA_InitStructure.DMA_PeripheralBaseAddr = (u32) I2S2ext->DR; DMA_InitStructure.DMA_Memory0BaseAddr = (u32)buf0; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; DMA_InitStructure.DMA_BufferSize = num;//Êý¾Ý´«ÊäÁ¿ DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA1_Stream3, DMA_InitStructure); DMA_DoubleBufferModeConfig(DMA1_Stream3,(u32)buf1,DMA_Memory_0); DMA_DoubleBufferModeCmd(DMA1_Stream3,ENABLE); DMA_ITConfig(DMA1_Stream3,DMA_IT_TC,ENABLE); NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0x00; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init( NVIC_InitStructure);//ÅäÖà } 中断服务函数 void DMA1_Stream3_IRQHandler(void) { int i=0; if(DMA_GetITStatus(DMA1_Stream3,DMA_IT_TCIF3)==SET) //DMA1_Stream3,´«ÊäÍê³É±êÖ¾ { DMA_ClearITPendingBit(DMA1_Stream3,DMA_IT_TCIF3); //Çå³ý´«ÊäÍê³ÉÖÐ¶Ï for(i=0;i<=1024;i++) { printf("PI %d rn",*(p1+i));//¸üÐÂÏÔʾÄÚÈÝ } //i2s_rx_callback(); //Ö´Ðлص÷º¯Êý,¶ÁÈ¡Êý¾ÝµÈ²Ù×÷ÔÚÕâÀïÃæ´¦Àí } } void I2S_Rec_Start(void) { DMA_Cmd(DMA1_Stream3,ENABLE);//¿ªÆôDMA TX´«Êä,¿ªÊ¼Â¼Òô } 主程序 my_I2S2ext_Init(I2S_Standard_Phillips,I2S_Mode_SlaveRx,I2S_CPOL_Low,I2S_DataFormat_32b); I2S2ext_RX_DMA_Init(p1,p2,(2*1024)); I2S_Rec_Start(); 程序是从原子的历程移植的 为何DMA的中断不能进不去,调了一上午,请各位大神帮忙看一下,不胜感激 |
|
相关推荐
1个回答
|
|
STM32F4 I2S DMA中断进不去的原因可能有以下几点:
1. 中断使能:确保已经使能了I2S和DMA的中断。在初始化I2S和DMA时,需要设置相应的中断使能位。 2. 中断优先级配置:检查NVIC的中断优先级配置是否正确。如果中断优先级设置不当,可能会导致中断无法进入。 3. DMA配置:确保DMA的配置正确,包括通道选择、内存地址、外设地址、数据宽度、传输方向等。 4. I2S配置:检查I2S的配置是否正确,包括音频采样率、数据宽度、时钟配置等。 5. 中断服务函数:确保已经正确实现了I2S和DMA的中断服务函数,并且在中断服务函数中正确处理了中断事件。 6. GPIO配置:检查I2S时钟管脚的GPIO配置是否正确。如果时钟管脚配置错误,可能会影响I2S的正常工作。 7. 硬件连接:检查I2S和外设之间的硬件连接是否正确,包括数据线、时钟线、地线等。 8. 外设复位:在初始化I2S和DMA之前,可以尝试对它们进行复位,以确保它们处于已知的状态。 9. 时钟源配置:确保时钟源配置正确,如您提供的代码中,使用了PLLI2S作为I2S的时钟源。 10. 调试:使用调试工具(如ST-LINK)逐步跟踪程序执行,观察中断是否被触发,以及中断服务函数是否被调用。 请检查以上可能的原因,并根据实际情况进行调整。如果问题仍然存在,请提供更详细的代码和描述,以便进一步分析。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1618 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1545 浏览 1 评论
979 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1597 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
645浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
516浏览 3评论
532浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
505浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 13:31 , Processed in 0.670448 second(s), Total 50, Slave 43 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号