G0的介绍! j5 a, }, [8 ?0 e
G0是ST新推出的系列,我手上的是ST官方送出的STM32G070RB-NUCLEO板,在峰会上有幸获得。拿到这个板子的第一反应是觉得,它跟STM32F103RB长得好像啊,但一看原理图才发现,G0满满的IO口,IO的占用率高了好多.。% c/ t0 ]& j6 H1 N+ \$ ^
7 h9 C2 S. h. |, t3 A' n8 k% d7 W) a! @* n
) X, G* H' r- j# {/ `: H% ^安装好STM32CubeMX之后,打开一看,IO的复用也很多,片上外设很丰富,对于普通的控制使用,完全没问题。内置有64K的ROM和128K的flash,对于跑一些UCOSIII 或者RT_Thread等RTOS毫无压力,当然了,emwin这种GUI就算了。官板上,板载STlink,可以很方便的下载,且带有串口,连接的是G0的USART2,使用A2,A3复用。板载一个用户LED和一个用户按键,还有一个复位按键。" I' D% o8 N' j$ W8 x } L1 L
任何板子都从点灯开始
( \; I8 [0 |+ C' B) n* F4 p+ c3 i9 F
开始建立项目并点亮第一个灯3 f7 s D4 a! t% M( C
通过配置STM32CubeMX,配置好时钟等外设之后,从原理图上,可以找到LD4接的是A5这个引脚。通过在STM32CubeMX上将该引脚配置为推挽输出模式,点解生成代码即可。STM32CubeMX使用的是HAL库,所以要让LD4交替闪烁,我们使用HAL库上的API
6 m: G5 g& ]% J1 C
. N" c! M0 p' @ Z8 ^8 C使用这个API函数,再使用
! M1 S A& [1 q6 o
+ w$ M0 p! P+ r7 `3 n% I则LD4可以以500MS的时间交替闪烁。而这整个过程,只要熟悉了STM32CubeMX,都可以很快建立好工程并实现控制效果。( o# ?- K; h9 z$ P. g' b
: i7 b9 y/ `, |配置ADC
. O5 T" `+ H$ E# ?通过STM32CubeMX,配置A1,A2两个管脚,复用为ADC功能。ADC的配置程序如下:
' t7 o# l5 _( T+ q
7 K; Q! p+ Y2 u" Y0 {- void adc1_init(void)
3 i( n5 Q; n- ^ - {0 f8 h) d1 y7 r" O' s7 G
- GPIO_InitTypeDef GPIO_Init;
: G% j7 u* v& p o% \" j. X - __HAL_RCC_GPIOA_CLK_ENABLE();" v0 d0 W$ d% C9 G E# o
- __HAL_RCC_ADC_CLK_ENABLE(); //开启ADC时钟# `1 r! c, \& h) x4 g# r
, \8 q8 f7 \9 Y0 [# ?: }' i- GPIO_Init.Pin = GPIO_PIN_0|GPIO_PIN_1;
4 h; M. d- t# E0 ^) ` - GPIO_Init.Mode = GPIO_MODE_ANALOG;" h: l4 n; u; J
- GPIO_Init.Pull = GPIO_NOPULL;
/ ~$ c) M- d$ P* C - HAL_GPIO_Init(GPIOA, &GPIO_Init);
' ]0 P' h' l1 h) K) ~2 H - 6 w' |+ q7 k A- Z! ]) j
- hadc1.Instance = ADC1;
9 U: M9 V4 K" v" N! S - hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; //4分频 64/4= 16MHz- j1 P/ s* V) H
- hadc1.Init.Resolution = ADC_RESOLUTION_12B; //12位模式 j* ?% ?9 h7 w2 Q' ]
- hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; //右对齐8 V- Z& c2 t0 b" B) p' x4 s
- hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; //ADC扫描模式 非 [( [" M. E/ o3 X4 E
- hadc1.Init.EOCSelection = DISABLE; //关闭EOC中断/ n! I. y; U: R8 }
- hadc1.Init.LowPowerAutoWait = DISABLE; //低功耗自动等待模式8 H8 b1 E+ ]: s9 Y0 I
- hadc1.Init.LowPowerAutoPowerOff = DISABLE; //低功耗自动掉电模式3 f3 q6 F, B; O' s9 ?* F
- hadc1.Init.ContinuousConvMode = DISABLE; //关闭连续转换
$ x4 m9 c2 c7 s+ i5 ` - hadc1.Init.NbrOfConversion = 2;2 _9 P \- Y/ U. W: ]7 P
- hadc1.Init.DiscontinuousConvMode = DISABLE;
: T8 O8 B8 n, c3 W1 T) g - hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
% S6 k+ r% }& \' d - hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;; k' ~0 [& A8 x( a6 J
- hadc1.Init.DMAContinuousRequests = DISABLE;* _- j- Z7 f8 s, X3 Y$ {5 Z
- hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
- a' Z7 H8 ~" n2 g - hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_1CYCLE_5;
* {: r9 Z+ P; n! @ - hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_1CYCLE_5;8 H2 c. _+ E2 ?9 l( z. j x$ \
- hadc1.Init.OversamplingMode = DISABLE;, T* g$ c: k% e2 w) @" q' `
- hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
( T9 }6 `' D% ~( z# J - + Q* d3 V) x/ M) t, A6 Y# Z4 F2 h; F
- if (HAL_ADC_Init(&hadc1) != HAL_OK)
; N2 R6 L) l7 D - {/ x) t1 I3 o+ C( E
- Error_Handler();
4 H- z2 h& T2 w, r - }% Q* w: H5 h! T5 t' U4 O) e. e
- }
复制代码
- {6 J+ L$ w: U& T' X而ADC的读取函数,另外编写,) D2 d4 T; H* ]- p$ v
! R& Q: D4 E8 o8 ~6 b' }3 z1 B
- uint16_t ADC_GET(uint32_t adc_ch) 3 ^! y" m4 O2 `% O! A& j* J3 \
- {
8 u# S5 H* R$ B0 j7 L+ J - ADC_ChannelConfTypeDef sConfig;
. I! a' h# k! s) e8 V# `
$ ~, |5 x4 F: h3 Y2 O- sConfig.Channel = adc_ch;( ]0 D& V( w$ Z! ~
- sConfig.Rank = ADC_REGULAR_RANK_1;
2 _4 r2 j% l4 l9 m - sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;# h: ^+ [; a& B# x, i
1 N: p1 W( y D/ x: v- HAL_ADC_ConfigChannel(&hadc1, &sConfig);5 b& d- d, f! `3 H0 `
4 b9 d+ w- D2 A+ r% w" v* E8 q2 }( b- HAL_ADC_Start(&hadc1);8 v/ z5 [7 U- k! t* X
- HAL_ADC_PollForConversion(&hadc1,10);% O' s* `( U( W8 @ s& ~
- ! d% K: d- I q' r3 T
- return HAL_ADC_GetValue(&hadc1);
. i: N7 D+ R; T: m! F, ~ D - }
复制代码 ! E4 L, D% k: O
; \: b) \& f" I, a最后讲程序烧写进去之后,将会发现一件很神奇的事情,; z6 d+ t/ ^/ b; Y( ^# ~
\' y4 g: |5 G, `- V+ x
' u) K% X3 P) U; W& q( q; v
6 S0 M8 N& F4 w: R8 {, _会出现这样的情况。原因在于ADC初始化两个通道需要比较长的时间,而慢慢地会回归到正常值。在使用STM32F103ZET6的时候并没有出现这种情况。但是在STM32F429IG上也有过这种情况的出现,因此本虫认为G070RB的ADC功能并没有F1系列的好用。( ^; A/ e5 v3 ]3 {
$ C1 e' I% b% n/ f0 X8 n4 }
* i4 k9 x: B0 C2 V |