楼主太强了!!
请问你刚学STM32用的什么开发板?? 能用keil软件么?
一定回复我哦!!!
我会一直关注这个帖子的!!!
LZ已有硬件触发,不如加个等效采样功能,估计可以到达10M
回复楼23 24
我是08年8月开始接触32的,导师对着一块芯片说,看看这块芯片,1M的AD,还带DMA,这么大容量的RAM和FLASH。内部几乎可以采到1万个点了。于是就开始了2个星期的痛苦入门。刚开始是用的万利的板子,网上好像很多例子都是基于这个板子的,可能出来比较早。但是现在看来例子相对较少。软件环境用的是板子带的IAR。
等效采样有听说过,但是没具体研究过。楼上有做过么?能否给些资料的链接。上次我去面试,面试官听到我这个最大能采200K的波形:他说这有什么用这么低。受打击了
双通道的问题
一直没搞明白的是如果用STM32的同一个AD(假如ADC1)的两个通道(或更多通道)进行采样,怎么编程序,如果再开一个DMA通道(同时再定义一个AD_Data[XX]数组),那么通过什么样的语句把AD的通道和DMA的通道对应起来的?谢谢
回复双通道问题
下面是我开多通道的代码给你参考下:
void DMA_ADC_Config()
{
/* DMA channel1 configuration ----------------------------------------------*/
DMA_DeInit(DMA_Channel1);//复位DMA通道x
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC_DR_Address;//定义 DMA通道外设基地址=ADC1_DR_Address 源
//AD采集到的数据存放的寄存器
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_RegularConvertedValueTab;//定义DMA通道存储器地址,内存中的数据 目的
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//指定外设为源地址
DMA_InitStructure.DMA_BufferSize = 4;//定义DMA缓冲区大小4
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//当前外设寄存器地址不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//当前存储器地址增加
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//定义外设数据宽度16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//定义存储器数据宽度16位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//DMA通道操作模式位环形缓冲模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA通道优先级高
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//禁止DMA通道存储器到存储器传输
DMA_Init(DMA_Channel1, &DMA_InitStructure);//初始化DMA通道x
DMA_Cmd(DMA_Channel1, ENABLE);//使能DMA通道x
}
void ADC1_Channel_config()
{
/* ADC1 configuration ------------------------------------------------------*/
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//AD转换模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE;//使能扫描
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//连续转换
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;;//有软件控制转换
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 4;//转换通道为通道4
ADC_Init(ADC1, &ADC_InitStructure);
/* ADC1 regular channel14 configuration */
//ADC1选择信道14|15,音序器等级1,采样时间55.5个周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 2, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 3, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 4, ADC_SampleTime_55Cycles5);
}
(这段代码是以前做万用表的时候用的,多次修改,有些注释可能没改过来)
然后在上面定义下数据数组
vu16 ADC_RegularConvertedValueTab[4];
结果4个通道的数据就按次序在这个数组里面了,
具体顺序应该是这样的,先是采集通道14,DMA自动把数据放到数组第一个位置然后DMA地址会加一
所以DMA_InitStructure.DMA_MemoryInc 一定要定义成 DMA_MemoryInc_Enable;也就是递增
然后通道15,依次类推到4次结束后触发一次DMA中断,然后又是通道14
为什么要触发了?
我觉得STM32这部分,不需触发呀,AD用自动开启,也不要定时器启动,利用AD采样的等时性就可以了.采用后把数据传给PC,PC来处理触发沿的问题就可以了.
请教搂主如何提高STM32 的USB虚拟串口的速度?
我使用STM32的虚拟串口与PC机通信,代码都是基于ST提供的Demo.感觉速度只有大约每秒55K字节。想请问在正常情况下,速度应该是多少?如何提高传输速度?
另外,搂主为何要自行写Windows下的驱动呢?为了提高速度?
Thanks
楼主找工作应该不难啊,能做到这样不错了。
其实可以用LabVIEW来做PC端,这样比较容易些,开发速度要快不少。
感觉描述的太复杂~
主要是window的驱动方面。感觉很复杂。
应该套用 框架,有个既定的框架的。USB驱动大同小异啊!那个USBBLUK就是吧!