64位LINUX X86关于DMA API的一些问题, 求高手不吝赐教,急急急!

pSendDmaPool = dma_pool_create("DmaPool",pci_dev->dev), (size_t)(512 * 64*1024+1024), (size_t)(64*1024), (size_t)0);

pDmaBuf = (unsigned char*)dma_pool_alloc(pSendDmaPool, GFP_KERNEL, &dma_handle);

我的平台是64位X86,我执行完dma_pool_create后,再执行dma_pool_alloc,就崩溃了,然后打印信息是:
------------[ cut here ]------------
WARNING: at mm/page_alloc.c:2139 __alloc_pages_nodemask+0x7a8/0x8d0() (Not tainted)
Hardware name: All Series
Modules linked in: fh130drv(U) ebtable_nat ebtables ipt_MASQUERADE iptable_nat nf_nat xt_CHECKSUM iptable_mangle bridge autofs4 8021q garp stp llc cpufreq_ondemand acpi_cpufreq freq_table mperf ipt_REJECT nf_conntrack_ipv4 nf_defrag_ipv4 iptable_filter ip_tables ip6t_REJECT nf_conntrack_ipv6 nf_defrag_ipv6 xt_state nf_conntrack ip6table_filter ip6_tables ipv6 vhost_net macvtap macvlan tun kvm uinput ppdev iTCO_wdt iTCO_vendor_support microcode parport_pc parport r8169 mii sg serio_raw lpc_ich mfd_core i2c_i801 shpchp snd_hda_codec_realtek snd_hda_codec_hdmi snd_hda_intel snd_hda_codec snd_hwdep snd_seq snd_seq_device snd_pcm snd_timer snd soundcore snd_page_alloc ext4 jbd2 mbcache sd_mod crc_t10dif ahci xhci_hcd i915 drm_kms_helper drm i2c_algo_bit i2c_core video output dm_mirror dm_region_hash dm_log dm_mod [last unloaded: scsi_wait_scan]
Pid: 3725, comm: fh130demo Not tainted 2.6.32-504.el6.x86_64 #1
Call Trace:
[] ? warn_slowpath_common+0x87/0xc0
[] ? warn_slowpath_null+0x1a/0x20
[] ? __alloc_pages_nodemask+0x7a8/0x8d0
[] ? atomic_notifier_call_chain+0x1a/0x20
[] ? notify_update+0x2e/0x30
[] ? vt_console_print+0x260/0x330
[] ? up+0x2f/0x50
[] ? _call_console_drivers+0x4a/0x80
[] ? dma_generic_alloc_coherent+0xa6/0x160
[] ? apic_timer_interrupt+0xe/0x20
[] ? x86_swiotlb_alloc_coherent+0x31/0x70
[] ? dma_pool_alloc+0xfc/0x2a0
[] ? printk+0x41/0x44
[] ? hbaDevAllocDmaBuffers+0x2f6/0x8f0 [fh130drv]
[] ? hbaDevInitialize+0x168/0x1b0 [fh130drv]
[] ? Hba_FC_ASM_LoadConfig+0x54/0xa0 [fh130drv]
[] ? hba_dev_ioctl+0x1e2/0xbd0 [fh130drv]
[] ? avc_has_perm+0x71/0x90
[] ? pty_write+0x73/0x80
[] ? inode_has_perm+0x54/0xa0
[] ? remove_wait_queue+0x3c/0x50
[] ? __wake_up+0x53/0x70
[] ? vfs_ioctl+0x22/0xa0
[] ? do_vfs_ioctl+0x84/0x580
[] ? sys_ioctl+0x81/0xa0
[] ? __audit_syscall_exit+0x25e/0x290
[] ? system_call_fastpath+0x16/0x1b
---[ end trace 03df1cd6b697aafa ]---

求高手解答这个是怎么回事?
然后我想问一下,我可以分配
512 * 64*1024+1024这么大的DMA内存吗?并且对齐方式是64*1024?
然后我alloc的时候,每一块是多大呢?

谢谢了,没有金币了,不好意思!

1个回答

unsigned char*)dma_pool_alloc(pSendDmaPool, GFP_KERNEL, &dma_handle);
我的平台是64位X86,我执行完dma_pool_create后,再执行dma_pool_alloc,就崩溃了,然后打印信息是:
------------[ cut here ]------------
WARNING: at mm/page_alloc.c:2139 __alloc_pages_nodemask+0x7a8/0x8d0() (Not tainted)
Hardware name: All Series
Modules linked in: fh130drv(U) ebtable_nat ebtables ipt_MASQUERADE iptable_nat nf_nat xt_CHECKSUM iptable_mangle bridge autofs4 8021q garp stp llc cpufreq_ondemand acpi_cpufreq freq_table mperf ipt_REJECT nf_conntrack_ipv4 nf_defrag_ipv4 iptable_filter ip_tables ip6t_REJECT nf_conntrack_ipv6 nf_defrag_ipv6 xt_state nf_conntrack ip6table_filter ip6_tables ipv6 vhost_net macvtap macvlan tun kvm uinput ppdev iTCO_wdt iTCO_vendor_support microcode parport_pc parport r8169 mii sg serio_raw lpc_ich mfd_core i2c_i801 shpchp snd_hda_codec_realtek snd_hda_codec_hdmi snd_hda_intel snd_hda_codec snd_hwdep snd_seq snd_seq_device snd_pcm snd_timer snd soundcore snd_page_alloc ext4 jbd2 mbcache sd_mod crc_t10dif ahci xhci_hcd i915 drm_kms_helper drm i2c_algo_bit i2c_core video output dm_mirror dm_region_hash dm_log dm_mod [last unloaded: scsi_wait_scan]
Pid: 3725, comm: fh130demo Not tainted 2.6.32-504.el6.x86_64 #1
Call Trace:

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
ARM+Linux DMA API使用
最近项目接手一个项目:为了加快LCD液晶刷新高清图片的速率,采用DMA将显存中的数据传输给液晶模块,各位大神有没有做过这方面的项目。
关于pcie dma传输的问题
小弟最近在做pcie dma传输的程序,现在碰到一个很奇怪的问题。程序要实现对dma传输 12m的数据。程序轮训传输12m数据,但程序传输了几次12m数据后,dma传输函数会返回ApiDmaInProgress dma。 程序: int Dma(PLX_DEVICE_OBJECT *pDevice, char *pUserBuffer, int UserBufferLen, int wr_addr) { U8 DmaChannel; U16 ChannelInput; PLX_STATUS rc; PLX_DMA_PROP DmaProp; PLX_DMA_PARAMS DmaParams; PLX_PHYSICAL_MEM PciBuffer; int count = 0; int len = 0; int cpld_idea = 0; int data_value = 0; int dma_count = 0; int retry_times = 0; int ret = 0; char *buffer = NULL; int j = 0; int offset = 0; ChannelInput = 0; DmaChannel = (U8)ChannelInput; buffer = (char *)malloc(4096); if(buffer == NULL) { Cons_printf("xbuffer malloc memory err\n"); return ERR_MALLOC_MEM_ERR; } count = UserBufferLen / 4096; offset = UserBufferLen % 4096; // Get DMA buffer parameters //ret = Read_Cpld_Idea(pDevice, &cpld_idea); rc = PlxPci_DeviceReset(pDevice); if (rc != ApiSuccess) { Cons_printf("*ERROR* - API failed to reset\n"); ret = ERR_OPEN_DMA_FAIL; } //cpld_idea = 0; //ret = Read_Cpld_Idea(pDevice, &cpld_idea); rc = PlxPci_CommonBufferProperties(pDevice,&PciBuffer); if (rc != ApiSuccess) { Cons_printf("*ERROR* - API failed\n"); ret = ERR_OPEN_DMA_FAIL; } // Clear DMA structure memset(&DmaProp, 0, sizeof(PLX_DMA_PROP)); // Initialize the DMA channel DmaProp.LocalBusWidth = 3; // 32-bit DmaProp.ReadyInput = 1; DmaProp.ConstAddrLocal = 1; rc =PlxPci_DmaChannelOpen(pDevice,DmaChannel,&DmaProp); if (rc != ApiSuccess) { Cons_printf("*ERROR* - API failed\n"); ret = ERR_OPEN_DMA_FAIL; } // Clear DMA data for(j = 0; j < count + 1; j++) { Delay_Us(50); if(j == count) { len = offset; } else { len = 4096; } memset(buffer, 0, 4096); memcpy(buffer, pUserBuffer + j * 4096, 4096); memset(&DmaParams, 0, sizeof(PLX_DMA_PARAMS)); // Clear DMA data memset(&DmaParams, 0, sizeof(PLX_DMA_PARAMS)); DmaParams.UserVa = (PLX_UINT_PTR)buffer; DmaParams.LocalAddr = wr_addr; DmaParams.ByteCount = len; DmaParams.Direction = PLX_DMA_PCI_TO_LOC; // Specify a timeout to let API perform wait //ASCIIToHex(buffer, len); rc =PlxPci_DmaTransferUserBuffer(pDevice,DmaChannel,&DmaParams,0); while(1) { do { rc = PlxPci_DmaStatus(pDevice, 0); retry_times++; } while (rc == ApiDmaInProgress && retry_times <= 1000000); switch (rc) { case ApiDmaDone: //Cons_printf("Ok (DMA ApiDmaDone)\n"); ret = 0; break; case ApiDmaInProgress: Cons_printf("*ERROR* -DMA ApiDmaInProgress\n"); ret = ERR_DMA_ALWAYS_INPROGESS; goto FAIL; default: Cons_printf("*ERROR* - API failed\n"); ret = ERR_DMA_OTHER_ERR; goto FAIL ; } break; } ret = Read_Dma_Count(pDevice, &dma_count); if(ret) { Cons_printf("Read_Dma_Count\n"); goto FAIL; } //cpld_idea = 0; //ret = Read_Cpld_Idea(pDevice, &cpld_idea); ret = Read_Dma_To_Fpga_Data(pDevice, &data_value); if(ret) { Cons_printf("Read_Dma_Count\n"); goto FAIL; } } if(UserBufferLen != dma_count) { Cons_printf("UserBufferLen = %d, count = %d\n", UserBufferLen, dma_count); ret = ERR_DMA_TRANSLATE_ERR; goto FAIL; } FAIL: // Close DMA Channel //Cons_printf(" Close DMA Channel.............. "); rc =PlxPci_DmaChannelClose(pDevice,DmaChannel); if (rc != ApiSuccess) { Cons_printf("*ERROR* - API failed\n"); PlxPci_DeviceReset(pDevice); ret = ERR_CLOSE_DMA_FAIL; } PlxPci_DmaChannelClose(pDevice,DmaChannel); free(buffer); return ret; }
关于pc机dma传输的问题
大神能不能帮我解答一下,现在要做一个pci通信,用的是9030,没有dma控制器,想用pc机上的南桥上的dma主动发起传输,这样实现可能吗?
Linux环境下PCI设备DMA方式实现(plx9054)
最近在开发plx9054的驱动时,使用到DMA方式,根据手册描述,对相关寄存器进行配置后,DMA缓冲区 并没有从PCI设备上取到数据,是怎么回事?
STM32 SPI2使用DMA接收,DMA接收完成后不进DMA中断???
//Configuration SPI2 of CCPU2MCU RCC_AHB1PeriphClockCmd(PROTOCOL_SPI_PORT_CLK,ENABLE); //使能GPIO B口的时钟 RCC_APB1PeriphClockCmd(PROTOCOL_SPI_CLK, ENABLE); //使能SPI2 时钟 GPIO_PinAFConfig(PROTOCOL_SPI_CS_PORT, PROTOCOL_SPI_CS_PIN_SRC, GPIO_AF_SPI2); GPIO_PinAFConfig(PROTOCOL_SPI_SCK_PORT, PROTOCOL_SPI_SCK_PIN_SRC, GPIO_AF_SPI2); GPIO_PinAFConfig(PROTOCOL_SPI_MISO_PORT, PROTOCOL_SPI_MISO_PIN_SRC, GPIO_AF_SPI2); GPIO_PinAFConfig(PROTOCOL_SPI_MOSI_PORT, PROTOCOL_SPI_MOSI_PIN_SRC, GPIO_AF_SPI2); GPIO_InitStructure.GPIO_Pin = PROTOCOL_SPI_CS_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(PROTOCOL_SPI_CS_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = PROTOCOL_SPI_SCK_PIN; GPIO_Init(PROTOCOL_SPI_SCK_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = PROTOCOL_SPI_MOSI_PIN; GPIO_Init(PROTOCOL_SPI_MOSI_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Pin = PROTOCOL_SPI_MISO_PIN; GPIO_Init(PROTOCOL_SPI_MISO_PORT, &GPIO_InitStructure); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Slave; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Hard; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 0x07; SPI_Init(SPI2, &SPI_InitStructure); SPI_Cmd(SPI2, ENABLE); // Configuration DMA1 DMA_InitTypeDef DMA_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE); DMA_DeInit(DMA1_Stream3); //SPI2 Rx DMA_InitStructure.DMA_Channel = DMA_Channel_0; DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&(SPI2->DR)); DMA_InitStructure.DMA_Memory0BaseAddr = (u32)(&USART_RX_DMA_Buf[0]); DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; DMA_InitStructure.DMA_BufferSize = 16384+6; //32768+6; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA1_Stream3, &DMA_InitStructure); SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE); DMA_ClearITPendingBit(DMA1_Stream3,DMA_IT_TCIF3); DMA_ITConfig(DMA1_Stream3,DMA_IT_TC,ENABLE); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannel = ENABLE; NVIC_Init(&NVIC_InitStructure); DMA_Cmd(DMA1_Stream3, ENABLE); // DMA Interrupt void DMA1_Stream3_IRQHandler(void) { unsigned int len; len = 0; if(DMA_GetITStatus(DMA1_Stream3, DMA_IT_TCIF3) != RESET) { DMA_ClearITPendingBit(DMA1_Stream3,DMA_IT_TCIF3); DMA_Cmd(DMA1_Stream3,DISABLE); spiRxFlag = 1; DMA_SetCurrDataCounter(DMA1_Stream3, 16384+6); DMA_Cmd(DMA1_Stream3, ENABLE); } }
coherent DMA mask is unset.unable to allocate contiguous DMA memory region of size 4096
求教各位大神,在linux系统中进行DMA通信的时候,运行程序显示,cma size 不够大,但是在设备树中和内核config文件中进行了相关设置依旧不行 请教大神们,设置方法 ![图片说明](https://img-ask.csdn.net/upload/201911/14/1573727587_498058.png) ![图片说明](https://img-ask.csdn.net/upload/201911/14/1573727594_997615.png) ![图片说明](https://img-ask.csdn.net/upload/201911/14/1573727605_526139.png) ![图片说明](https://img-ask.csdn.net/upload/201911/14/1573727612_976621.png) 参考的例程是: [AXI-DMAlinux下的运行](https://blog.csdn.net/long_fly/article/details/80482248 "")
stm32f407 DMA接收、发送问题
进行串口收发时,可以发送数据,但是DMA无法读取数据,配置看了好几遍,不知道哪里出现了问题,特意贴个代码,希望大家帮忙看看 #include "stm32f4xx.h" #include "myconst.h" #include "myfunction.h" #include <stdio.h> #include "eeprom.h" extern uint8_t uploaddata[10]; extern uint8_t usart1_dma_received[55]; extern uint8_t usart1_dma_flag; //Óë´«¸ÐÐÅÏ¢°åͨÐŵĴ®¿Ú£ºPA9---TX; PA10---RX //½ÓÊÕ´«¸Ð°å·¢À´µÄ59¸ö×Ö½Ú£º3A+A3+±ÚÕÏ2¸ö×Ö½Ú+µçÁ¿2¸ö×Ö½Ú+¹ßµ¼12¸ö×Ö½Ú+GPS39¸ö×Ö½Ú+Éî¶È2¸ö×Ö½Ú //Ïò´«¸Ð°å·¢ËÍË®ÖÊÐÅÏ¢£º10¸ö×Ö½Ú£ºA4+phÖµ2¸ö×Ö½Ú+µçµ¼ÂÊ3¸ö×Ö½Ú+ζÈ2¸ö×Ö½Ú+0A+0D; void USART1_Configuration(void) { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; DMA_InitTypeDef DMA_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_Init(USART1, &USART_InitStructure); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); USART_ClearFlag(USART1, USART_FLAG_TC); USART_Cmd(USART1, ENABLE); /*DMA·¢ËÍÅäÖÃ*/ DMA_DeInit(DMA2_Stream7); DMA_StructInit( &DMA_InitStructure); DMA_InitStructure.DMA_Channel = DMA_Channel_4; DMA_InitStructure.DMA_PeripheralBaseAddr =USART1_DR_Base; DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)0; DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; DMA_InitStructure.DMA_BufferSize = 8; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA2_Stream7, &DMA_InitStructure); DMA_ITConfig(DMA2_Stream7, DMA_IT_TC, ENABLE); USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE); DMA_ClearITPendingBit(DMA2_Stream7, DMA_IT_TCIF7); /*DMA ½ÓÊÕÊý¾ÝÉèÖÃ*/ DMA_DeInit(DMA2_Stream5); DMA_StructInit(&DMA_InitStructure); DMA_InitStructure.DMA_Channel = DMA_Channel_4; //Ñ¡ÔñChannel_5 DMA_InitStructure.DMA_PeripheralBaseAddr =USART1_DR_Base; //Êý¾Ý´«ÊäµÄÍâÉèÊ×µØÖ·£¬Ïê½â¼ûÉÏ DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)(&usart1_dma_received[0]); //×Ô¼º¶¨Òå´ý·¢ËÍÊý×éµÄÊ×µØÖ·£¬ÒªÇ¿ÖÆת»»Îª32λ DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; //Êý¾Ý´«Êä·½ÏòÑ¡ÔñΪÄÚ´æ<-ÍâÉè DMA_InitStructure.DMA_BufferSize =8; //´«ÊäÊý¾Ý´óСΪ8£¬µ¥Î»ÓÉÒÔÏÂÈ·¶¨£¬´óСҪÅäºÏ¶¨ÒåµÄÊý×éÀàÐͺÍÍâÉèÊý¾ÝÀàÐÍ DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //ÍâÉèµØÖ·¼Ä´æÆ÷×Ô¶¯Ôö¼Ó½ûÖ¹£¬ÒòΪÕâÀïÖ»Óõ½ÁËDRÊý¾Ý¼Ä´æÆ÷ DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //ÄÚ´æµØÖ·×ÔÔöÔÊÐí£¬ÒòΪҪ¶ÁÈ¡Ò»¸öÊý×é DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //ÍâÉèµÄÊý¾Ý´óС£¬ÒòΪUSART6_DRÊý¾Ý¼Ä´æÆ÷Ϊ8Ϊ£¬¹ÊÑ¡Byte DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //ÕâÀïҲѡByte DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //DMA´«ÊäģʽΪNormal£¬Èç¹ûΪCircular,½«»áÑ­»·´«Êä DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; //ÓÅÏȼ¶ÎªHigh DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA2_Stream5, &DMA_InitStructure); //DMA_ITConfig(DMA2_Stream5, DMA_IT_TC, ENABLE); DMA_ClearITPendingBit(DMA2_Stream5, DMA_IT_TCIF5); USART_DMACmd(USART1,USART_DMAReq_Rx, ENABLE); DMA_Cmd(DMA2_Stream5, ENABLE); } /*dma ½ÓÊÕÖжÏ*/ void DMA2_Stream5_IRQHandler(void) { if (DMA_GetITStatus(DMA2_Stream5, DMA_IT_TCIF5) != RESET) { DMA_Cmd(DMA2_Stream5, DISABLE); DMA_ClearITPendingBit(DMA2_Stream5, DMA_IT_TCIF5); USART_DMACmd(USART1, USART_DMAReq_Rx, DISABLE); usart1_dma_flag=1; } } //USART1 DMA ·¢ËÍÖÐ¶Ï void DMA2_Stream7_IRQHandler(void) { if (DMA_GetITStatus(DMA2_Stream7, DMA_IT_TCIF7) != RESET) //·¢ËÍÍê³É { DMA_ClearITPendingBit(DMA2_Stream7, DMA_IT_TCIF7); USART_DMACmd(USART1, USART_DMAReq_Tx, DISABLE); DMA_Cmd(DMA2_Stream7, DISABLE); } } void UASRT1_DMA_Senddata(u32 par,u16 ndtr) { DMA_Cmd(DMA2_Stream7, DISABLE); DMA2_Stream7->M0AR = (uint32_t)(par); DMA2_Stream7->NDTR = ndtr; DMA_Cmd(DMA2_Stream7, ENABLE); USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE); } void USART1_IRQHandler(void) { if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //ÅжÏΪ½ÓÊÕÖÐ¶Ï { // uint8_t Received; // float angle_temp=0; // Received = USART_ReceiveData(USART1); // USART_SendData(USART1,Received); // usart1_dma_flag=1; USART_ClearITPendingBit(USART1,USART_IT_RXNE); } } int main(void) { while(1) if(usart1_dma_flag==1)//Êý¾Ý½ÓÊÜ { //......... DMA_Cmd(DMA2_Stream5, ENABLE); USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE); } } void NVIC_Config() { NVIC_InitTypeDef NVIC_InitStructure; /* Enable the USARTx Interrupt */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); ////// NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); ////// NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); ////// NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //ǶÌ×ÓÅÏȼ¶·Ö×éΪ 1 NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream5_IRQn; //ǶÌ×ͨµÀΪDMA2_Stream7_IRQn NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //ÇÀÕ¼ÓÅÏȼ¶Îª 1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //ÏìÓ¦ÓÅÏȼ¶Îª 0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //ͨµÀÖжÏʹÄÜ NVIC_Init(&NVIC_InitStructure); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //ǶÌ×ÓÅÏȼ¶·Ö×éΪ 1 NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream7_IRQn; //ǶÌ×ͨµÀΪDMA2_Stream7_IRQn NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //ÇÀÕ¼ÓÅÏȼ¶Îª 1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4; //ÏìÓ¦ÓÅÏȼ¶Îª 0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //ͨµÀÖжÏʹÄÜ NVIC_Init(&NVIC_InitStructure); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); ////// NVIC_InitStructure.NVIC_IRQChannel = USART6_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 5; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //ǶÌ×ÓÅÏȼ¶·Ö×éΪ 1 NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream1_IRQn; //ǶÌ×ͨµÀΪDMA2_Stream7_IRQn NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //ÇÀÕ¼ÓÅÏȼ¶Îª 1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 6; //ÏìÓ¦ÓÅÏȼ¶Îª 0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //ͨµÀÖжÏʹÄÜ NVIC_Init(&NVIC_InitStructure); // // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); // ÇÀռʽÓÅÏȼ¶±ð // NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;//Ö¸¶¨ÖжÏÔ´ // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 7;// Ö¸¶¨ÏìÓ¦ÓÅÏȼ¶±ð1 // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // NVIC_Init(&NVIC_InitStructure); // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); // ÇÀռʽÓÅÏȼ¶±ð NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_TIM10_IRQn;//Ö¸¶¨ÖжÏÔ´ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 7;// Ö¸¶¨ÏìÓ¦ÓÅÏȼ¶±ð1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); // ÇÀռʽÓÅÏȼ¶±ð NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }
求大神们能告诉我用DMA来ADC采集会是全自动的吗
DMA是什么东西? DMA可以自动触发ADC然后把结果自动传到指定位置吗 还是只是一个内存(包括外设)到内存的传输?
DMA通道是什么,请大神赐教
请教大神: DMA中的通道 是什么意思,一直不理解,请赐教,感激涕零!
ZC706的DMA驱动是如何打开的?
本来想通过open函数打开DMA驱动, 发现文件系统的/dev/目录下并没有xilinx dma 驱动节点, 请问一下究竟是要怎么操作才能打开呢?谢谢~
stm32adc配置问题应用到adc+dma+tim+usart
我将adc配置后读出的数一直为0,怀疑是否adc没有运作。下面是我写的程序,请大神们帮我指点一下,看看哪出了问题。 **********************************************************************************/ #include "adc.h" vu16 AD_Value[N][M]; //用来存放ADC转换结果,也是DMA的目标地址 vu16 After_filter[M]; //用来存放求平均值之后的结果 u16 AD_Data_Ram[N]; u16 Get_RF_Data[N]; extern u16 RF_ADC1_Value_Count[ADRF_Arr_Count]; extern u16 V_ADC1_Value[ADRF_Arr_Count]; //存储采集电池电压缓存 /* * 函数名:ADC1_GPIO_Config * 描述 :使能ADC1和DMA1的时钟,初始化PC.01 * 输入 : 无 * 输出 :无 * 调用 :内部调用 */ static void ADC1_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; /* Enable ADC1 and GPIOC clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOB, ENABLE); /*PB0-RF_AD输入 PB1-电压检测输入*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOB, &GPIO_InitStructure); } /* 函数名:ADC1_Mode_Config * 描述 :配置ADC1的工作模式为DMA模式 * 输入 : 无 * 输出 :无 * 调用 :内部调用 */ static void ADC1_Mode_Config(void) { ADC_InitTypeDef ADC_InitStructure; // ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular); /* ADC1 configuration */ ADC_DeInit(ADC1); //复位ADC ADC_StructInit(&ADC_InitStructure); //初始化ADC结构体 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立ADC模式 ADC_InitStructure.ADC_ScanConvMode = ENABLE; //扫描模式用于多通道采集 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //ENABLE 开启连续转换模式,即不停地进行ADC转换 ADC_InitStructure.ADC_ExternalTrigConv =ADC_ExternalTrigConv_None; //ADC_ExternalTrigConv_T2_CC2;//外部触发设置为TIM2 //(ADC_ExternalTrigConv_None; //不使用外部触发转换 (ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO; )//使用外部中断线11作为转换外部触发 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //采集数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = M; //要转换的通道数目2 ADC_Init(ADC1, &ADC_InitStructure); /*配置ADC时钟,为PCLK2的8分频,即9MHz*/ RCC_ADCCLKConfig(RCC_PCLK2_Div8); /*配置ADC1的通道8为55.5个采样周期,序列为1 */ /*配置ADC1的通道9为55.5个采样周期,序列为2 */ // ADC_SampleTime_55Cycles5 ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_7Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 2, ADC_SampleTime_7Cycles5); // ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_239Cycles5); // ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 2, ADC_SampleTime_239Cycles5); /* Enable ADC1 external trigger */ // ADC_ExternalTrigConvCmd(ADC1, ENABLE); /* Enable ADC1 DMA */ ADC_DMACmd(ADC1, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /*复位校准寄存器 */ ADC_ResetCalibration(ADC1); /*等待校准寄存器复位完成 */ while(ADC_GetResetCalibrationStatus(ADC1)); /* ADC校准 */ ADC_StartCalibration(ADC1); /* 等待校准完成*/ while(ADC_GetCalibrationStatus(ADC1)); /* 由于没有采用外部触发,所以使用软件触发ADC转换 */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); // DMA_Cmd(DMA1_Channel1, ENABLE);//使能DMA } void DMA_AD_Init(void) { DMA_InitTypeDef DMA_InitStructure; /* Enable DMA clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); /* DMA channel1 configuration */ DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //ADC地址 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&AD_Value;//内存地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //内存作为数据传输的目的地 DMA_InitStructure.DMA_BufferSize = N*M; //DMA通道的DMA缓存的大小 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通道拥有高优先级 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道没有设置为内存到内存传输 DMA_Init(DMA1_Channel1, &DMA_InitStructure); //开启DMA传输完成中断 // DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE); // DMA_ClearITPendingBit(DMA_IT_TC); //清除一次DMA中断标志 DMA_Cmd(DMA1_Channel1, ENABLE); //Enable DMA channel1 } /* * 函数名:ADC1_Init * 描述 :无 * 输入 :无 * 输出 :无 * 调用 :外部调用 */ void ADC1_Init(void) { ADC1_GPIO_Config(); DMA_AD_Init(); ADC1_Mode_Config(); }
关于DMA到存储器发送数据速率的一道题。。。
一台计算机包括一个CPU和一台I/O设备D,通过一条共享总线连接到主存储器M,数据总线的宽度为1个字。CPU每秒最多可执行106条指令,平均每条指令需要5个机器周期,其中3个周期需要使用存储器总线。存储器读/写操作使用1个机器周期。假设CPU正在连续不断地执行后台程序,并且需要保证95%的指令执行速度,但没有任何I/O指令。假设1个处理器周期等于1个总线周期,现在要在M和D之间传送大块数据。 a.若使用程序控制I/O,I/O每传送1个字需要CPU执行两条指令。请估计通过D的I/O数据传送的最大可能速度。 b.如果使用DMA传送,请估计传送速度。 答案:a.处理器只能分配5%的时间给I/O.所以最大的I/O指令传送速度是10e6×0.05=50000条指令/秒。因此I/O的传送速率是25000字/秒。 b.使用DMA控制时,可用的机器周期下的数量是 10e6(0.05×5+0.95×2)=2.15×10e6 如果我们假设DMA模块可以使用所有这些周期,并且忽略任何设置和状态检查时间,那么这个值就是最大的I/O传输速率。 我很是不明白b的答案是怎么得到的...
请问:其它外设是否使用DMA?
我能够理解IDE硬盘使用DMA的方式,我也知道使用DMA需要主板、操作系统和硬盘的三者配合。从相关资料来看,很多外设或单片机内部也使用DMA。 但我无法理解:1、除了IDE接口设备使用主板DMA外,其它接口的外设是否使用主板DMA(如果有如何查看)?(SATA硬盘应该也使用主板DMA) 2、问:硬盘使用主板DMA,是仅需要驱动的支持,还是同时需要硬盘芯片的支持? 3、问:使用DMA,是否必须要达到某个传输速度? 4、问:使用主板DMA与接口有关吗?USB、并行接口、火线接口等是否使用主板DMA? 5、问:移动硬盘的盘体支持DMA,那么硬盘转USB后还使用主板DAM吗? 请各位大侠不吝赐教! 请讲的通俗,这些问题已困扰我多日!
DMA传送方式中,是DMA控制器发出DMA请求还是外部设备呢?
DMA传送方式中,是DMA控制器发出DMA请求还是外部设备呢?
windows PCI驱动Block DMA使用问题
最近在修改一份基于DriverStudio的PCI视频采集卡驱动代码,遇到了关于DMA的使用上的疑惑。 其OnStartDevice初始化了相关资源,代码如下: ``` PCM_RESOURCE_LIST pResListRaw = I.AllocatedResources(); // Get the list of translated resources from the IRP PCM_RESOURCE_LIST pResListTranslated = I.TranslatedResources(); // Initialize the device descriptor for the DMA object using the assigned resource DEVICE_DESCRIPTION dd; RtlZeroMemory(&dd, sizeof(dd)); dd.Version = DEVICE_DESCRIPTION_VERSION; dd.Master = TRUE; dd.ScatterGather = FALSE; dd.DemandMode = TRUE; dd.AutoInitialize = FALSE; dd.Dma32BitAddresses = TRUE; dd.IgnoreCount = FALSE; dd.DmaChannel = 3; dd.InterfaceType = PCIBus; dd.DmaWidth = Width32Bits; // PCI default width dd.DmaSpeed = MaximumDmaSpeed; dd.MaximumLength = m_nDmaBufferSize; // Initialize the DMA adapter object m_Dma.Initialize(&dd, m_Lower.TopOfStack()); m_DmaBuffer.Initialize(&m_Dma,m_nDmaBufferSize,true); // Create an instance of KPciConfiguration so we can map Base Address // Register indicies to ordinals for memory or I/O port ranges. KPciConfiguration PciConfig(m_Lower.TopOfStack()); // For each I/O port mapped region, initialize the I/O port range using // the resources provided by NT. Once initialized, use member functions such as // inb/outb, or the array element operator to access the ports range. status = m_IoPortRange0.Initialize( pResListTranslated, pResListRaw, PciConfig.BaseAddressIndexToOrdinal(0) ); status = m_Irq.InitializeAndConnect( pResListTranslated, LinkTo(Isr_Irq), this ); if (!NT_SUCCESS(status)) { Invalidate(); return status; } // Setup the DPC to be used for interrupt processing m_DpcFor_Irq.Setup(LinkTo(DpcFor_Irq), this); ``` 这里初始化了DMA,但是没有绑定PCI设备物理地址与驱动空间地址的相关代码。然而在IoControl中却有以下操作 ``` //写 UCHAR* pDMA = (UCHAR*)m_DmaBuffer.pVirtualAddress() + pCapInfo->nCode*pCapInfo->nSize + pCapInfo->nOffset; memcpy(pDMA,pCapInfo->pData,pCapInfo->nSize); //读 UCHAR* pDMA = (UCHAR*)m_DmaBuffer.pVirtualAddress() + pCapInfo->nCode*pCapInfo->nSize + pCapInfo->nOffset; memcpy(pCapInfo->pData,pDMA,pCapInfo->nSize); ``` 从代码可以看出,直接将m_DmaBuffer当做PCI的内存进行了访问。简单阅读了DriverStudio的封装源代码,初始化过程实际上调用了IoGetDmaAdapter与AllocateCommonBuffer,也就是说m_DmaBuffer.pVirtualAddress()实际上是AllocateCommonBuffer分配的公用缓冲区,而实际上并没有任何地方将该地址与PCI实际的物理地址进行绑定。查阅相关资料,AllocateCommonBuffer一般用于ScatterGather模式,这里使用的是block DMA模式。难道是IoGetDmaAdapter或者AllocateCommonBuffer自动将pVirtualAddress()与PCI的物理地址空间进行了绑定?查询相关资料,也没有这种解释。那究竟为什么能直接通过m_DmaBuffer.pVirtualAddress()操作PCI的物理地址空间呢? 求各位大神解答。
中断控制器、总线控制器和DMA控制器一般做在CPU芯片(大黑块)的内部还是外部?
我对计算机硬件不是很熟悉。我想请教的问题就如标题所示:现在中断控制器、总线控制器和DMA控制器一般做在哪里?CPU芯片的内部还是外部? 具体来说,对于Intel的CPU(for laptop或者desktop的),中断控制器一般做在CPU芯片的内部还是外部?对于ARM的CPU(for smartphone的),中断控制器一般做在CPU芯片的内部还是外部? 总线控制器呢?当然我想对于南桥总线,它的控制器就应该在南桥(主板)上,但是对于北桥总线呢?比如,CPU和内存之间的总线,它的控制器是做在CPU芯片的内部还是外部?Intel的CPU和ARM的CPU的情况一样吗? 还有就是DMA控制器。对于南桥上的IO设备,它们的DMA控制器我想大约也是在南桥(主板)上的。但是,对于支持从内存到内存的数据拷贝的DMA控制器,它是做在哪里的?CPU内部还是外部?Intel的CPU和ARM的CPU的情况一样吗? 真心小白,求指导和轻拍 <(_ _)>
STM32的ADC(DMA)在数码管上无法显示值
数码管的程序是正确的,配置程序也是仿照例程写的,有哪位前辈遇到过类似的问题呢 DMA循环读数,ADC循环采样 ``` int main(void) { extern __IO uint32_t ADC_ConvertedValue; __IO uint16_t ADC_ConvertedValue2; __IO uint16_t ADC_ConvertedValueLocal=15; NumInit(); SysTickInit(); ADC1_Init(); Timer3Init(); Timer3Delay_ms(100); while(1) { ADC_ConvertedValue2=ADC_ConvertedValue&0x0000FFFF; ADC_ConvertedValueLocal=(int)ADC_ConvertedValue2/4096*3300; SetNumDisplayDecimal(ADC_ConvertedValueLocal); //值显示在数码管上 }//End of While(1) } #include "adc.h" #define ADC1_DR_Address ((u32)0x40012400+0x4c) __IO uint32_t ADC_ConvertedValue; //__IO u16 ADC_ConvertedValueLocal; void ADC1_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; /* Enable DMA clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); /* Enable ADC1 and GPIOC clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE); /* Configure PA6 as analog input */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); } void ADC1_Mode_Config(void) { DMA_InitTypeDef DMA_InitStructure; ADC_InitTypeDef ADC_InitStructure; /* DMA channel1 configuration */ DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 1; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; 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_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); /* Enable DMA channel1 */ DMA_Cmd(DMA1_Channel1, ENABLE); /* ADC1 configuration */ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE ; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); //ADC_TempSensorVrefintCmd(ENABLE); /*ÅäÖÃADCʱÖÓ£¬ÎªPCLK2µÄ8·ÖƵ£¬¼´9Hz*/ RCC_ADCCLKConfig(RCC_PCLK2_Div8); /*ÅäÖÃADC1µÄͨµÀ6Ϊ55. 5¸ö²ÉÑùÖÜÆÚ£¬ÐòÁÐΪ1 */ ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 1, ADC_SampleTime_55Cycles5); /* Enable ADC1 DMA */ ADC_DMACmd(ADC1, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); ADC_SoftwareStartConvCmd(ADC1, ENABLE); } void ADC1_Init(void) { ADC1_GPIO_Config(); ADC1_Mode_Config(); } ```
DMA传输后,拷贝DMA缓冲区数据时出错
Windows下 WDM 驱动 应用程序需要读取PCI卡(PCI9054)的数据 在驱动的读请求处理例程中 1、启动DMA传输将卡中的数据读取到驱动的缓冲区A中, 2、然后将数据复制到读请求的缓冲区B, 3、并将缓冲区A中的最后四个字节记录到缓冲区C中。 为了调试方便,我将缓冲区A初始化为“#” 现在的问题是: 读请求处理完成后,缓冲区B中的数据有时候会是“#”,而缓冲区C中的数据是对的 在第2步之前加1ms的延时,出错的概率会减小
STM32 HAL库DMA第二次输入不能从buffer头存储
现在STM32的DMA成功的将接受所得的字符存入buffer,并通过IDIE中断保证了接受数据能够处理,但是当第二次输入的时候,DMA默认将数据存储在第一次输入的数据后面。请问有什么函数能让DMA将第二次(及以后)的输入从buffer头开始存储? 下面是我的代码 main.c ``` uint8_t uart2Rx[UART2_BUF_MAX]; uint16_t uart2RxLength; int main(void) { /* USER CODE BEGIN 1 */ int i; /* USER CODE END 1 */ /* MCU Configuration----------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_DMA_Init(); MX_USART1_UART_Init(); MX_USART2_UART_Init(); /* USER CODE BEGIN 2 */ USR_UartInit(); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_Delay(1000); HAL_UART_Transmit(&huart1, (uint8_t*)"UART1\r\n", 9, 1000); for(i=0;i<uart1RxLength;i++) { HAL_UART_Transmit(&huart1, &uart1Rx[i], 1, 100); } HAL_Delay(1000); HAL_UART_Transmit(&huart1, (uint8_t*)"UART2\r\n", 9, 1000); for(i=0;i<uart2RxLength;i++) { HAL_UART_Transmit(&huart1, &uart2Rx[i], 1, 100); } } /* USER CODE END 3 */ } void USR_UartInit(void) { uart1RxLength = 0; HAL_UART_Receive_DMA(&huart1, uart1Rx, UART1_BUF_MAX); __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); uart2RxLength = 0; HAL_UART_Receive_DMA(&huart2, uart2Rx, UART2_BUF_MAX); __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE); } ``` st32_f1xxit.c ``` void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ /* USER CODE END USART1_IRQn 0 */ HAL_UART_IRQHandler(&huart1); /* USER CODE BEGIN USART1_IRQn 1 */ if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET)) { __HAL_UART_DISABLE_IT(&huart1,UART_IT_IDLE); HAL_UART_DMAStop(&huart1); uart1RxLength = UART1_BUF_MAX-__HAL_DMA_GET_COUNTER(&hdma_usart1_rx); __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); HAL_UART_Receive_DMA(&huart1, uart1Rx, UART1_BUF_MAX); } /* USER CODE END USART1_IRQn 1 */ } ```
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。 补充 有不少读者留言说本文章没有用,因为天气预报直接打开手机就可以收到了,为何要多此一举发送到邮箱呢!!!那我在这里只能说:因为你没用,所以你没用!!! 这里主要介绍的是思路,不是天气预报!不是天气预报!!不是天气预报!!!天气预报只是用于举例。请各位不要再刚了!!! 下面是我会用到的两个场景: 每日下
面试官问我:什么是消息队列?什么场景需要他?用了会出现什么问题?
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸,打败了无数
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
MyBatis研习录(01)——MyBatis概述与入门
C语言自学完备手册(33篇) Android多分辨率适配框架 JavaWeb核心技术系列教程 HTML5前端开发实战系列教程 MySQL数据库实操教程(35篇图文版) 推翻自己和过往——自定义View系列教程(10篇) 走出思维困境,踏上精进之路——Android开发进阶精华录 讲给Android程序员看的前端系列教程(40集免费视频教程+源码) 版权声明 本文原创作者:谷哥的小弟 作者博客
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。 前前言 为啥今天有个前前言呢? 因为你们的丙丙啊,昨天有牌面了哟,直接被微信官方推荐,知乎推荐,也就仅仅是还行吧(心里乐开花)
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
Python爬虫精简步骤1 获取数据
爬虫的工作分为四步: 1.获取数据。爬虫程序会根据我们提供的网址,向服务器发起请求,然后返回数据。 2.解析数据。爬虫程序会把服务器返回的数据解析成我们能读懂的格式。 3.提取数据。爬虫程序再从中提取出我们需要的数据。 4.储存数据。爬虫程序把这些有用的数据保存起来,便于你日后的使用和分析。 这一篇的内容就是:获取数据。 首先,我们将会利用一个强大的库——requests来获取数据。 在电脑上安装
Python绘图,圣诞树,花,爱心 | Turtle篇
1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle() circle.shape('circle') circle.color('red') circle.speed('fastest') circle.up() square = turtle.Turtle()
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 更多有趣分析教程,扫描下方二维码关注vx公号「裸睡的猪」 即可查看! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布
web前端javascript+jquery知识点总结
Javascript javascript 在前端网页中占有非常重要的地位,可以用于验证表单,制作特效等功能,它是一种描述语言,也是一种基于对象(Object)和事件驱动并具有安全性的脚本语言 ,语法同java类似,是一种解释性语言,边执行边解释。 JavaScript的组成: ECMAScipt 用于描述: 语法,变量和数据类型,运算符,逻辑控制语句,关键字保留字,对象。 浏览器对象模型(Br
Python实战:抓肺炎疫情实时数据,画2019-nCoV疫情地图
文章目录1. 前言2. 数据下载3. 数据处理4. 数据可视化 1. 前言 今天,群里白垩老师问如何用python画武汉肺炎疫情地图。白垩老师是研究海洋生态与地球生物的学者,国家重点实验室成员,于不惑之年学习python,实为我等学习楷模。先前我并没有关注武汉肺炎的具体数据,也没有画过类似的数据分布图。于是就拿了两个小时,专门研究了一下,遂成此文。 2月6日追记:本文发布后,腾讯的数据源多次变更u
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
渗透测试-灰鸽子远控木马
木马概述 灰鸽子( Huigezi),原本该软件适用于公司和家庭管理,其功能十分强大,不但能监视摄像头、键盘记录、监控桌面、文件操作等。还提供了黑客专用功能,如:伪装系统图标、随意更换启动项名称和表述、随意更换端口、运行后自删除、毫无提示安装等,并采用反弹链接这种缺陷设计,使得使用者拥有最高权限,一经破解即无法控制。最终导致被黑客恶意使用。原作者的灰鸽子被定义为是一款集多种控制方式于一体的木马程序
Python:爬取疫情每日数据
前言 有部分同学留言说为什么412,这是因为我代码里全国的cookies需要你自己打开浏览器更新好后替换,而且这个cookies大概只能持续20秒左右! 另外全国卫健委的数据格式一直在变,也有可能会导致爬取失败! 我现在已根据2月14日最新通报稿的格式修正了! 目前每天各大平台,如腾讯、今日头条都会更新疫情每日数据,他们的数据源都是一样的,主要都是通过各地的卫健委官网通报。 为什么已经有大量平台做
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。   再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。   下文是原回答,希望能对你能有所启发。   如果我说,这个世界上人真的分三六九等,
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名
3万字总结,Mysql优化之精髓
本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降。 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计
Python新型冠状病毒疫情数据自动爬取+统计+发送报告+数据屏幕(三)发送篇
今天介绍的项目是使用 Itchat 发送统计报告 项目功能设计: 定时爬取疫情数据存入Mysql 进行数据分析制作疫情报告 使用itchat给亲人朋友发送分析报告(本文) 基于Django做数据屏幕 使用Tableau做数据分析 来看看最终效果 目前已经完成,预计2月12日前更新 使用 itchat 发送数据统计报告 itchat 是一个基于 web微信的一个框架,但微信官方并不允
作为程序员的我,大学四年一直自学,全靠这些实用工具和学习网站!
我本人因为高中沉迷于爱情,导致学业荒废,后来高考,毫无疑问进入了一所普普通通的大学,实在惭愧...... 我又是那么好强,现在学历不行,没办法改变的事情了,所以,进入大学开始,我就下定决心,一定要让自己掌握更多的技能,尤其选择了计算机这个行业,一定要多学习技术。 在进入大学学习不久后,我就认清了一个现实:我这个大学的整体教学质量和学习风气,真的一言难尽,懂的人自然知道怎么回事? 怎么办?我该如何更好的提升
粒子群算法求解物流配送路线问题(python)
粒子群算法求解物流配送路线问题(python) 1.查找论文文献 找一篇物流配送路径优化+粒子群算法求解的论文 参考文献:基于混沌粒子群算法的物流配送路径优化 2.了解粒子群算法的原理 讲解通俗易懂,有数学实例的博文:https://blog.csdn.net/daaikuaichuan/article/details/81382794 3.确定编码方式和解码策略 3.1编码方式 物流配送路线的
教你如何编写第一个简单的爬虫
很多人知道爬虫,也很想利用爬虫去爬取自己想要的数据,那么爬虫到底怎么用呢?今天就教大家编写一个简单的爬虫。 下面以爬取笔者的个人博客网站为例获取第一篇文章的标题名称,教大家学会一个简单的爬虫。 第一步:获取页面 #!/usr/bin/python # coding: utf-8 import requests #引入包requests link = "http://www.santostang.
前端JS初级面试题二 (。•ˇ‸ˇ•。)老铁们!快来瞧瞧自己都会了么
1. 传统事件绑定和符合W3C标准的事件绑定有什么区别? 传统事件绑定 &lt;div onclick=""&gt;123&lt;/div&gt; div1.onclick = function(){}; &lt;button onmouseover=""&gt;&lt;/button&gt; 注意: 如果给同一个元素绑定了两次或多次相同类型的事件,那么后面的绑定会覆盖前面的绑定 (不支持DOM事...
相关热词 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数 c#日期精确到分钟 c#自定义异常必须继承 c#查表并返回值 c# 动态 表达式树 c# 监控方法耗时 c# listbox c#chart显示滚动条
立即提问