G0的介绍
( z# _1 ]% ?7 H* y8 j2 c& xG0是ST新推出的系列,我手上的是ST官方送出的STM32G070RB-NUCLEO板,在峰会上有幸获得。拿到这个板子的第一反应是觉得,它跟STM32F103RB长得好像啊,但一看原理图才发现,G0满满的IO口,IO的占用率高了好多.。
$ b# n& w+ p2 U8 p3 ]: `
% q: [5 T: r3 C& Z: |8 }, h3 W+ M3 b" v+ P! e
8 ?" U3 I) p/ z8 b
安装好STM32CubeMX之后,打开一看,IO的复用也很多,片上外设很丰富,对于普通的控制使用,完全没问题。内置有64K的ROM和128K的flash,对于跑一些UCOSIII 或者RT_Thread等RTOS毫无压力,当然了,emwin这种GUI就算了。官板上,板载STlink,可以很方便的下载,且带有串口,连接的是G0的USART2,使用A2,A3复用。板载一个用户LED和一个用户按键,还有一个复位按键。1 `' e8 o: Y* n
任何板子都从点灯开始3 \5 g) c6 N5 F$ }7 [% j
- Q- |. O' }6 z1 t1 W% C* g
开始建立项目并点亮第一个灯
5 ?1 @; W! L. U. e, I! d W通过配置STM32CubeMX,配置好时钟等外设之后,从原理图上,可以找到LD4接的是A5这个引脚。通过在STM32CubeMX上将该引脚配置为推挽输出模式,点解生成代码即可。STM32CubeMX使用的是HAL库,所以要让LD4交替闪烁,我们使用HAL库上的API
2 C* z; e2 g+ l4 f( [
6 U( q0 U! v, K$ h1 H使用这个API函数,再使用
5 ^: F- {$ H' Z p则LD4可以以500MS的时间交替闪烁。而这整个过程,只要熟悉了STM32CubeMX,都可以很快建立好工程并实现控制效果。
! p/ e$ i& |) M4 L
/ V6 P- r K* `配置ADC2 D @/ P! c. ~ E
通过STM32CubeMX,配置A1,A2两个管脚,复用为ADC功能。ADC的配置程序如下:
2 Y2 l9 L, u5 h* r8 p6 ^0 F$ \; h
4 B- S5 v+ T/ z: l8 [- void adc1_init(void)
# E$ |3 Q: \" g9 ]% C - {
8 @" A9 H7 x% R/ G; C- E - GPIO_InitTypeDef GPIO_Init;1 P8 w& E; ^" Q
- __HAL_RCC_GPIOA_CLK_ENABLE();
: C; E$ D8 s9 S* I) A3 j+ s6 i - __HAL_RCC_ADC_CLK_ENABLE(); //开启ADC时钟
1 N! Q0 G3 x6 m2 ~ - # r0 c- T3 P" k7 @$ G
- GPIO_Init.Pin = GPIO_PIN_0|GPIO_PIN_1;
3 I- _3 |& L) w$ L- j - GPIO_Init.Mode = GPIO_MODE_ANALOG;
0 X( y. P" d* r" }9 ] - GPIO_Init.Pull = GPIO_NOPULL;' _8 |, {4 C3 J& b$ P, n9 Y# J3 b. d
- HAL_GPIO_Init(GPIOA, &GPIO_Init);3 @$ y0 u2 F- X+ \8 f7 b
3 a0 U; o8 s5 [% @! M1 T$ Z" r- hadc1.Instance = ADC1; 4 ]' C/ O. j+ h+ B2 M- R, x2 @
- hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; //4分频 64/4= 16MHz' N: g* R1 ~: M& H0 h l
- hadc1.Init.Resolution = ADC_RESOLUTION_12B; //12位模式% E; j5 |+ |: E" h
- hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; //右对齐
. b/ z3 y8 C$ ^4 |9 s - hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; //ADC扫描模式 非. j9 o0 u5 R4 u4 O
- hadc1.Init.EOCSelection = DISABLE; //关闭EOC中断
) N$ ^7 W) Y# A3 u6 T - hadc1.Init.LowPowerAutoWait = DISABLE; //低功耗自动等待模式; I7 ~6 j2 Y. Z8 W7 h1 [8 A
- hadc1.Init.LowPowerAutoPowerOff = DISABLE; //低功耗自动掉电模式+ R0 I3 L* z7 R9 g$ P8 R
- hadc1.Init.ContinuousConvMode = DISABLE; //关闭连续转换
3 t$ p d" b) D7 b: q4 f - hadc1.Init.NbrOfConversion = 2;, s/ h# s) O/ N6 o2 V; u
- hadc1.Init.DiscontinuousConvMode = DISABLE;2 e& f5 _/ h$ S8 p9 e
- hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
* Q. z* S# X8 f; j. n - hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
& c& }( g9 M+ I/ W* u9 M - hadc1.Init.DMAContinuousRequests = DISABLE;9 J' G1 C; g8 r
- hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
- w5 u# K& m8 ?. b/ _$ z - hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_1CYCLE_5;
1 B4 [$ {2 K: r* V, G - hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_1CYCLE_5;9 Y/ Z O3 n P3 C
- hadc1.Init.OversamplingMode = DISABLE;
' y5 _2 D1 n4 b* q { - hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
. I3 d; V* Y; h* t: i6 R - 4 `3 I6 |+ o7 K3 j
- if (HAL_ADC_Init(&hadc1) != HAL_OK) i! r( Z5 R8 c; e E/ A& U5 Z9 x
- {1 w6 D' p( P3 B1 n _
- Error_Handler();$ l0 U* |1 g: R5 |8 f
- }
复制代码
* c/ Q& Q! m; [8 a' Z( S w而ADC的读取函数,另外编写,
; v8 Y' V1 k$ P0 }, |" e2 b4 y% e
2 S5 |% [3 u) A7 r2 y0 ]; H- uint16_t ADC_GET(uint32_t adc_ch)
8 E) \" g3 r! W0 Q' P - {
9 f5 ~' A6 t. _. U7 m! [ - ADC_ChannelConfTypeDef sConfig;
) {- ]7 ~1 Q5 L2 W" g: W# L
4 x1 T- k H$ y$ o- sConfig.Channel = adc_ch;1 F! e4 g3 Y: U# N" E, {
- sConfig.Rank = ADC_REGULAR_RANK_1;
6 c; v! c4 x6 K; K+ K - sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;
4 B: p( \- d8 i: M
+ d' I4 P% O2 Q Q- HAL_ADC_ConfigChannel(&hadc1, &sConfig);
1 I: Q, y, a0 \. c! h+ P& o F+ ^
4 _6 g6 g6 [+ {# N! ^* s7 y- ]- HAL_ADC_Start(&hadc1);% `- x4 r: `5 i; Y
- HAL_ADC_PollForConversion(&hadc1,10);
: r) f4 J$ ~, N
) T5 G3 t- {8 `- return HAL_ADC_GetValue(&hadc1);( i, d4 [" Q4 e4 O0 m7 ^7 F4 F* n
- }
复制代码
- F/ ?% {5 }* E8 A! z: Y1 X. `3 |最后讲程序烧写进去之后,将会发现一件很神奇的事情,
$ _' u" g1 N* H, w( Q! r* ]/ w& y# P5 i$ P2 j: n5 R+ }
会出现这样的情况。原因在于ADC初始化两个通道需要比较长的时间,而慢慢地会回归到正常值。在使用STM32F103ZET6的时候并没有出现这种情况。但是在STM32F429IG上也有过这种情况的出现,因此本虫认为G070RB的ADC功能并没有F1系列的好用。
+ G ?/ {6 q4 _+ @# J, W
& {" c5 G) h/ O6 Y) K/ X# _* J& m
, y4 T' x- m" j( t2 U; p |