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

【经验分享】STM32G0-NUCLEO测试

[复制链接]
STMCU小助手 发布时间:2021-11-7 22:09
G0的介绍
& H6 W' c( ~8 FG0是ST新推出的系列,我手上的是ST官方送出的STM32G070RB-NUCLEO板,在峰会上有幸获得。拿到这个板子的第一反应是觉得,它跟STM32F103RB长得好像啊,但一看原理图才发现,G0满满的IO口,IO的占用率高了好多.。' ^0 O/ I* T- Z( F% o, u

. J6 u  A- ^- w" S  k
20190721155641195.png
2 A% a8 }4 W' b* `' D
2 Z/ Z; E. F6 L4 M" J$ k8 o$ Z  r2 \0 t
安装好STM32CubeMX之后,打开一看,IO的复用也很多,片上外设很丰富,对于普通的控制使用,完全没问题。内置有64K的ROM和128K的flash,对于跑一些UCOSIII 或者RT_Thread等RTOS毫无压力,当然了,emwin这种GUI就算了。官板上,板载STlink,可以很方便的下载,且带有串口,连接的是G0的USART2,使用A2,A3复用。板载一个用户LED和一个用户按键,还有一个复位按键。4 D$ C9 j7 E: H6 c( f
任何板子都从点灯开始
7 c4 b7 a3 u1 ^- U! f
: b& W4 O# ~& k开始建立项目并点亮第一个灯
; O  F! j6 m; Y4 q: V6 P通过配置STM32CubeMX,配置好时钟等外设之后,从原理图上,可以找到LD4接的是A5这个引脚。通过在STM32CubeMX上将该引脚配置为推挽输出模式,点解生成代码即可。STM32CubeMX使用的是HAL库,所以要让LD4交替闪烁,我们使用HAL库上的API  G5 c- @# `( P* N! _5 R
  1. HAL_GPIO_TogglePin()
复制代码

+ B- }# P0 N. i% s使用这个API函数,再使用
- B& o5 Z' o( _( N( l9 ^' K- C6 F
  1. HAL_Delay(500),
复制代码
则LD4可以以500MS的时间交替闪烁。而这整个过程,只要熟悉了STM32CubeMX,都可以很快建立好工程并实现控制效果。% H0 a* @, a, P- j$ ]' ^! b! X

+ `0 q- ]0 M% @2 a3 t1 F! }; e7 q. V配置ADC
4 F; t3 n- y- u6 p4 ]1 H: [! A. B- f通过STM32CubeMX,配置A1,A2两个管脚,复用为ADC功能。ADC的配置程序如下:5 g2 {# V& {1 K+ G. o
& B. I% h/ ]% L2 T
  1. void adc1_init(void)
    + u. x: K8 R! w: c: K+ W
  2. {8 @# |, n" T' s
  3.     GPIO_InitTypeDef GPIO_Init;
    4 e! Z. B% Z7 C- M' ]  `8 C
  4.     __HAL_RCC_GPIOA_CLK_ENABLE();/ E: s8 ^9 h$ H  K6 w* J+ m
  5.     __HAL_RCC_ADC_CLK_ENABLE();  //开启ADC时钟( `$ `6 o* _9 `/ c. I1 C* L$ j- P

  6. 0 _: Q1 O4 ^( h0 i6 g$ m+ f5 `
  7. GPIO_Init.Pin = GPIO_PIN_0|GPIO_PIN_1;
    % Q4 |& ~6 g+ F# }' q, M) v
  8. GPIO_Init.Mode = GPIO_MODE_ANALOG;
    ! E0 ?9 B; q4 A8 z/ l' d
  9. GPIO_Init.Pull = GPIO_NOPULL;
    / }4 b1 g- d! `8 u( r- h
  10. HAL_GPIO_Init(GPIOA, &GPIO_Init);
    2 E0 B6 c  _% Z1 @( `

  11. ! I. t' N. y) D6 g& }4 v( Q" U6 z' G
  12. hadc1.Instance = ADC1;          % p/ z& n8 M' Q" a
  13. hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;   //4分频 64/4= 16MHz5 \7 R$ i  X1 B; B9 i( x
  14. hadc1.Init.Resolution = ADC_RESOLUTION_12B;             //12位模式
    . a* U/ t* B; [) G* \
  15. hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;             //右对齐, d0 t8 u/ t( g# ]
  16. hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;             //ADC扫描模式  非
    : W0 J/ _! E/ R! |0 F( l/ M) F
  17. hadc1.Init.EOCSelection = DISABLE;                      //关闭EOC中断
    " k$ [% O/ |. D$ z* s# q
  18. hadc1.Init.LowPowerAutoWait = DISABLE;                  //低功耗自动等待模式
    $ o  @0 y: w8 {; c
  19. hadc1.Init.LowPowerAutoPowerOff = DISABLE;              //低功耗自动掉电模式
    % r* X: f; @  Z$ C- [' n
  20. hadc1.Init.ContinuousConvMode = DISABLE;                 //关闭连续转换
    ; C; F" U$ j" B( ?
  21. hadc1.Init.NbrOfConversion = 2;
    , C9 f2 M  ~" w! x0 o' X, a4 ~" J
  22. hadc1.Init.DiscontinuousConvMode = DISABLE;! V" h6 c+ V. A& s! Z
  23. hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;( u( M' e* S% f6 h; H7 C+ q. W! Y
  24. hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;7 E8 x7 V, z5 T' ^' q
  25. hadc1.Init.DMAContinuousRequests = DISABLE;
    . u" m5 E" Q% E+ L8 Z
  26. hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
      _: Y1 [, g, X+ Z& V/ b
  27. hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_1CYCLE_5;8 j) K+ a& S4 w
  28. hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_1CYCLE_5;' K5 ?, |& @& L& d# e7 k
  29. hadc1.Init.OversamplingMode = DISABLE;
    ; A2 W( R8 X$ `3 ~" a' {  H
  30. hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;/ J8 H# i2 }6 \  d

  31. * n# m9 \# b7 F( s) E% f% F6 e
  32. if (HAL_ADC_Init(&hadc1) != HAL_OK)6 w( U8 e: A. ^: c4 W) s
  33. {0 N4 s4 N8 e! s; o
  34.       Error_Handler();& ~* Y( q. d* |: }
  35.     }
复制代码

' Y  U' a/ j/ }+ \, Z' E0 x而ADC的读取函数,另外编写,
( \, q7 j- q: i
" n+ _. j0 S/ {2 _$ \
  1. uint16_t ADC_GET(uint32_t adc_ch) ) y6 O3 l* D1 s- l  f
  2. {$ K9 O9 R+ W9 B5 b; `- ?" J. V9 H
  3.     ADC_ChannelConfTypeDef sConfig;
    2 e; a# F0 F+ C7 r6 C
  4. $ F4 a9 `1 \. x: T$ a
  5.     sConfig.Channel = adc_ch;8 S3 {  G0 q5 W8 y! h
  6.     sConfig.Rank = ADC_REGULAR_RANK_1;9 ?, M$ y1 [: l: p
  7.     sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;) G. E# s2 P; a' G+ @( d- W
  8. 3 j' p# c  \% j$ S' x
  9.     HAL_ADC_ConfigChannel(&hadc1, &sConfig);
    0 y3 @: s, _3 C* B6 d4 Z/ {* x
  10. . b% t0 n' q" n# r6 ?) U, [
  11.     HAL_ADC_Start(&hadc1);
    & y) L' `; H: k7 K) E% P# H) o
  12.     HAL_ADC_PollForConversion(&hadc1,10);
    - U' E- o9 Q5 C5 U. f

  13. + y# H: n# _- B7 R/ I
  14.     return HAL_ADC_GetValue(&hadc1);+ h5 ~4 S* J; z: g5 s# @' {* J3 o
  15. }
复制代码
2 |9 a% ~: k$ {. V
最后讲程序烧写进去之后,将会发现一件很神奇的事情,
/ n; L3 Z; K6 j. M  g, C! ~$ E6 u+ _1 F  ]/ a& _
会出现这样的情况。原因在于ADC初始化两个通道需要比较长的时间,而慢慢地会回归到正常值。在使用STM32F103ZET6的时候并没有出现这种情况。但是在STM32F429IG上也有过这种情况的出现,因此本虫认为G070RB的ADC功能并没有F1系列的好用。
1 p4 ^% J% ?4 I/ v8 H9 p' c  B3 y# V% C* T1 }2 }, L

  D3 l0 M4 }- l; V0 A: T/ `0 f  v
收藏 评论0 发布时间:2021-11-7 22:09

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版