G0的介绍. w5 r8 B! l; V, Q8 u3 n
G0是ST新推出的系列,我手上的是ST官方送出的STM32G070RB-NUCLEO板,在峰会上有幸获得。拿到这个板子的第一反应是觉得,它跟STM32F103RB长得好像啊,但一看原理图才发现,G0满满的IO口,IO的占用率高了好多.。' C5 @- T- B, A: y3 a/ I4 J# [
7 k6 i p1 ]: B" e4 p/ J! _3 m! i
! s, A0 C# @' O! Q1 R
) H5 q5 e$ l1 Q; n7 s% O安装好STM32CubeMX之后,打开一看,IO的复用也很多,片上外设很丰富,对于普通的控制使用,完全没问题。内置有64K的ROM和128K的flash,对于跑一些UCOSIII 或者RT_Thread等RTOS毫无压力,当然了,emwin这种GUI就算了。官板上,板载STlink,可以很方便的下载,且带有串口,连接的是G0的USART2,使用A2,A3复用。板载一个用户LED和一个用户按键,还有一个复位按键。" s. [/ Y3 @! z5 n' E
任何板子都从点灯开始. b6 x( q. ~$ x5 ?/ o* b
: x% x! F3 C# a( X7 {3 i2 V开始建立项目并点亮第一个灯" p/ s7 j5 K$ C8 m
通过配置STM32CubeMX,配置好时钟等外设之后,从原理图上,可以找到LD4接的是A5这个引脚。通过在STM32CubeMX上将该引脚配置为推挽输出模式,点解生成代码即可。STM32CubeMX使用的是HAL库,所以要让LD4交替闪烁,我们使用HAL库上的API
* V7 i( r% L. e! f- `9 N+ H
) s; s4 Q" B/ Q1 W2 w4 k2 L7 J使用这个API函数,再使用9 g2 M% x, _, G( x; H) E% R
则LD4可以以500MS的时间交替闪烁。而这整个过程,只要熟悉了STM32CubeMX,都可以很快建立好工程并实现控制效果。$ r. B! q0 D3 ?% ]
6 M- Q! a+ z: y1 j9 h. L
配置ADC
/ D- I. j/ E6 ~! d6 s; m6 h& m; U通过STM32CubeMX,配置A1,A2两个管脚,复用为ADC功能。ADC的配置程序如下:5 x1 a. ^; L2 a3 K9 \ @) V4 F8 h
- q7 ]" H' w5 b5 J' I. U8 l: D
- void adc1_init(void)
) E6 O5 O0 @$ z. d0 Y, j - {
8 y1 v! J$ x: E7 S( j, R8 e - GPIO_InitTypeDef GPIO_Init;6 T& W$ h& c' ?( V
- __HAL_RCC_GPIOA_CLK_ENABLE();
! C9 h$ O% w& M& F6 F( Y - __HAL_RCC_ADC_CLK_ENABLE(); //开启ADC时钟
9 ^0 r0 X. a$ L. n+ y - " i2 g* k! l4 |2 V/ T
- GPIO_Init.Pin = GPIO_PIN_0|GPIO_PIN_1;
* H5 t1 b0 u5 E( [1 v+ j - GPIO_Init.Mode = GPIO_MODE_ANALOG;9 z# d9 i% ?4 m
- GPIO_Init.Pull = GPIO_NOPULL;
7 M. t% T( s' A O* R - HAL_GPIO_Init(GPIOA, &GPIO_Init);8 T! { Y1 h- B6 T' d
; \" k/ E5 `/ J/ \9 k- hadc1.Instance = ADC1; ) c2 y$ x# q+ p; N1 V2 s
- hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; //4分频 64/4= 16MHz
7 ]* ]! `1 a9 i, U, ?0 R* v - hadc1.Init.Resolution = ADC_RESOLUTION_12B; //12位模式
. g H. H4 J+ _7 R- J - hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; //右对齐
. C% k# y& k: L - hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; //ADC扫描模式 非
* N2 z' Y1 D8 P) G$ x, `+ I - hadc1.Init.EOCSelection = DISABLE; //关闭EOC中断" t4 S# H' Y; b7 h
- hadc1.Init.LowPowerAutoWait = DISABLE; //低功耗自动等待模式
5 X( @" s$ c( `1 l9 W! E( O - hadc1.Init.LowPowerAutoPowerOff = DISABLE; //低功耗自动掉电模式
) l0 q! L O x* i2 g; A1 W! k- H - hadc1.Init.ContinuousConvMode = DISABLE; //关闭连续转换
0 @: o6 }# a' s' x* d8 e0 `' o+ R - hadc1.Init.NbrOfConversion = 2;5 {. l6 b' r" L
- hadc1.Init.DiscontinuousConvMode = DISABLE;) Q# u( x8 B" b" I$ {6 l6 S
- hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
. X' x0 c- O8 Y6 f - hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;8 O6 K% Q3 u- o- ]1 S
- hadc1.Init.DMAContinuousRequests = DISABLE;
7 P4 o3 y% n7 R6 j# w - hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
0 {7 S6 d, v6 O; L' o - hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_1CYCLE_5;/ e6 h/ c5 _' N5 a8 t
- hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_1CYCLE_5;
2 N& a. C1 g9 o0 u$ w3 d4 ~0 C' b - hadc1.Init.OversamplingMode = DISABLE;
4 O6 E/ X( s+ ^0 p& Q. c" P - hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
4 I; u" ^9 e, n! i9 _6 A - + C' k) u8 l$ D; @$ E9 C* A& U! ?
- if (HAL_ADC_Init(&hadc1) != HAL_OK); ?4 v, X6 a" C( C
- {) {, r0 g4 W% s. `8 \# Y
- Error_Handler();2 t ~4 P7 a3 _
- }
复制代码
- K) A1 f' z* |8 G而ADC的读取函数,另外编写,# u6 F! w7 L& p! _5 l
& ]* U, M+ l d" b4 s+ y
- uint16_t ADC_GET(uint32_t adc_ch) # b) w6 _ V: a$ M3 m+ j; F3 M+ _) y {
- {! L! x0 j" `; U1 N
- ADC_ChannelConfTypeDef sConfig;
9 `* f2 A4 p( ^& y9 G - 3 o% l8 W _5 ~! ]3 |' y; k
- sConfig.Channel = adc_ch;
, {+ r4 S* c8 s l& i/ |2 p9 K - sConfig.Rank = ADC_REGULAR_RANK_1;
, P; z2 J7 @/ v0 L9 E) D. O - sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;
: D- L: a0 t/ k
) E+ X; O- [% M. R$ W2 y- HAL_ADC_ConfigChannel(&hadc1, &sConfig);# F; u7 j" L) L6 E: Z' f( N
- 6 w: K: @- w. }; r5 e2 @' A
- HAL_ADC_Start(&hadc1);
) p! Y' {; w' K" c - HAL_ADC_PollForConversion(&hadc1,10);
6 L: D# Q: {# p, @
h" | D+ w& I$ R# c/ r& M+ |3 D- return HAL_ADC_GetValue(&hadc1);
! z9 w# d8 P* k- c( o - }
复制代码
: x( z4 o5 ?. |$ k6 O. s最后讲程序烧写进去之后,将会发现一件很神奇的事情,
( h( J% B' u5 M. \3 U0 \: k( ?6 r$ O5 {9 W
会出现这样的情况。原因在于ADC初始化两个通道需要比较长的时间,而慢慢地会回归到正常值。在使用STM32F103ZET6的时候并没有出现这种情况。但是在STM32F429IG上也有过这种情况的出现,因此本虫认为G070RB的ADC功能并没有F1系列的好用。5 J a, ~) z" l
( \) l3 y f& {6 Q9 ^
( x, L$ u2 C+ g# j* t. \ |