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

【经验分享】STM32G0-NUCLEO测试

[复制链接]
STMCU小助手 发布时间:2021-11-7 22:09
G0的介绍, G% s. [# l, ?, M5 ?
G0是ST新推出的系列,我手上的是ST官方送出的STM32G070RB-NUCLEO板,在峰会上有幸获得。拿到这个板子的第一反应是觉得,它跟STM32F103RB长得好像啊,但一看原理图才发现,G0满满的IO口,IO的占用率高了好多.。  B' @' b1 x; p- A0 q

4 @% t; s& l; |. x* o, r" I& i
20190721155641195.png
* E& y, v3 ~3 S6 x& c3 J( s1 _+ K
& M. W% W1 I) q  ^/ X
安装好STM32CubeMX之后,打开一看,IO的复用也很多,片上外设很丰富,对于普通的控制使用,完全没问题。内置有64K的ROM和128K的flash,对于跑一些UCOSIII 或者RT_Thread等RTOS毫无压力,当然了,emwin这种GUI就算了。官板上,板载STlink,可以很方便的下载,且带有串口,连接的是G0的USART2,使用A2,A3复用。板载一个用户LED和一个用户按键,还有一个复位按键。7 [  @7 _/ T+ K4 G
任何板子都从点灯开始1 a6 i! {( M& \( P' l

& i1 A. ?/ m* j8 r开始建立项目并点亮第一个灯
# a6 ]& L! ~8 u/ |! f6 \& `通过配置STM32CubeMX,配置好时钟等外设之后,从原理图上,可以找到LD4接的是A5这个引脚。通过在STM32CubeMX上将该引脚配置为推挽输出模式,点解生成代码即可。STM32CubeMX使用的是HAL库,所以要让LD4交替闪烁,我们使用HAL库上的API
! N+ \& G' d' P1 J. m3 [  ?
  1. HAL_GPIO_TogglePin()
复制代码

2 B6 B1 v! D, c9 o& S2 K使用这个API函数,再使用
/ E& V- X4 q2 Q8 [( P9 T
  1. HAL_Delay(500),
复制代码
则LD4可以以500MS的时间交替闪烁。而这整个过程,只要熟悉了STM32CubeMX,都可以很快建立好工程并实现控制效果。
: C2 @- R# ~, l+ ^
& U$ K  a" x9 @. x' }) l! @$ S; W配置ADC$ J; ?; J% U3 D4 }8 @& u
通过STM32CubeMX,配置A1,A2两个管脚,复用为ADC功能。ADC的配置程序如下:. v8 i+ J6 n" Y. d9 l

& p" l5 W1 z0 ]* Z' c% P  Z: e
  1. void adc1_init(void)
    4 H8 h( p: T( K8 \. G4 m
  2. {
    % `* p0 B' q* `1 ]% }
  3.     GPIO_InitTypeDef GPIO_Init;6 T- `" r# Y9 B' u. o5 C8 ?
  4.     __HAL_RCC_GPIOA_CLK_ENABLE();* a+ H1 K: n5 ^' ]
  5.     __HAL_RCC_ADC_CLK_ENABLE();  //开启ADC时钟% J2 R$ k  \+ Z& N

  6.   S5 e3 Q0 ]4 z% ]. z/ E0 m
  7. GPIO_Init.Pin = GPIO_PIN_0|GPIO_PIN_1;# K# H; |' B, @
  8. GPIO_Init.Mode = GPIO_MODE_ANALOG;
    5 l, q9 u6 k: f9 Z9 a
  9. GPIO_Init.Pull = GPIO_NOPULL;# \5 {4 S( @: l9 m
  10. HAL_GPIO_Init(GPIOA, &GPIO_Init);( F' B. i( P/ E9 x& D: Y
  11. . Z# D. _( L) I7 M) v) G' [7 ?( y
  12. hadc1.Instance = ADC1;          4 w! ~5 a1 l2 }6 D8 S
  13. hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;   //4分频 64/4= 16MHz
    % X' B. V; o0 _% j2 r
  14. hadc1.Init.Resolution = ADC_RESOLUTION_12B;             //12位模式
      `7 S- [( b" E
  15. hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;             //右对齐: A( @, c, h: Y* }
  16. hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;             //ADC扫描模式  非( g! @) U- k  t. K2 s. L% N
  17. hadc1.Init.EOCSelection = DISABLE;                      //关闭EOC中断
    4 b0 F8 m0 D: |/ n0 d
  18. hadc1.Init.LowPowerAutoWait = DISABLE;                  //低功耗自动等待模式
    7 p+ L3 ~# A. y. F
  19. hadc1.Init.LowPowerAutoPowerOff = DISABLE;              //低功耗自动掉电模式
    8 Y5 z' R. Y* f8 n2 J; l0 R, W6 F
  20. hadc1.Init.ContinuousConvMode = DISABLE;                 //关闭连续转换
    3 d& u( a4 O2 ?- {% k9 ]  g
  21. hadc1.Init.NbrOfConversion = 2;. g6 G9 H; G9 q# I
  22. hadc1.Init.DiscontinuousConvMode = DISABLE;
    - \6 F4 P! w2 O. {" U' E) W
  23. hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    3 {$ K6 e- @% L  K1 c
  24. hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;' b& ~* Z6 X/ T6 B
  25. hadc1.Init.DMAContinuousRequests = DISABLE;' Y2 Q% }$ A6 g+ G( w3 x; `' O. O6 T1 g
  26. hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;  [* f4 m( R8 B' n( Z" D
  27. hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_1CYCLE_5;
    ! }4 u/ q! v3 w
  28. hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_1CYCLE_5;
    5 T# U+ K+ b% R4 d) ~
  29. hadc1.Init.OversamplingMode = DISABLE;9 K- t1 ?' N& V
  30. hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
    , u* a$ N9 I* C2 M# ~, u8 l7 C2 x) H
  31. 6 t& o& Z" R# T7 p  D3 H
  32. if (HAL_ADC_Init(&hadc1) != HAL_OK)
    1 z- ]2 U0 I$ d. W* T7 y* c
  33. {$ h% G: V  d4 _" U' Q, ?! M
  34.       Error_Handler();& i0 M3 x( {' @3 V
  35.     }
复制代码

7 R1 B+ U9 F  M/ X  P# R而ADC的读取函数,另外编写,
0 b1 f) J0 L5 y8 }5 R/ Z4 Y, `; p
  1. uint16_t ADC_GET(uint32_t adc_ch)
    ( S5 X3 Z( V/ l; }, W
  2. {
    " x/ t+ L5 B# L) s( K; T* r/ }
  3.     ADC_ChannelConfTypeDef sConfig;
    & W4 M" A% ~7 T! |* M" A, V" M7 d

  4.   @! w& H8 I. A. O7 t3 \! i; X
  5.     sConfig.Channel = adc_ch;2 \) D9 ^1 n/ ~. y
  6.     sConfig.Rank = ADC_REGULAR_RANK_1;
    6 T0 ]9 I1 w9 Z* e) t1 M, d
  7.     sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;
      g/ n: m5 ?/ Q1 `9 y
  8. : n0 G5 A( h% G  [
  9.     HAL_ADC_ConfigChannel(&hadc1, &sConfig);5 Q# `' ^3 F3 {5 o, k& h

  10. 7 l' L/ Y7 D: L/ T9 }
  11.     HAL_ADC_Start(&hadc1);% k$ }( V8 m1 B  `
  12.     HAL_ADC_PollForConversion(&hadc1,10);  V: D% W1 O6 L1 `' ?

  13. 8 a9 w2 e' \1 D0 M) ?4 h
  14.     return HAL_ADC_GetValue(&hadc1);8 S* N4 [9 C' `0 i3 U. S
  15. }
复制代码

0 W/ P8 p- f9 E" n+ W! R8 ~% _# {最后讲程序烧写进去之后,将会发现一件很神奇的事情,0 U% E3 [# g* e3 r+ v$ W  V

* ~* k( x0 L: P6 w, J4 d会出现这样的情况。原因在于ADC初始化两个通道需要比较长的时间,而慢慢地会回归到正常值。在使用STM32F103ZET6的时候并没有出现这种情况。但是在STM32F429IG上也有过这种情况的出现,因此本虫认为G070RB的ADC功能并没有F1系列的好用。+ w% y6 l8 ~  d3 t* N8 R- q
1 v; U- x7 l  J" Z/ M6 f0 T- O

, a' d8 N! [9 E( p4 O
赞 收藏 评论0 发布时间:2021-11-7 22:09

举报

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