G0的介绍
3 C; `9 ]+ w, J$ H# gG0是ST新推出的系列,我手上的是ST官方送出的STM32G070RB-NUCLEO板,在峰会上有幸获得。拿到这个板子的第一反应是觉得,它跟STM32F103RB长得好像啊,但一看原理图才发现,G0满满的IO口,IO的占用率高了好多.。$ a- c+ s8 Y! K1 Z e0 j% c
# X" Q |$ G" a0 |! X0 ]
. V5 b0 P1 }5 z- P0 a! I% w
! H! b4 G- u* J+ U7 h7 x! j安装好STM32CubeMX之后,打开一看,IO的复用也很多,片上外设很丰富,对于普通的控制使用,完全没问题。内置有64K的ROM和128K的flash,对于跑一些UCOSIII 或者RT_Thread等RTOS毫无压力,当然了,emwin这种GUI就算了。官板上,板载STlink,可以很方便的下载,且带有串口,连接的是G0的USART2,使用A2,A3复用。板载一个用户LED和一个用户按键,还有一个复位按键。
3 A+ N% J U! \任何板子都从点灯开始
C4 f$ P, C( z9 E5 I) P" d4 C5 O2 }1 E# J
开始建立项目并点亮第一个灯9 ^. b! S- G: j
通过配置STM32CubeMX,配置好时钟等外设之后,从原理图上,可以找到LD4接的是A5这个引脚。通过在STM32CubeMX上将该引脚配置为推挽输出模式,点解生成代码即可。STM32CubeMX使用的是HAL库,所以要让LD4交替闪烁,我们使用HAL库上的API" S& k" ~3 Z' |1 T
( h2 T3 d! K& A" N; ^: Q9 a' z
使用这个API函数,再使用
5 _( v% ]1 M. s7 P) Z
2 j1 y$ {2 r- I5 _, r" k4 y, v则LD4可以以500MS的时间交替闪烁。而这整个过程,只要熟悉了STM32CubeMX,都可以很快建立好工程并实现控制效果。
, V( i* X, q* u p% |* ]# Z5 w; O5 h
配置ADC
6 R8 C/ E8 {; b/ s; j- b通过STM32CubeMX,配置A1,A2两个管脚,复用为ADC功能。ADC的配置程序如下:
/ n2 l5 j4 L- \6 p5 @9 p
( U% x) A" r2 D+ _: A( e- void adc1_init(void) ; c0 \4 H+ z4 a
- {: w) O5 I- K8 v9 e
- GPIO_InitTypeDef GPIO_Init;
9 h8 w" j5 j7 ] N3 P - __HAL_RCC_GPIOA_CLK_ENABLE();
* O, l0 \# K, g$ `: T+ p7 N5 a5 c - __HAL_RCC_ADC_CLK_ENABLE(); //开启ADC时钟! F# h( u" ^, S
, P, h6 k9 L# u6 u0 Z- GPIO_Init.Pin = GPIO_PIN_0|GPIO_PIN_1;
/ N( p! N# _! b% x/ j# S: M - GPIO_Init.Mode = GPIO_MODE_ANALOG;
3 w$ s: N! |$ B4 | - GPIO_Init.Pull = GPIO_NOPULL;
- J( u8 T0 u7 H. l - HAL_GPIO_Init(GPIOA, &GPIO_Init);
& D6 r) b8 ^9 \& l3 } - 6 Y7 g3 G. i! G1 \
- hadc1.Instance = ADC1;
0 S2 `9 n0 ^; _5 z. A! C- f - hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; //4分频 64/4= 16MHz
, S7 L- ^: S% d - hadc1.Init.Resolution = ADC_RESOLUTION_12B; //12位模式
& B) m) C# p& t* Y" W+ A2 E7 z, E& M - hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; //右对齐* Q/ }$ p S+ A; R* x
- hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; //ADC扫描模式 非 V8 ~; P8 E* v/ D$ w9 G) g
- hadc1.Init.EOCSelection = DISABLE; //关闭EOC中断 |- F6 r; X* R2 d$ t; Z: u
- hadc1.Init.LowPowerAutoWait = DISABLE; //低功耗自动等待模式
* P% ~% ~1 F( Y5 N - hadc1.Init.LowPowerAutoPowerOff = DISABLE; //低功耗自动掉电模式
8 f6 H& F9 ?1 }. z - hadc1.Init.ContinuousConvMode = DISABLE; //关闭连续转换& L# \$ {5 T( T/ T
- hadc1.Init.NbrOfConversion = 2;# u5 n+ \) H. t, N
- hadc1.Init.DiscontinuousConvMode = DISABLE;. Z7 i& G4 K# U2 w
- hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
! Z) b1 w! }; I) G0 x' k - hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
4 Y! Q4 S$ @' q" F - hadc1.Init.DMAContinuousRequests = DISABLE;! u* `( k8 ^' x
- hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;5 e4 k9 h$ W/ z6 A2 R0 h
- hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_1CYCLE_5;
3 F' Z/ B6 ^+ Q4 n" w0 b/ O - hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_1CYCLE_5;
! U3 Z4 B Q# b6 ~- x z8 \% F, T - hadc1.Init.OversamplingMode = DISABLE;
" R& P, [8 P( G, s - hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
$ C' }. N' h' v+ H0 v - : C0 @: `& ~) [7 Z: f0 r* g6 y
- if (HAL_ADC_Init(&hadc1) != HAL_OK)
q+ `/ x8 r& a1 Y9 w& x0 ~% ` - {% } P G5 s3 F% c
- Error_Handler();
9 o2 G) y0 n- r. Z5 Z" B - }: a J# I1 C3 Q) d
- }
复制代码
3 ]/ p; H' Y6 k+ a而ADC的读取函数,另外编写,
" L) @- v9 {7 }& ^ }3 ]6 e1 x
k! {- {& V8 p' @- uint16_t ADC_GET(uint32_t adc_ch)
- e4 f; R4 ~3 L" R( I K& A6 o - {* D. ]! `2 i, n# B% Z* f% \
- ADC_ChannelConfTypeDef sConfig;# S+ M5 H" X- v
- 5 k- {) V" H: h5 N( K
- sConfig.Channel = adc_ch;
, y4 E. H; ^4 ^( R - sConfig.Rank = ADC_REGULAR_RANK_1;
) U5 W& w2 |+ j; A - sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;
- U7 G! ^$ \- h- Q/ n8 w
4 n% x: B( k, V6 `- HAL_ADC_ConfigChannel(&hadc1, &sConfig);
+ K1 b, H) m3 d$ a+ ` - 1 ?, P3 v8 y5 j( r; x
- HAL_ADC_Start(&hadc1);! B9 ^% E% A: w( d$ q
- HAL_ADC_PollForConversion(&hadc1,10);
& c. i! G$ ]( X' ?6 g2 [
# x6 H5 [" x6 i- return HAL_ADC_GetValue(&hadc1);
& c& @( [2 Z! e( m) j; X' K0 s - }
复制代码 8 m, ^; x! L! q! {+ T
2 T5 {" m1 M4 v* q" j+ H最后讲程序烧写进去之后,将会发现一件很神奇的事情,# Y7 _/ D) r) H3 ]) ^
2 @' t" G; f( c- I9 l6 U3 r
: L, n2 i: v, i
& E, U* @5 }# \) `
会出现这样的情况。原因在于ADC初始化两个通道需要比较长的时间,而慢慢地会回归到正常值。在使用STM32F103ZET6的时候并没有出现这种情况。但是在STM32F429IG上也有过这种情况的出现,因此本虫认为G070RB的ADC功能并没有F1系列的好用。
: y6 r$ R- J" w6 B9 [' ]/ q, r- s; \
j) m, G; a8 S; G! B* q |