你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32 规则组和注入组程序

[复制链接]
gujiamao 发布时间:2015-5-3 10:45


第一种(DMA + 规则)
    RCC_ADCCLKConfig(RCC_PCLK2_Div6); /*72Mhz/6 = 12Mhz*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 | RCC_AHBPeriph_DMA2, ENABLE);
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;   
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    //DMA Config
    DMA_InitTypeDef DMA_InitStructure;
    DMA_DeInit(DMA1_Channel1);
    DMA_InitStructure.DMA_PeripheralBaseAddr = 0x4001244C; //ADC1的DR地址
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)hwAdc_Converted_Value; //不加&应该也可以 数组名 代表地址
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//外设向内存传数据
    DMA_InitStructure.DMA_BufferSize = DMA_N * DMA_C; //DMA缓存大小 //64 * 4
    DMA_InitStructure.DMA_PeripheralInc = DMA_MemoryInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //目标内存地址自动后移
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//DMA传送数据尺寸16位
    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);


    //ADC Config
     ADC_InitTypeDef ADC_InitStructure;
     ADC_DeInit(ADC1);
     ADC_StructInit(&ADC_InitStructure);
     ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
     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 = DMA_C; //4
     ADC_Init(ADC1, &ADC_InitStructure);
     ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5); //9Mhz/(239.5 + 12.5) = 35.7Khz
     ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5); //9Mhz/(239.5 + 12.5) = 35.7Khz
     ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_239Cycles5); //9Mhz/(239.5 + 12.5) = 35.7Khz
     ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_239Cycles5); //9Mhz/(239.5 + 12.5) = 35.7Khz
     ADC_DMACmd(ADC1,ENABLE);
     ADC_Cmd(ADC1, ENABLE);
     ADC_ResetCalibration(ADC1);
     while(ADC_GetResetCalibrationStatus(ADC1));
     ADC_StartCalibration(ADC1);
     while(ADC_GetCalibrationStatus(ADC1));
     ADC_SoftwareStartConvCmd(ADC1, DISABLE);
第二种(注入组)
    RCC_ADCCLKConfig(RCC_PCLK2_Div6); /*72Mhz/6 = 12Mhz*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 | RCC_AHBPeriph_DMA2, ENABLE);
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;   
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    //ADC INIT, ADC1 INJECTED CH, CONT SCAN MODE
    ADC_InitTypeDef ADC_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    RCC_ADCCLKConfig(RCC_PCLK2_Div6); /*72Mhz/6 = 12Mhz, note: 14MHz at most*/
    ADC_DeInit(ADC1);
    ADC_StructInit(&ADC_InitStructure);
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_ScanConvMode = ENABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Left;
    ADC_InitStructure.ADC_NbrOfChannel = 0;
    ADC_Init(ADC1, &ADC_InitStructure);
    ADC_InjectedSequencerLengthConfig(ADC1, 4); //!!!length must be configured at first
    ADC_InjectedChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5); //12Mhz / (12.5 + 239.5) = 47Khz
    ADC_InjectedChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5);
    ADC_InjectedChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_239Cycles5);
    ADC_InjectedChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_239Cycles5);
    ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);
    ADC_AutoInjectedConvCmd(ADC1, ENABLE); //!!!must be set because inject channel do not support CONT mode independently
    ADC_Cmd(ADC1, ENABLE);
    ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1)); //WARNNING: DEAD LOOP!!!
    ADC_SoftwareStartConvCmd(ADC1, DISABLE);

收藏 评论11 发布时间:2015-5-3 10:45

举报

11个回答
gujiamao 回答时间:2015-5-3 10:46:03
都是四个通道,感觉注入组更方便点。
stary666 回答时间:2015-5-3 15:11:43
都很好,如果是寄存器版就更好
moyanming2013 回答时间:2015-5-4 14:12:19
不明白这是什么意思呢?
gujiamao 回答时间:2015-5-4 14:18:58
moyanming2013 发表于 2015-5-4 14:12
不明白这是什么意思呢?

比如你用到ADC1的四个通道,怎么知道此时采样的是哪个通道呢?
1.用DMA方式;
2.用注入组
ROCK0525 回答时间:2015-5-4 14:31:20
不明白这是什么意思呢?
那就地方 回答时间:2015-5-4 22:00:46
谢谢楼主分享,学习了
alisa123 回答时间:2015-5-4 22:12:34
这个在那个类型的芯片上的,stm32f10x,还是stm32f20x,还是stm32f30x?请问这个针对ADC+DMA方式采样顺序采样多个通道,上述三个类型的CPU有没有什么不同?谢谢
gujiamao 回答时间:2015-5-5 14:26:58
alisa123 发表于 2015-5-4 22:12
这个在那个类型的芯片上的,stm32f10x,还是stm32f20x,还是stm32f30x?请问这个针对ADC+DMA方式采样顺序采 ...

我用的是10X。其他两款没用过
qscvhu 回答时间:2015-5-5 15:21:29
两种有什么不同?
为什么是EEFOCUS小白 回答时间:2015-5-5 17:02:00
谢谢楼主分享!
gujiamao 回答时间:2015-5-6 19:57:01
qscvhu 发表于 2015-5-5 15:21
两种有什么不同?

规则组必须按着事先说好的采样顺序采样;
注入组则不用。

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版