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

stm32 规则组和注入组程序

[复制链接]
gujiamao 发布时间:2015-5-3 10:45
* u( o: M& N/ M, U. z0 b

  d1 G  I* C; G- C: e9 q第一种(DMA + 规则)
3 S+ X7 y/ l9 i8 x    RCC_ADCCLKConfig(RCC_PCLK2_Div6); /*72Mhz/6 = 12Mhz*/
' W3 e, O% u( D8 y; e; F5 ]    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
0 F6 _; U# \9 l, K    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
; C' P( K, }$ [4 H, }    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 | RCC_AHBPeriph_DMA2, ENABLE);
: n' p/ D4 L7 S& w$ B! Y" f* F0 \    GPIO_InitTypeDef GPIO_InitStructure;  G5 Z* N0 E' p6 G& r- q+ s
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;    0 C2 L8 K4 ?9 q. `" \3 p0 X1 U+ G
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
2 A) f/ t. `5 J- J6 N    GPIO_Init(GPIOA, &GPIO_InitStructure);
) b9 e8 c! {  n    //DMA Config
  o! S% l/ z) g/ k; Z% I6 C    DMA_InitTypeDef DMA_InitStructure;
8 k0 X5 p( w' f& Z) F( p" O    DMA_DeInit(DMA1_Channel1);
. o( ]* W/ \1 L' @( ~    DMA_InitStructure.DMA_PeripheralBaseAddr = 0x4001244C; //ADC1的DR地址
" [0 L% ~3 e+ G    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)hwAdc_Converted_Value; //不加&应该也可以 数组名 代表地址2 Z5 R8 `2 C) d1 e
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//外设向内存传数据
! W' n, n* l# d* }' {% Z    DMA_InitStructure.DMA_BufferSize = DMA_N * DMA_C; //DMA缓存大小 //64 * 4
8 T* U, T! u% ?, b    DMA_InitStructure.DMA_PeripheralInc = DMA_MemoryInc_Disable;
3 n' f' l+ M( p3 D4 p0 M- L  L: b    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //目标内存地址自动后移
$ n; H! X- L" r$ ^    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
5 Q6 e2 B+ l- c) @9 n" J    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//DMA传送数据尺寸16位
/ Q9 h, m# a/ H4 {    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//常用循环缓存模式4 Q0 g9 {. G3 D2 l8 Y$ m
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;! j4 j4 [& l# A3 T7 D
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//禁止内存到内存模式+ ^! O! |& y, S
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);% t; J* G1 c- {
    DMA_Cmd(DMA1_Channel1, ENABLE);
& U$ p7 O- x- ^6 ?9 I4 G" E; H' B
4 _1 Z& E$ ?0 T" l
) p( x5 t( i$ Y& L
    //ADC Config
* N: X7 R* ?* l- `7 I     ADC_InitTypeDef ADC_InitStructure;$ O9 i& @3 L- I! Y
     ADC_DeInit(ADC1);5 c; p* s, @/ B1 i4 ]; u- A
     ADC_StructInit(&ADC_InitStructure);
% \2 H* _. z) M$ I3 d* [     ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;. B6 O4 d2 @' v/ D2 L# U! K& J
     ADC_InitStructure.ADC_ScanConvMode = ENABLE; //!!6 y* @+ L5 s% t, Q: R& r5 Z; n- j
     ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //!!9 _' i7 w( M" d5 O# s
     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
/ J0 W8 r' @7 t4 }6 s+ ]     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;0 G$ J2 e# F$ p" \0 s
     ADC_InitStructure.ADC_NbrOfChannel = DMA_C; //4
1 J0 i% b5 F6 ^$ k     ADC_Init(ADC1, &ADC_InitStructure);
- \  f" [4 A' }0 {3 n& X/ s     ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5); //9Mhz/(239.5 + 12.5) = 35.7Khz2 A; {" E6 y( A- ?
     ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5); //9Mhz/(239.5 + 12.5) = 35.7Khz
/ w$ Z& `2 `6 N$ x     ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_239Cycles5); //9Mhz/(239.5 + 12.5) = 35.7Khz
, }0 d' D7 z! j     ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_239Cycles5); //9Mhz/(239.5 + 12.5) = 35.7Khz
' j9 A  q! r  x8 P     ADC_DMACmd(ADC1,ENABLE);
# A2 z# J# o& u9 }6 q' \7 W     ADC_Cmd(ADC1, ENABLE);9 O6 u5 w: H1 c; u
     ADC_ResetCalibration(ADC1);
& G4 b, Y& S* t     while(ADC_GetResetCalibrationStatus(ADC1));
6 L: r. y6 y& A; \8 F3 h& v     ADC_StartCalibration(ADC1);+ ~, j6 ]# G% D' Q
     while(ADC_GetCalibrationStatus(ADC1));! O. _' r& y' k) u
     ADC_SoftwareStartConvCmd(ADC1, DISABLE);; R3 \  O8 @" W
第二种(注入组)& j# ?* a5 ?$ j; t& K
    RCC_ADCCLKConfig(RCC_PCLK2_Div6); /*72Mhz/6 = 12Mhz*/$ S) r7 O- s$ k; Z. x# O+ n
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
7 V  x2 W; m8 N    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);) D3 P+ D; D8 [% T& b9 |% U, O
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 | RCC_AHBPeriph_DMA2, ENABLE);2 L; i& m1 z# `+ X
    GPIO_InitTypeDef GPIO_InitStructure;& S1 f  Y& \3 c! K
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;    7 Y  D) i' H. V+ s/ l! a
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;9 X6 U1 C# c0 G8 G1 Z
    GPIO_Init(GPIOA, &GPIO_InitStructure);
4 Y4 t. W* y5 l    //ADC INIT, ADC1 INJECTED CH, CONT SCAN MODE
% n) Q, S6 v- P5 n    ADC_InitTypeDef ADC_InitStructure;: r/ n9 q0 \& c  E! g9 e7 \, s
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);, J3 N* j/ b- K7 F: w
    RCC_ADCCLKConfig(RCC_PCLK2_Div6); /*72Mhz/6 = 12Mhz, note: 14MHz at most*/, g' _9 ]$ c5 |- B
    ADC_DeInit(ADC1);
9 A! H9 m8 ]0 C' v# I9 `5 h    ADC_StructInit(&ADC_InitStructure);3 z% R* x8 P3 h1 H
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
5 i7 s* @5 o( P  P* Z    ADC_InitStructure.ADC_ScanConvMode = ENABLE;
6 U  b$ W! B) R) @" @7 K/ ]8 t    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
$ x* C) n) i/ Y( `; Z6 [    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
6 ^+ F$ `7 C$ E6 T    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Left;* P3 b9 B: \) X2 z
    ADC_InitStructure.ADC_NbrOfChannel = 0;
; |3 Y+ ^4 w: j& H    ADC_Init(ADC1, &ADC_InitStructure);
% F! ?$ _- d7 z    ADC_InjectedSequencerLengthConfig(ADC1, 4); //!!!length must be configured at first
, W; b& \! v; O1 v" D7 q* g" Y    ADC_InjectedChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5); //12Mhz / (12.5 + 239.5) = 47Khz6 f& u* w/ `; q
    ADC_InjectedChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5);3 V% g0 v2 L3 m" P
    ADC_InjectedChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_239Cycles5);
! V. G( F8 ?' u  M6 ^    ADC_InjectedChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_239Cycles5);/ F  A+ N2 D6 y0 N5 q# F8 |7 C
    ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);4 ]" P6 I) I2 h% Q) v" @  R
    ADC_AutoInjectedConvCmd(ADC1, ENABLE); //!!!must be set because inject channel do not support CONT mode independently
1 E  G3 m. ~2 ^2 s, u- D    ADC_Cmd(ADC1, ENABLE);/ T. P3 ~6 ]7 F" e
    ADC_ResetCalibration(ADC1);9 G8 m3 b4 K; q6 n" \
    while(ADC_GetResetCalibrationStatus(ADC1));
& h  {4 G- B' U    ADC_StartCalibration(ADC1);+ E* r6 I8 j- m  F* g# }
    while(ADC_GetCalibrationStatus(ADC1)); //WARNNING: DEAD LOOP!!!
4 W6 P  G8 R8 A! n. _1 H. K* j. I    ADC_SoftwareStartConvCmd(ADC1, DISABLE);
7 ?. L8 I: a  |/ Z6 G4 |
5 Z) c4 o% Y5 u+ C) ?* N
赞 收藏 评论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
不明白这是什么意思呢?
, }/ M4 n4 q" v
gujiamao 回答时间:2015-5-4 14:18:58
moyanming2013 发表于 2015-5-4 14:12
; }! W& F( O  p1 C) i不明白这是什么意思呢?

, X) J) E; L8 Z& c比如你用到ADC1的四个通道,怎么知道此时采样的是哪个通道呢?2 P% F7 d. Y7 Z$ ]1 B5 e% h
1.用DMA方式;
& u% C" y+ i5 }6 C) W2.用注入组
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' H- P7 D2 V2 U$ N. P$ H
这个在那个类型的芯片上的,stm32f10x,还是stm32f20x,还是stm32f30x?请问这个针对ADC+DMA方式采样顺序采 ...
" J# }. \3 w/ n8 k8 _, i' H+ Y
我用的是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% h5 J% V, J2 v7 I1 |
两种有什么不同?
; @% r! m2 p2 f( t/ F- a/ ?  D& d& s
规则组必须按着事先说好的采样顺序采样;! H1 D4 x7 j7 O7 p- L2 p- c
注入组则不用。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版