新葡京彩票平台直营网: [MM32硬件] MM32F003 非DMA 多路ADC采集

永利游戏开户直营
714|11
楼主
官方资料太少,手册和参考代码都没有关于一次采集多路的介绍,又不想用DMA,我就自己摸索了一个办法和大家分享,简单粗暴了点,有更好的办法请赐教!
初始化代码(局部)

    GPIO_InitTypeDef GPIO_InitStructure;
       
          RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //开GPIO时钟
                //端口配置这里只贴一个通道
    GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin_4;                                 //pin,
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                           //Output speed
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                               //GPIO mode
    GPIO_Init(GPIOA, &GPIO_InitStructure);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);                         //启用ADC时钟

    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
    ADC_InitStructure.ADC_PRESCARE = ADC_PCLK2_PRESCARE_16;                     //ADC prescale factor ADC预分频系数
    ADC_InitStructure.ADC_Mode = ADC_Mode_Single_Period ;                      //将ADC模式设置为连续转换模式/或单周期
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                      //AD data right-justified 数据右对齐
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; // ADC外部触发源,用于常规通道转换
    ADC_Init(ADC1, &ADC_InitStructure);


          ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 4, ADC_SampleTime_239_5Cycles);//通道注入组规则
          ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 5, ADC_SampleTime_239_5Cycles);//
          ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 9, ADC_SampleTime_239_5Cycles);//
    ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 14, ADC_SampleTime_239_5Cycles);//
    ADC_TempSensorCmd(ENABLE);  //内置温度,14通道
    ADC_Cmd(ADC1, ENABLE);   

手动软件启动
ADC_SoftwareStartConvCmd(ADC1, ENABLE);

定期查询方式获取4路AD值
if(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) != 0)
         {
                ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
                puiADData[4] = (*(volatile unsigned int *)0x40012428)&0xFFF;//直接取地址
                puiADData[5] = (*(volatile unsigned int *)0x4001242C)&0xFFF;
                puiADData[9] = (*(volatile unsigned int *)0x4001243C)&0XFFF;
                puiADData[14] = (*(volatile unsigned int *)0x40012450)&0xFFF;

                ADC_SoftwareStartConvCmd(ADC1, ENABLE);//再次启动转换
                printf("[4]=%d,[5]=%d,[9]=%d,[14]=%d\r\n",puiADData[4],puiADData[5],puiADData[9],puiADData[14]);//打印结果
             }
沙发
| 2020-8-16 20:16 | 只看该作者
楼主不错,这个方法也很实用,能不能把你的Printf()函数共享一下,我用官方的例程不能用,STM32,51的程序放进来也不能用。不知道哪根筋不对。
板凳
 楼主 | 2020-8-16 21:01 | 只看该作者
callhgd 发表于 2020-8-16 20:16
楼主不错,这个方法也很实用,能不能把你的Printf()函数共享一下,我用官方的例程不能用,STM32,51的程序 ...

//添加printf,需要在项目里的Target里勾选Use MicroLIB
//再添加如下代码
int fputc(int ch, FILE *f)
{
UART_SendData(UART, (unsigned char) ch);
while (!(UART->CSR & UART_FLAG_TXEMPTY));
return (ch);
}
地板
| 2020-8-17 08:20 | 只看该作者
ZG11211 发表于 2020-8-16 21:01
//添加printf,需要在项目里的Target里勾选Use MicroLIB
//再添加如下代码
int fputc(int ch, FILE *f)

好的,谢谢!
5
| 2020-8-17 09:33 | 只看该作者

兄弟,刚才用你的函数试了一下,还是不行,不知道为什么。发送16进制数据是正常的,printf()使用没有输出。你改了底层串口驱动函数吗?
6
 楼主 | 2020-8-25 21:51 | 只看该作者
callhgd 发表于 2020-8-17 09:33
兄弟,刚才用你的函数试了一下,还是不行,不知道为什么。发送16进制数据是正常的,printf() ...

抱歉,有几天没看了,回帖晚了,我没改底层,你不会忘了#include <string.h>吧,没声明头文件编译不会报错,就是没打印输出,
7
| 2020-9-2 15:59 | 只看该作者
直接寻址的方式,确实是一个不错的想法,方法用的很巧妙,适合使用。
8
| 2020-9-2 23:41 | 只看该作者
非常感谢楼主分享
9
| 2020-9-2 23:42 | 只看该作者
代码很详细
10
| 2020-9-7 16:11 | 只看该作者
楼主的想法不错的,新葡京彩票平台直营网:感谢楼主的分享。谢谢。
11
| 2020-9-10 08:54 | 只看该作者
这个帖子很棒帮,顶起来。不错的。
12
| 2020-9-13 16:03 | 只看该作者
感谢分享
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

永利游戏开户直营 快速回复 返回顶部 返回列表
彩票在线开户直营网 申博赌城攻略游戏下载网上娱乐场 太阳城软件游戏登入 澳门金沙假曰中心酒店网上娱乐场 淘金YG电子网址
好彩客app下载 港龙彩票官网 彩6在线开户直营网 彩客网官网直营网 678娱乐城集团直营网
合乐888彩票现金 盛源彩票官方 港龙彩票正规直营网 4567彩票现金 永乐彩票电子游戏直营网
mg幸运生肖登入 菠萝彩票app下载直营网 vc088.com登入 四季彩票正规直营网 秒速时时彩网站直营网