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

【经验分享】STM32G0-NUCLEO测试

[复制链接]
STMCU小助手 发布时间:2021-11-7 22:09
G0的介绍
7 ^8 H9 ^( m2 b  k% g6 }) vG0是ST新推出的系列,我手上的是ST官方送出的STM32G070RB-NUCLEO板,在峰会上有幸获得。拿到这个板子的第一反应是觉得,它跟STM32F103RB长得好像啊,但一看原理图才发现,G0满满的IO口,IO的占用率高了好多.。
  q- [% t- b4 m/ A0 v# ]# F( S2 G! B/ a3 F. S; U
20190721155641195.png

+ Y0 Y2 t' k2 c3 i9 g( |5 ?+ Q2 j' M9 H
安装好STM32CubeMX之后,打开一看,IO的复用也很多,片上外设很丰富,对于普通的控制使用,完全没问题。内置有64K的ROM和128K的flash,对于跑一些UCOSIII 或者RT_Thread等RTOS毫无压力,当然了,emwin这种GUI就算了。官板上,板载STlink,可以很方便的下载,且带有串口,连接的是G0的USART2,使用A2,A3复用。板载一个用户LED和一个用户按键,还有一个复位按键。. U+ ~: C+ K2 l9 e! q" q9 L
任何板子都从点灯开始9 @2 X1 ?- H3 S" C+ G; R
4 ]; O$ M" v9 R; ?  q  |' C" h
开始建立项目并点亮第一个灯% }' D+ t+ ^9 X& ^# n
通过配置STM32CubeMX,配置好时钟等外设之后,从原理图上,可以找到LD4接的是A5这个引脚。通过在STM32CubeMX上将该引脚配置为推挽输出模式,点解生成代码即可。STM32CubeMX使用的是HAL库,所以要让LD4交替闪烁,我们使用HAL库上的API
7 {1 ]" K$ x/ y  Q* S& S
  1. HAL_GPIO_TogglePin()
复制代码

9 n- F9 s4 A, Q4 |; S. |使用这个API函数,再使用
( b. l/ G$ u  ?4 D+ z
  1. HAL_Delay(500),
复制代码
则LD4可以以500MS的时间交替闪烁。而这整个过程,只要熟悉了STM32CubeMX,都可以很快建立好工程并实现控制效果。
' e% z4 [5 w8 B$ C
: Q2 |5 R$ s- X4 ?! f配置ADC
6 ?6 G  W$ V7 s8 M  q/ z1 X通过STM32CubeMX,配置A1,A2两个管脚,复用为ADC功能。ADC的配置程序如下:! w& G% a% V/ b# l
+ V* M9 c6 p( i7 N$ W
  1. void adc1_init(void) 8 m! m, a6 a# s
  2. {
    ) \4 [6 i4 {: x  P" D( F; g- S
  3.     GPIO_InitTypeDef GPIO_Init;
    2 d. c6 [+ @. m! ?8 t! t
  4.     __HAL_RCC_GPIOA_CLK_ENABLE();4 n) [6 E) _" c" r9 p+ b& w% h
  5.     __HAL_RCC_ADC_CLK_ENABLE();  //开启ADC时钟; G6 W6 e2 \" a; d  L) f# ?* ~
  6. . x$ a6 z3 g* ?7 J, T
  7. GPIO_Init.Pin = GPIO_PIN_0|GPIO_PIN_1;
    , H: X# {7 j9 e8 z* o! j7 \
  8. GPIO_Init.Mode = GPIO_MODE_ANALOG;
    ! _5 h) i' f  t7 \- |$ Z
  9. GPIO_Init.Pull = GPIO_NOPULL;
      J( `( o3 `% w* M0 o; S
  10. HAL_GPIO_Init(GPIOA, &GPIO_Init);
    4 B5 J- x1 v" y
  11. 5 f9 A; o: }. ^2 F2 `! N
  12. hadc1.Instance = ADC1;          . B, z0 ~' C5 y- F( n
  13. hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;   //4分频 64/4= 16MHz2 q' s" ^4 Z% h; E. x) ^7 N1 e( E
  14. hadc1.Init.Resolution = ADC_RESOLUTION_12B;             //12位模式0 T8 O* @; k8 q
  15. hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;             //右对齐# Y2 A2 ]" v( d' p4 F
  16. hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;             //ADC扫描模式  非; ]3 A& X3 y$ @7 a8 I7 t. h2 _6 P
  17. hadc1.Init.EOCSelection = DISABLE;                      //关闭EOC中断+ n3 A1 L, }5 r5 Y, ?4 G0 b
  18. hadc1.Init.LowPowerAutoWait = DISABLE;                  //低功耗自动等待模式
    * K9 @: Z' y1 T  }0 F
  19. hadc1.Init.LowPowerAutoPowerOff = DISABLE;              //低功耗自动掉电模式. c: N) i- L  Q9 N5 ]/ O* T1 D8 d7 Z6 d
  20. hadc1.Init.ContinuousConvMode = DISABLE;                 //关闭连续转换
    ' g! D9 V+ V5 N; k$ x, `) h
  21. hadc1.Init.NbrOfConversion = 2;
    . U* p( g: S" i: x# {0 c2 c$ t. n  u
  22. hadc1.Init.DiscontinuousConvMode = DISABLE;
    ) Q# @0 ~: g: T) t* h
  23. hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    4 L: ~: e+ q) y+ R
  24. hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
    ! Y: i& g' B# x. U! c" O
  25. hadc1.Init.DMAContinuousRequests = DISABLE;
    , q& X5 P* t( y: E$ o, M. A
  26. hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;% o7 O, ~0 H9 v  A( e" L* ^+ O
  27. hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_1CYCLE_5;4 O+ R, b1 O1 O  t7 l( {( g
  28. hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_1CYCLE_5;
      m/ y6 R# N8 d6 u7 {  l( m
  29. hadc1.Init.OversamplingMode = DISABLE;" n: i2 u  C6 e5 w) n" m) L6 o
  30. hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
    0 G% B: J5 C& s' [( P$ d5 M
  31. - e' e% i  z7 ]/ E& |, v1 f6 C
  32. if (HAL_ADC_Init(&hadc1) != HAL_OK)4 P% R" \  c6 }3 T' ]/ [. F
  33. {
      _) Z4 H3 t' c
  34.       Error_Handler();9 F. \& Z) P6 L3 @
  35.     }
复制代码
: ]5 F6 C2 W8 ]0 R: e! _8 u
而ADC的读取函数,另外编写,9 u! M7 h! x0 V! |7 I; N0 u
4 Q9 B. i8 \# R  B2 J
  1. uint16_t ADC_GET(uint32_t adc_ch)
    # I9 G/ w% I3 Y+ B% n. u
  2. {
    & I3 z6 T0 B3 x: g  L* v
  3.     ADC_ChannelConfTypeDef sConfig;# {2 E+ y8 u8 d; Z) a) {
  4. 4 v" ^2 M% J7 r/ |
  5.     sConfig.Channel = adc_ch;; K% P3 v8 u5 m3 ^* K
  6.     sConfig.Rank = ADC_REGULAR_RANK_1;
    * G2 G3 Y+ c2 d, o( X! n& ~
  7.     sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;
    ' r1 {' |. ~% r  H4 v
  8. $ v9 L" x0 H- z( w" j
  9.     HAL_ADC_ConfigChannel(&hadc1, &sConfig);
    2 D8 i$ G. J0 D# n  l5 H6 [  \

  10. ; |( Q% j0 ~! \8 b+ @$ d
  11.     HAL_ADC_Start(&hadc1);
    % x* I4 `$ Q9 m/ s/ I
  12.     HAL_ADC_PollForConversion(&hadc1,10);
    ; q4 c0 g! Z/ a% U

  13. ' Z1 h/ c; L6 E9 x* A* V4 z- F
  14.     return HAL_ADC_GetValue(&hadc1);5 v- w* _. k  J4 |( i
  15. }
复制代码
; y$ h! j) n- H+ d! m; O# R- P
最后讲程序烧写进去之后,将会发现一件很神奇的事情,* L  C% U% B/ n! h

' v( P# |" U, F会出现这样的情况。原因在于ADC初始化两个通道需要比较长的时间,而慢慢地会回归到正常值。在使用STM32F103ZET6的时候并没有出现这种情况。但是在STM32F429IG上也有过这种情况的出现,因此本虫认为G070RB的ADC功能并没有F1系列的好用。# U' J9 t  N$ e' A3 I6 M+ T4 V

7 ~) P' A% B) K! v' O! w1 S( N; p% F; G: e8 [/ Z9 ^# v
收藏 评论0 发布时间:2021-11-7 22:09

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版