你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32G0-NUCLEO测试

[复制链接]
STMCU小助手 发布时间:2021-12-9 10:26
G0的介绍, ~8 @8 H. L* q, C
G0是ST新推出的系列,我手上的是ST官方送出的STM32G070RB-NUCLEO板,在峰会上有幸获得。拿到这个板子的第一反应是觉得,它跟STM32F103RB长得好像啊,但一看原理图才发现,G0满满的IO口,IO的占用率高了好多.。( y5 K) `$ J; s' W8 {
" P& q, z8 \4 C& I9 V/ I
20190721155641195.png

9 {9 k, Q4 }. h( S3 f/ W7 H& ^" w# k: w/ H) D) U
安装好STM32CubeMX之后,打开一看,IO的复用也很多,片上外设很丰富,对于普通的控制使用,完全没问题。内置有64K的ROM和128K的flash,对于跑一些UCOSIII 或者RT_Thread等RTOS毫无压力,当然了,emwin这种GUI就算了。官板上,板载STlink,可以很方便的下载,且带有串口,连接的是G0的USART2,使用A2,A3复用。板载一个用户LED和一个用户按键,还有一个复位按键。  k. Y% \/ E1 {
任何板子都从点灯开始* U! v7 Y2 o6 d, T  x2 A" J

' A6 U) S7 I! `2 q7 R4 X开始建立项目并点亮第一个灯
2 L, U4 A! R5 l6 W/ m' q通过配置STM32CubeMX,配置好时钟等外设之后,从原理图上,可以找到LD4接的是A5这个引脚。通过在STM32CubeMX上将该引脚配置为推挽输出模式,点解生成代码即可。STM32CubeMX使用的是HAL库,所以要让LD4交替闪烁,我们使用HAL库上的API* I( C, c1 |7 x: d
  1. HAL_GPIO_TogglePin()
复制代码

6 R3 e# d% p5 K( B1 w/ ?+ f使用这个API函数,再使用
; C' i# l+ E5 x3 l0 g$ G% e) B; z
  1. HAL_Delay(500),
复制代码

$ h& `" v# K' ^* b则LD4可以以500MS的时间交替闪烁。而这整个过程,只要熟悉了STM32CubeMX,都可以很快建立好工程并实现控制效果。4 e- p/ R1 ^3 ]) F+ v
0 Z) _8 B& ^5 V0 U" i, y1 q
配置ADC" e$ N; U/ q+ _& ]7 {% j! c
通过STM32CubeMX,配置A1,A2两个管脚,复用为ADC功能。ADC的配置程序如下:
2 d# Q4 ^7 {( p7 e
, M& G4 o7 T% f$ O( W/ j
  1. void adc1_init(void)
    % a! Q  I8 b; }+ @. G8 t* x8 |; R
  2. {
    ( U1 F! }; n+ R% s0 k3 f
  3.     GPIO_InitTypeDef GPIO_Init;  H" R$ A2 ]8 h. F+ H
  4.     __HAL_RCC_GPIOA_CLK_ENABLE();6 u6 l% d. @2 D
  5.     __HAL_RCC_ADC_CLK_ENABLE();  //开启ADC时钟) F% q4 e! X' e" c7 l
  6.   W' F# [, I* a
  7. GPIO_Init.Pin = GPIO_PIN_0|GPIO_PIN_1;5 [) X( Q8 N/ [9 ^3 c! y
  8. GPIO_Init.Mode = GPIO_MODE_ANALOG;
    $ O2 b1 m/ v# Z$ }# J: _9 f
  9. GPIO_Init.Pull = GPIO_NOPULL;
    * Y! P1 ], u' K2 x, C
  10. HAL_GPIO_Init(GPIOA, &GPIO_Init);9 q7 E8 \# b+ b" O) Y

  11. ! L1 T5 d4 N4 U+ t8 G7 ~9 X
  12. hadc1.Instance = ADC1;          * Y8 ?' S2 s& W( y& x
  13. hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;   //4分频 64/4= 16MHz
    . K; ]7 O7 @) b# t
  14. hadc1.Init.Resolution = ADC_RESOLUTION_12B;             //12位模式
    * }. E6 g; b4 I+ W* [$ Q* u9 X
  15. hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;             //右对齐
    $ M9 V* y4 n, a$ @) J  S7 s! Y
  16. hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;             //ADC扫描模式  非$ S* ?( c" x7 i% G/ p% r+ s7 U
  17. hadc1.Init.EOCSelection = DISABLE;                      //关闭EOC中断
    ) z  o; I  Z  z
  18. hadc1.Init.LowPowerAutoWait = DISABLE;                  //低功耗自动等待模式
    . z0 Z7 W1 o7 R. j; ]: X4 l
  19. hadc1.Init.LowPowerAutoPowerOff = DISABLE;              //低功耗自动掉电模式
    / [5 n4 @% o! N% B8 q
  20. hadc1.Init.ContinuousConvMode = DISABLE;                 //关闭连续转换
    " r- t' S5 U4 v; O
  21. hadc1.Init.NbrOfConversion = 2;2 I+ Y, M' l0 W+ b) k0 n- ?5 i
  22. hadc1.Init.DiscontinuousConvMode = DISABLE;! _3 ]: C1 r& v* N1 Q
  23. hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;( a) \6 x, q0 ?( p$ X% N8 j3 j
  24. hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;( T* ?# J8 ]5 _0 o0 w
  25. hadc1.Init.DMAContinuousRequests = DISABLE;9 E  `! W( |4 {" ^& K
  26. hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;$ @" Y0 S" q2 X9 k/ K0 L" `& O
  27. hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_1CYCLE_5;
    ; S4 M6 i7 b/ i5 Z3 _1 R3 w
  28. hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_1CYCLE_5;
    1 ~  C# y4 q7 H6 O
  29. hadc1.Init.OversamplingMode = DISABLE;. f& g  P- y+ j! S$ U
  30. hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
    5 U* k$ L/ f8 c* d

  31. 8 C) j  s. n7 D" |
  32. if (HAL_ADC_Init(&hadc1) != HAL_OK)+ q5 N/ N* i" B/ d/ g  Q! r
  33. {0 O+ @4 a- G) s; w
  34.       Error_Handler();
    2 E: Y! N4 p4 C! i2 P+ i  C/ a
  35.     }
    ; e) Y: j3 B$ L* M$ S& f
  36. }
复制代码

0 K3 ^* w$ E. w而ADC的读取函数,另外编写,
+ y4 y5 B$ {- _% K8 R+ }! a0 A6 [8 B/ Q% h1 d; m. \9 w1 c9 }: P7 x1 G, s: s
  1. uint16_t ADC_GET(uint32_t adc_ch)
    0 H; m9 Y& F7 t5 R3 ], W' q
  2. {" L! L& Q. `8 {* t0 B# V, c! N
  3.     ADC_ChannelConfTypeDef sConfig;: ^$ M+ a" t; h$ R) ?# \: [

  4. ( Y+ _( S: N: e+ }* \
  5.     sConfig.Channel = adc_ch;
    7 e2 T) Q1 a. Z7 R. d) j
  6.     sConfig.Rank = ADC_REGULAR_RANK_1;
    5 q5 c( E$ s$ }' a& @( Y( v
  7.     sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;
    $ `3 O8 p! h  `0 A% r3 }) o+ Y
  8. : w$ ~8 b: n1 U$ z6 R; k  y
  9.     HAL_ADC_ConfigChannel(&hadc1, &sConfig);/ b, d# @  s& J( e  S
  10. 5 M2 U+ B( @5 o1 K) G
  11.     HAL_ADC_Start(&hadc1);
    1 }; z0 {4 z1 {6 k: W
  12.     HAL_ADC_PollForConversion(&hadc1,10);
    6 E; ?* F: ]2 u; c

  13. $ v0 i+ \- Q: r& O+ [8 U
  14.     return HAL_ADC_GetValue(&hadc1);
    0 h) C; a* i9 Q- x
  15. }
复制代码

+ r; p, g, J' i3 P0 t
% |8 K# z$ A8 i; ~4 L6 R9 ]( k( E8 q最后讲程序烧写进去之后,将会发现一件很神奇的事情,  a) [" z3 X) `

5 k& |) I/ B0 o- f5 n" v3 ^
20190729163347613.png

9 L( D: u1 \* x
. g. x2 k: M1 N! m' |0 Y会出现这样的情况。原因在于ADC初始化两个通道需要比较长的时间,而慢慢地会回归到正常值。在使用STM32F103ZET6的时候并没有出现这种情况。但是在STM32F429IG上也有过这种情况的出现,因此本虫认为G070RB的ADC功能并没有F1系列的好用。" T( ^' k; B& }8 Z) [0 [% M1 N2 ]

) X% A6 M7 s1 i- h' \# _  {# h/ P3 _! r! o( g  V; ?/ |, d
赞 收藏 评论0 发布时间:2021-12-9 10:26

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版