fxyc87 发表于 2020-11-6 09:05

【MM32 eMiniBoard测评】简易示波器-1

本帖最后由 fxyc87 于 2020-11-6 09:05 编辑

<p>关键字:</p>

<p><strong>AD、DMA、HID、USB、C#</strong></p>

<p>通过MCU的ADC采集电压数据,开启DMA采样并通过USB发送PC端</p>

<p>目前MCU端基本可以运行,PC端的C#程序还有些问题</p>

<p>我用了2路AD模拟量,见开发板图纸,RV1,RV2两路可调电阻分别接在AIN1,AIN2上,对应的GPIO引脚是PA1,PA4</p>

<p></p>

<p>初始化GPIO为模拟量功能,引脚复用也得设置,</p>

<p>我是看手册之后直接操作的寄存器,没有用库,库用得有些问题就不想用了</p>

<p>直接操作寄存器比较放心,也能学习过程。</p>

<p>&nbsp;</p>

<p></p>

<p></p>

<p>引用复用设置完成后就要初始化AD相关寄存器,</p>

<p>这两路模拟量分别对应的AD1和AD4通道,</p>

<p>另外我开启了AD14,AD15分别是内置温度及内置参考1.2V电压</p>

<p>温度计算公式手册中也有说明,分别是4.801mV/摄氏度</p>

<p></p>

<p>DMA设置非常简单,看手册,设置外设地址,固定,内存保存地址每次+1即可,然后设置10KB的缓存区域</p>

<p>以下是代码</p>

<pre>
<code class="language-cpp">s32 main(void)
{
    GPIO_Configuration();
       
    USB_NVIC_Config();
    USB_ClockConfig();
    USB_Init();



       
        //adc初始化代码
        //gpio初始化
        //pa1         a1
        GPIOA-&gt;CRL&amp;=(3&lt;&lt;6);                //pa1 模拟输入模式
        //pa4        a2
        GPIOA-&gt;CRL&amp;=(3&lt;&lt;18);                //pa4 模拟输入模式
       
        GPIOA-&gt;AFRL|=7&lt;&lt;4;                //pa1复用        ADC1_VIN        通道1       
        GPIOA-&gt;AFRL|=6&lt;&lt;16;                //pa4复用        ADC1_VIN        通道4
       
        //
       
        //初始化ADC1时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

        //adc时钟需要小于15mhz                72/5=14.4
        ADC1-&gt;ADCFG=        (1&lt;&lt;14)                //预分频最低位                最终分频=72/(3+2)
                                |        (0&lt;&lt;10)                //通道X采样时间
                                //|        (4&lt;&lt;7)                //8位BIT                        /12 bit
                                |        (1&lt;&lt;4)                //预分频高3位                0x11
                                |        (1&lt;&lt;3)                //内部参考电压使能
                                |        (1&lt;&lt;2)                //内部温度传感器使能
                                |        (1&lt;&lt;0);                //ADC使能
                               
        ADC1-&gt;ADCHS=        (1&lt;&lt;15)                //内部参考电压使能
                                |        (1&lt;&lt;14)                //内部温度传感器使能
                                |        (1&lt;&lt;4)                //通道4使能
                                |        (1&lt;&lt;1);                //通道1使能
                               
                               
                               

        ADC1-&gt;CHANY0=0x0000FE41;
                                /*
                                (1&lt;&lt;0)                        //通道1
                                |        (4&lt;&lt;4)                //通道4
                                |        (14&lt;8)                //通道14,温度                平均斜率        4.801 mV/?C
                                |        (15&lt;&lt;12);        //通道15,内部参考(1.2V)                //连续扫描
                                */
                               
        ADC1-&gt;ANYCFG=3;                                //0-3通道               
        ADC1-&gt;ANYCR=1;                                //多通道使能
       
        ADC1-&gt;ADCR=                (2&lt;&lt;9)                //连续扫描模式
                                |        (1&lt;&lt;3);                //DMA
                               
        //DMA配置
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
        DMA1_ch1-&gt;CCR=        (1&lt;&lt;7)                //执行存储器地址增量操作
                                |        (1&lt;&lt;14)                //m2m
                                |        (1&lt;&lt;8)                //psize
                                |        (1&lt;&lt;10);        //msize
                                //|        (1&lt;&lt;5);                //执行循环操作
                               
        DMA1_ch1-&gt;CNDTR=dma_size;        //数据传输数量 10kb MCU共16kb
        DMA1_ch1-&gt;CPAR=(uint32_t)&amp;ADC1-&gt;ADDR1;//外设地址        adc 通道1
        DMA1_ch1-&gt;CMAR=(uint32_t)&amp;adc_dma_data;//内存地址
       
       
        ADC1-&gt;ADCR|=        (1&lt;&lt;8);                //开始采样
        //dma开始
        DMA1_ch1-&gt;CCR|=1;                //通道开启
       

        //while(1);

        //fValue = ((float)ADCVAL / 4095) * 3.3; //use 3.3V as VDD
        uint8_t * dma_index_bak=(uint8_t *)&amp;adc_dma_data;
       
        uint8_t * dma_index=(uint8_t *)&amp;adc_dma_data;
        uint8_t test_dat={
                0x11,1,2,3,4,5,6,7,8,9,
                0x22,1,2,3,4,5,6,7,8,9,
                0x33,1,2,3,4,5,6,7,8,9,
                0x44,1,2,3,4,5,6,7,8,9,
                0x55,1,2,3,4,5,6,7,8,9,
                0x66,1,2,3,4,5,6,7,8,9,
                0x77,1,2,3
        };
    while(1) {
               
      if(bDeviceState == CONFIGURED) {
                               
                               
                                if(!(_GetUSB_CTRL1()&amp;EP1_CTRL_TRANEN)) {
                                        UserToPMABufferCopy(dma_index, ENDP1,BUFF_SIZE);        //BUFF_SIZE
                                        _SetUSB_CTRL1(EP1_CTRL_TRANEN | BUFF_SIZE) ; //Loop IN transmission

                                       
                                        dma_index+=BUFF_SIZE;
                                        if((dma_index-dma_index_bak)&gt;=(dma_size*2)){

                                                dma_index=dma_index_bak;
                                        }
                                }

                       
      }
    }
        while(1);
       
}
</code></pre>

<p>然后就是上位机了,下次测试好了连同软件及上位机全部发出来。</p>

<p>&nbsp;</p>

w494143467 发表于 2020-11-6 10:26

<p>我已经有上位机了,正准备做这个呢,哈哈</p>

okhxyyo 发表于 2020-11-8 22:43

<p><strong><a href="https://bbs.eeworld.com.cn/elecplay/content/145" target="_blank">灵动MM32 eMiniBoard开发板测评</a></strong></p>

<p>汇总贴:<a href="https://bbs.eeworld.com.cn/thread-1146791-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1146791-1-1.html</a></p>
页: [1]
查看完整版本: 【MM32 eMiniBoard测评】简易示波器-1