G0的介绍; B2 F! e8 M8 P* V3 g& E0 w5 [
G0是ST新推出的系列,我手上的是ST官方送出的STM32G070RB-NUCLEO板,在峰会上有幸获得。拿到这个板子的第一反应是觉得,它跟STM32F103RB长得好像啊,但一看原理图才发现,G0满满的IO口,IO的占用率高了好多.。
( {7 u3 x7 b! y' z* h; K, R d* s9 @5 `7 q- m
3 |: ~7 F. v- o u5 H: C
8 `6 d0 J/ ]. }安装好STM32CubeMX之后,打开一看,IO的复用也很多,片上外设很丰富,对于普通的控制使用,完全没问题。内置有64K的ROM和128K的flash,对于跑一些UCOSIII 或者RT_Thread等RTOS毫无压力,当然了,emwin这种GUI就算了。官板上,板载STlink,可以很方便的下载,且带有串口,连接的是G0的USART2,使用A2,A3复用。板载一个用户LED和一个用户按键,还有一个复位按键。& ^, s! r) D* u( d" d; ?- W# }7 G
任何板子都从点灯开始
9 V- L- O1 T/ f" r- o0 H: x7 i
7 ]: `5 p+ v( ? B A* O0 T开始建立项目并点亮第一个灯5 p C2 F$ ?1 J4 j! D& j: D
通过配置STM32CubeMX,配置好时钟等外设之后,从原理图上,可以找到LD4接的是A5这个引脚。通过在STM32CubeMX上将该引脚配置为推挽输出模式,点解生成代码即可。STM32CubeMX使用的是HAL库,所以要让LD4交替闪烁,我们使用HAL库上的API* K3 R3 o! p* T4 q0 A
+ h8 g4 x9 N, y使用这个API函数,再使用
6 R8 f. p# W3 K! | {则LD4可以以500MS的时间交替闪烁。而这整个过程,只要熟悉了STM32CubeMX,都可以很快建立好工程并实现控制效果。
/ n a) I R: `- Y) u. D& [ g7 T+ h/ d% k7 T! P2 g
配置ADC) K, ]; t& {- g; T
通过STM32CubeMX,配置A1,A2两个管脚,复用为ADC功能。ADC的配置程序如下:. X1 U; h: h! ?, M/ V: A1 R
# |* a- z2 y; O- Y6 u7 I1 O- void adc1_init(void) # J) w" E. \7 ? b
- { b J9 E) Y: d
- GPIO_InitTypeDef GPIO_Init;
6 R* A" ?7 M9 _( \4 K/ M* ]3 P; { - __HAL_RCC_GPIOA_CLK_ENABLE();
$ `7 r& \$ q: v; } - __HAL_RCC_ADC_CLK_ENABLE(); //开启ADC时钟) y9 H! H c0 E4 ~- L- b0 } T' k
- " n2 k0 u8 h6 X$ L! \
- GPIO_Init.Pin = GPIO_PIN_0|GPIO_PIN_1;9 i H5 F8 |; C. q z3 v7 z
- GPIO_Init.Mode = GPIO_MODE_ANALOG;
$ g: V- {; V# c& A - GPIO_Init.Pull = GPIO_NOPULL;
3 p4 E* C$ S: \; e2 g, U - HAL_GPIO_Init(GPIOA, &GPIO_Init);
( s9 v; Q" E9 k; r- R - 9 n" a5 V- S5 l( _2 Z+ E: F
- hadc1.Instance = ADC1;
! ]. S, r" ?4 B3 }: E9 O - hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; //4分频 64/4= 16MHz. @+ F0 g7 U: a7 W- j) V
- hadc1.Init.Resolution = ADC_RESOLUTION_12B; //12位模式# H- u |! @& ^4 @- j: ?0 R$ U% o
- hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; //右对齐
. P& x! N4 o; d7 ]5 i - hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; //ADC扫描模式 非% C X. v0 f" X7 m( X
- hadc1.Init.EOCSelection = DISABLE; //关闭EOC中断8 [8 K6 k7 m( O% Y/ C. e. G
- hadc1.Init.LowPowerAutoWait = DISABLE; //低功耗自动等待模式
0 U* G8 V( a3 G# { m/ O - hadc1.Init.LowPowerAutoPowerOff = DISABLE; //低功耗自动掉电模式
o- o5 E' \; B) K - hadc1.Init.ContinuousConvMode = DISABLE; //关闭连续转换
# F" k2 Y! G" ]8 H) X5 ?' F/ [ - hadc1.Init.NbrOfConversion = 2;5 w) Q* v' B$ J1 L9 u1 g# y
- hadc1.Init.DiscontinuousConvMode = DISABLE;
/ d- s: s* `' h s% n) Z, Z; ^/ U' C - hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;2 m ^0 ~ E) r" Z
- hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;+ r* e0 E% z( j4 V
- hadc1.Init.DMAContinuousRequests = DISABLE;$ w0 D4 }' D/ C+ X$ g: l( m5 D
- hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;8 r9 O# y( w0 z3 X6 K" ` [
- hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_1CYCLE_5;
8 V9 g3 W1 e6 l2 d f - hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_1CYCLE_5;
5 \: e2 d' [3 S2 i9 s! w7 K( n! X - hadc1.Init.OversamplingMode = DISABLE;7 M0 u& ]9 P% }$ C) u
- hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
# y4 Q3 V0 ]( |) k: f
& i+ S- n0 C2 w6 y9 v- if (HAL_ADC_Init(&hadc1) != HAL_OK), Y1 g# o& @" t
- {: Z. P, z9 L b. [5 t1 u6 ^
- Error_Handler();
+ ]% g5 ~* v1 R: C/ o - }
复制代码 % l6 ]: Y- R* i. k/ B
而ADC的读取函数,另外编写,
. a$ e% R: a$ f4 a# {, I% F
4 r; h+ I7 S) j: m- uint16_t ADC_GET(uint32_t adc_ch) ! [. @- e8 l& `# d4 A# O
- {5 e- R# r" E6 Q
- ADC_ChannelConfTypeDef sConfig;
: E0 [5 O, h5 h) z- u- K, k) M - 5 r- N5 ]7 ~, ^0 p' a3 ~- w
- sConfig.Channel = adc_ch;
2 G0 v& ?& D; P3 u4 Z9 L. g - sConfig.Rank = ADC_REGULAR_RANK_1;- o1 k+ e* Z; H+ A3 a' o' d
- sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;
" {# P2 K* p' q# y7 L
6 K1 x1 r, {+ z" m b- HAL_ADC_ConfigChannel(&hadc1, &sConfig);
- }% O9 l4 X( d' c* j6 K4 m% M! L - 8 S/ Y$ @# N4 @
- HAL_ADC_Start(&hadc1);4 |- J6 o$ z3 T7 Y: n: L: _9 _
- HAL_ADC_PollForConversion(&hadc1,10);
+ s3 N% q, e* k; ~4 ~( _* @
1 Z( N2 N- y) @7 g- return HAL_ADC_GetValue(&hadc1);
- O( D0 x$ t6 f7 i6 b - }
复制代码
) s {8 h$ w" F0 O/ Y最后讲程序烧写进去之后,将会发现一件很神奇的事情,# \ d9 q$ { s$ ?
! E# L- c* @) t3 x
会出现这样的情况。原因在于ADC初始化两个通道需要比较长的时间,而慢慢地会回归到正常值。在使用STM32F103ZET6的时候并没有出现这种情况。但是在STM32F429IG上也有过这种情况的出现,因此本虫认为G070RB的ADC功能并没有F1系列的好用。) m8 G: _/ a1 ^* @/ C, I, a
6 q) Z; \- @9 L7 D. Z1 p
' d, Q+ _) p& y' b. `* @0 B |