-
MM32SPIN系列使用dma spi clk始终8位之间有一个时间间隔 sos
我使用MM32SPIN27PF 使用dma与硬件spi进行开发 初始化代码如下: RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //SPI2 clk enable RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); //SPI_NSS GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_0); //SPI_SCK GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_0); //SPI_MISO GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_0); //SPI_MOSI GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_0); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure); SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_DataWidth = SPI_DataWidth_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; // SPI_InitStructure.SPI_NSS = SPI_NSS_Hard; SPI_InitStructure.SPI_BaudRatePrescaler = spi_baud_div; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB; SPI_Init(SPIx, &SPI_InitStructure); SPI_Cmd(SPIx, ENABLE); SPIM_TXEn(SPIx); SPIM_RXEn(SPIx); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //ʹÄÜDMA´«Êä //spi1 rx channel 2 DMA_DeInit(DMA1_Channel2); //½«DMAµÄͨµÀ2¼Ä´æÆ÷ÖØÉèΪȱʡֵ DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) & (SPI1->RXREG); //DMAÍâÉèADC»ùµØÖ· DMA_InitStructure.DMA_MemoryBaseAddr = rx; //DMAÄÚ´æ»ùµØÖ· DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC ; //Êý¾Ý´«Êä·½Ïò£¬´ÓÄÚ´æ¶ÁÈ¡·¢Ë͵½ÍâÉè DMA_InitStructure.DMA_BufferSize = rxbuffSize; //DMAͨµÀµÄDMA»º´æµÄ´óС DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //ÍâÉèµØÖ·¼Ä´æÆ÷²»±ä DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //ÄÚ´æµØÖ·¼Ä´æÆ÷µÝÔö DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; //Êý¾Ý¿í¶ÈΪ8λDMA_PeripheralDataSize_Byte DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; //Êý¾Ý¿í¶ÈΪ8λDMA_MemoryDataSize_Byte DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //¹¤×÷ÔÚÕý³£»º´æģʽ DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; //DMAͨµÀ xÓµÓÐÖÐÓÅÏȼ¶ DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMAͨµÀxûÓÐÉèÖÃΪÄÚ´æµ½ÄÚ´æ´«Êä DMA_Init(DMA1_Channel2, &DMA_InitStructure); //¸ù¾ÝDMA_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯DMAµÄͨµÀUSART1_Tx_DMA_ChannelËù±êʶµÄ¼Ä´æÆ÷ //spi1 tx channel 3 DMA_DeInit(DMA1_Channel3); //spi1 tx channel 3 DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) & (SPI1->TXREG); //UART2_DMA_TX????J??? DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)tx; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//?????memory?????? DMA_InitStructure.DMA_BufferSize = txbuffSize;//SPI1_DMA_TX??????? 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_VeryHigh; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel3, &DMA_InitStructure);//SPI1 tX?DMA???3 SPI_DMACmd(SPI1,SPI_DMAReq_EN,ENABLE); 请问有人遇到过这种情况吗? 请问这是芯片设计导致的正常情况吗?
3044浏览量 0回复量 关注量 -
灵动微MM32F103串口空闲中断怎么设置?
最近用MM32F103RET6跑UCOSII,功能实现了,但是串口用的例程里的,不知道怎么设置串口空闲中断方式接收数据,网上有人说用DMA+串口实现固定长度的数据接收。请教一下大家都是怎么接收数据的?我想一帧一帧的接收处理。
4590浏览量 2回复量 关注量 -
i2sextx基地址问题
最近在使用at32f403a系列单片机做i2s全双工通讯,使用DMA接收时需设置外设地址i2sext2,手册上没找到介绍,请技术人员给与解答
3796浏览量 1回复量 关注量 -
MM32通过DMA传输到蓝牙,再传输到手机的数据丢失的问题
请问我想用MM32向蓝牙模块HC05传输数据,然后用手机接受,但是传输的数据丢包,并且只传输第一位数据(类似HCO5:1111111111),用的DMA传输到蓝牙, t = KEY_Scan(0); //get key value if( t == KEY3_PRES ) { sprintf((char*)sendbuf,"12345678 %d\r\n",sendcnt); printf("%s",sendbuf);//显示发送数据 u2_printf("2346789abcdefgh %d\r\n",sendcnt); //发送到蓝牙模块 sendcnt++; if(sendcnt>99)sendcnt=0; t=0; LED2_ON(); DELAY_Ms(100); LED2_OFF(); } (主循环里的), void u2_printf(char* fmt,...) { va_list ap; va_start(ap,fmt); vsprintf((char*)USART3_TX_BUF,fmt,ap); va_end(ap); while(DMA_GetCurrDataCounter(DMA1_Channel2)!=0); //等待通道2传输完成 UART_DMA_Enable(DMA1_Channel2,strlen((const char*)USART3_TX_BUF)); //通过dma发送出去 } 这是传输函数
6999浏览量 2回复量 关注量 -
GD32F130F4P6替换STM32F030F4P6 sos
我用STM32F030F4P6的程序直接烧录到GD32F130F4P6,代码都不需要修改,基本功能都能用,FLASH读写也没问题,串口也能收发,唯独就是ADC+DMA读取不到数据,各位有谁做过吗,希望能指导一下,感激不尽
1912浏览量 0回复量 关注量 -
请问华大的FAE为什么F460的I2S读数据总是0
[i=s] 本帖最后由 wenleileilei 于 2021-4-25 18:23 编辑 [/i] 用的PA12,参考了ddl里的i2s_record_wm8731_exck_dma例程,但改成了内部时钟输出,现在就是读wm8974总是0,示波器测量所有管脚波形都正常,单独控制PA12输出或者读取电平状态也正常,不论在主函数里循环读还是在接收中断里读或者在DMA里自动读,永远都是0。I2S写倒是正常,如果同时读写I2S,读出来的数据就是写进去的数据,好奇怪,有知道原因的高手吗?
2719浏览量 5回复量 关注量 -
我问一下GD32F405RGT6对应的DMA映射表能发我一下吗 sos
我问一下GD32F405RGT6对应的DMA映射表能发我一下吗,手机号15600595231(微信号),qq邮箱:[email]1654473463@qq.com[/email]
2200浏览量 0回复量 关注量 -
gd32f103rct spi0从机 DMA发送异常
gd32f103rct spi0从机 DMA发送一包数据的时候,有个别字节的最高位本来是1的,发送出来是0。 MISO没加上拉电阻。
1672浏览量 2回复量 关注量 -
GD32使用DMA发送问题 sos
[i=s] 本帖最后由 tyw 于 2021-3-8 14:02 编辑 [/i] [font=Consolas, "][color=#000000][backcolor=white]void u3_printf(char* fmt,...) { va_list ap; va_start(ap,fmt); vsprintf((char*)USART3_TX_BUF,fmt,ap); va_end(ap); dma_channel_disable(DMA0,DMA_CH1); dma_memory_address_config(DMA0,DMA_CH1,(uint32_t)USART3_TX_BUF); dma_transfer_number_config(DMA0,DMA_CH1,strlen((const char*)USART3_TX_BUF)); dma_channel_enable(DMA0,DMA_CH1); usart_dma_transmit_config(USART2, USART_DENT_ENABLE);//使能串口DMA发送 while(RESET == dma_flag_get(DMA0, DMA_CH1, DMA_FLAG_FTF)){}; /* wait DMA Channel transfer complete */ memset(USART3_TX_BUF,0,USART3_MAX_SEND_LEN); } [/backcolor][/color][/font] 如上代码:第一次发送正常,第二次发送,对端只能收到相应长度的空字符怀疑是第二次发送的时候没有从首地址开始发送,同样代码stm32是正常的
1626浏览量 0回复量 关注量 -
AT32F403A 使用ADC时候出的问题。
使用ADC 双模式时,程序卡在判断CAL 控制位为零的循环中,在使用ADC双模式时,由于硬件不会清除CAL控制位,可能导致程序会卡在ADC校准函数 while(ADC_GetCalibrationStatus(ADC1)); 我没有双使用ADC,还事卡住。 #define Channel_Num 2 #define Sample_Num 1 u16 ADC_ConvertedValue[Sample_Num][Channel_Num]; void ADC_DMA_Config(void) { DMA_InitTypeDef DMA_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR; DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = Sample_Num*Channel_Num; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址不变 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//内存地址递增 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); //DMA_Cmd(DMA1_Channel1,ENABLE); DMA_ClearITPendingBit(DMA1_IT_TC1);//清除DMA通道x中断待处理标志位 DMA_ITConfig(DMA1_Channel1,DMA_IT_TC, ENABLE); } //ADC配置函数 void ADC_Configuration(void) { u16 i; ADC_InitTypeDef ADC_InitStructure; RCC_ADCCLKConfig(RCC_PCLK2_Div6); //第二步:设置分频因子 ADC最大速率14M 72/6=12M ADC_DeInit(ADC1); //将外设 ADC1 的全部寄存器重设为默认值 //配置ADC1 ADC_InitStructure.ADC_Mode=ADC_Mode_Independent; //独立模式 ADC_InitStructure.ADC_ScanConvMode=ENABLE; //扫描 ADC_InitStructure.ADC_ContinuousConvMode=ENABLE; //ADC_InitStructure.ADC_ContinuousConvMode=DISABLE; ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//无外部触发,即软件触发 ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel=Channel_Num;//规则转换通道数量 ADC_Init(ADC1,&ADC_InitStructure); //ADC1通道采样配置,使用规则通道1-3 //测试使用中断方式读数据,采样周期不能太小.实际使用时考虑加DMA处理 ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_41Cycles5);//ADC8配置为通道1,周期239.5+12.5 ADC_RegularChannelConfig(ADC1,ADC_Channel_3,2,ADC_SampleTime_41Cycles5);//ADC8配置为通道1,周期239.5+12.5 //初始化AD缓冲 for(i=0;i<4;i++) { AD_value[i]=0; } //使能ADC1的DMA模式 ADC_DMACmd(ADC1,ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1,ENABLE); DELAY_1ms();//14*ADCCLK ADC_ExternalTrigConvCmd(ADC1, DISABLE); //禁止外部出发ADC转换 //清除ADC1校准值 ADC_ResetCalibration(ADC1); //等待清除完成 while(ADC_GetResetCalibrationStatus(ADC1)); //开始ADC1校准 ADC_StartCalibration(ADC1); //等待校准完成 //while(ADC_GetCalibrationStatus(ADC1)); DELAY_10ms(); DELAY_10ms(); DMA_Cmd(DMA1_Channel1,ENABLE); //开始ADC1转换 ADC_SoftwareStartConvCmd(ADC1,ENABLE); // ADC_ClearFlag(ADC1,ADC_FLAG_EOC);//清除中断标志 // ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);//使能中断 }
2170浏览量 2回复量 关注量 -
从存储器到外设还是从存储器到存储器?
想实现一块RAM到FSMC的DMA传输,DMA传输请求由TIM8_TRIG触发,那FSMC是外设还是存储器,我该选择DMA_InitStructure.DMA_DIR是从存储器到外设还是从存储器到存储器?
1005浏览量 19回复量 关注量 -
有没有使用GD32单片机的,使用DMA遇到问题
问题是这样的:我使用GD32E23芯片,M0+内核,用GD的库函数,在使用USART和SPI的DMA方式传输数据时,每次数据传输完成都必须初始化DMA,否则无法完成下一次传输。但是初始化是很耗费时间的,就不能想ST那样直接清标志位实现下一次传输吗?搜索 [align=left]复制[/align]
2302浏览量 4回复量 关注量