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

【经验分享】STM32G0-NUCLEO测试

[复制链接]
STMCU小助手 发布时间:2021-12-9 10:26
G0的介绍
5 O$ L% B- {7 g7 Y, G4 s& uG0是ST新推出的系列,我手上的是ST官方送出的STM32G070RB-NUCLEO板,在峰会上有幸获得。拿到这个板子的第一反应是觉得,它跟STM32F103RB长得好像啊,但一看原理图才发现,G0满满的IO口,IO的占用率高了好多.。
  s( ~4 a) W. g/ Z4 @# l
$ T6 w) q: B6 i) i
20190721155641195.png

1 s) K4 X7 ~) ~# X  o" S, P" {: S$ ^3 t1 q
安装好STM32CubeMX之后,打开一看,IO的复用也很多,片上外设很丰富,对于普通的控制使用,完全没问题。内置有64K的ROM和128K的flash,对于跑一些UCOSIII 或者RT_Thread等RTOS毫无压力,当然了,emwin这种GUI就算了。官板上,板载STlink,可以很方便的下载,且带有串口,连接的是G0的USART2,使用A2,A3复用。板载一个用户LED和一个用户按键,还有一个复位按键。
$ A  R% i3 ?" h4 Q6 a% |- K任何板子都从点灯开始3 O2 \0 w, T! m% f5 b0 ~5 G

, B  B8 \# e! w2 t! L- s0 C开始建立项目并点亮第一个灯6 l1 K4 h1 }& H5 v7 W( C4 u. R1 @
通过配置STM32CubeMX,配置好时钟等外设之后,从原理图上,可以找到LD4接的是A5这个引脚。通过在STM32CubeMX上将该引脚配置为推挽输出模式,点解生成代码即可。STM32CubeMX使用的是HAL库,所以要让LD4交替闪烁,我们使用HAL库上的API. y0 [& I$ n3 h: x% Q& x( P
  1. HAL_GPIO_TogglePin()
复制代码
! w$ |- \1 P+ c! j, F% b
使用这个API函数,再使用
# E! Y$ e3 `& s- ]( o0 Z# `& A6 L6 M
  1. HAL_Delay(500),
复制代码
( @! X) \9 n! R4 t% {
则LD4可以以500MS的时间交替闪烁。而这整个过程,只要熟悉了STM32CubeMX,都可以很快建立好工程并实现控制效果。" K; T- j% b( a  b# d3 o9 K
2 g9 Q# \6 ?, A( @/ |' [
配置ADC( f( C* h. \* q. F7 U$ Z
通过STM32CubeMX,配置A1,A2两个管脚,复用为ADC功能。ADC的配置程序如下:  m9 a2 ~, l3 _! {* j
  `% C+ {' [0 d
  1. void adc1_init(void)
    2 Q/ ]+ w  I; F8 ^2 c; m
  2. {
    0 G  j  u8 H! z
  3.     GPIO_InitTypeDef GPIO_Init;) c" ~9 ^9 R2 G' r% ^
  4.     __HAL_RCC_GPIOA_CLK_ENABLE();* P/ `6 b) }6 q! Z: E6 K
  5.     __HAL_RCC_ADC_CLK_ENABLE();  //开启ADC时钟
    0 h  s% S8 p' [1 R  S. \* G5 N

  6. - C5 {: _) @4 {$ I2 ~: c* S
  7. GPIO_Init.Pin = GPIO_PIN_0|GPIO_PIN_1;# z. G, ~2 q! z2 `( J
  8. GPIO_Init.Mode = GPIO_MODE_ANALOG;& v( W6 e( O/ L! d- l! y, g+ Q
  9. GPIO_Init.Pull = GPIO_NOPULL;0 ^: s4 N. y  s( F6 `4 U8 [
  10. HAL_GPIO_Init(GPIOA, &GPIO_Init);
    + W3 |- H3 j# A
  11. ( c% S) `, G: d" F) q( k
  12. hadc1.Instance = ADC1;         
    + ?. e" I9 y5 k% v8 }& ?
  13. hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;   //4分频 64/4= 16MHz
    % B$ [3 V# P( w8 `* P! ?4 x9 C
  14. hadc1.Init.Resolution = ADC_RESOLUTION_12B;             //12位模式
    ! ?! G# m9 g, P! ~, v) [* `$ L. W1 u
  15. hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;             //右对齐
    ( U8 A, ^' A, t
  16. hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;             //ADC扫描模式  非' I# g* C1 [8 S8 V" ^0 X) f# c
  17. hadc1.Init.EOCSelection = DISABLE;                      //关闭EOC中断( |8 W* Y  ~" r4 ?1 }
  18. hadc1.Init.LowPowerAutoWait = DISABLE;                  //低功耗自动等待模式
    ; Q0 \6 B; U! L( ~% G% N
  19. hadc1.Init.LowPowerAutoPowerOff = DISABLE;              //低功耗自动掉电模式
    + e+ N* P- f, J3 M$ j0 M" p
  20. hadc1.Init.ContinuousConvMode = DISABLE;                 //关闭连续转换2 g3 M& w3 z' c- _: V2 D- M
  21. hadc1.Init.NbrOfConversion = 2;
    . @$ t3 ]$ q. t& H" ]: B- ]
  22. hadc1.Init.DiscontinuousConvMode = DISABLE;8 v, S0 q! G" B1 {9 x6 r
  23. hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;6 o7 F/ z2 O3 `6 F
  24. hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;3 ^" b% K; X6 q% ?
  25. hadc1.Init.DMAContinuousRequests = DISABLE;5 ^2 s- M& W4 W( t: d3 @. J/ b
  26. hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;$ \. m' L' w4 ^% x( f, z
  27. hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_1CYCLE_5;4 k3 i! H, O7 E+ F7 t4 g: R# {! ^
  28. hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_1CYCLE_5;. v5 |& \! w1 D7 \! r% W
  29. hadc1.Init.OversamplingMode = DISABLE;
      c) L" Z# q2 q6 x( d& @  S  S
  30. hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;& Y' M# }$ {6 ~9 ?$ }. o

  31. 8 i0 j0 \6 f& G$ l: Z  ?# M& H* d/ L
  32. if (HAL_ADC_Init(&hadc1) != HAL_OK)( Z4 g+ H- O; u5 u# ^% Z' ~
  33. {
    4 G/ s* u8 c6 H* K/ J# i, m4 i
  34.       Error_Handler();
    * v0 v6 y7 _. d! z  T: |4 e
  35.     }. n: [; C* K. X/ M5 g4 ?
  36. }
复制代码

  S% B; q$ x4 c( \1 O而ADC的读取函数,另外编写,! ~8 U% {' S5 n( |$ i! X

  L7 [+ a3 ^' @6 _' v) a
  1. uint16_t ADC_GET(uint32_t adc_ch)
    3 B9 T2 d/ u: Y
  2. {3 c/ _' s% q( W
  3.     ADC_ChannelConfTypeDef sConfig;
    & l  n1 }: f+ `2 p! v
  4. , x8 m  E' [0 J3 J4 V  g; K6 |: I
  5.     sConfig.Channel = adc_ch;! p5 t7 U  d) G
  6.     sConfig.Rank = ADC_REGULAR_RANK_1;
    + \6 n8 p/ \2 ]
  7.     sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;4 v. j& H! k' c( [4 ]1 Z
  8. * ?( C2 C+ c) ?. v7 x) n* L
  9.     HAL_ADC_ConfigChannel(&hadc1, &sConfig);8 U6 R0 s" |) V# h9 p6 ?

  10. % p4 ]/ m- D- ~4 F( n1 ?' _
  11.     HAL_ADC_Start(&hadc1);
    5 R/ k1 c  t7 s: J6 `8 q+ |1 R
  12.     HAL_ADC_PollForConversion(&hadc1,10);
    ( x. ], O9 M8 a" I  c& ^
  13. - ~# A* f7 B! h/ o& S
  14.     return HAL_ADC_GetValue(&hadc1);' e* d8 G& W2 p) T5 W7 V
  15. }
复制代码

) w" J* o; V: Z# ]0 G. i$ G4 ^. X: A4 m$ \, X" t' K
最后讲程序烧写进去之后,将会发现一件很神奇的事情,
* V, I0 `. H' ]1 k# J7 k9 L& y- q% d8 q! r8 h! \1 X# O
20190729163347613.png

' u7 u7 Q% `3 l: V
9 b& P" t: g  w. T5 o会出现这样的情况。原因在于ADC初始化两个通道需要比较长的时间,而慢慢地会回归到正常值。在使用STM32F103ZET6的时候并没有出现这种情况。但是在STM32F429IG上也有过这种情况的出现,因此本虫认为G070RB的ADC功能并没有F1系列的好用。
% B; @! E4 X  [, n# ~5 N! \% X8 P2 S% r! Q; l% }+ u% C
, Z7 @- j9 i' ]& s, D3 c0 W% [
收藏 评论0 发布时间:2021-12-9 10:26

举报

0个回答

所属标签

相似分享

官网相关资源

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