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

【经验分享】STM32G0-NUCLEO测试

[复制链接]
STMCU小助手 发布时间:2021-12-9 10:26
G0的介绍) ~. D$ |& T+ n7 h& _+ [
G0是ST新推出的系列,我手上的是ST官方送出的STM32G070RB-NUCLEO板,在峰会上有幸获得。拿到这个板子的第一反应是觉得,它跟STM32F103RB长得好像啊,但一看原理图才发现,G0满满的IO口,IO的占用率高了好多.。
. D! H2 d0 `9 S5 H6 S, S1 A, z/ V/ B/ e! T+ F% {
20190721155641195.png
& w' L' F$ J# l/ K: p
. Q$ f9 ?- p; r5 s
安装好STM32CubeMX之后,打开一看,IO的复用也很多,片上外设很丰富,对于普通的控制使用,完全没问题。内置有64K的ROM和128K的flash,对于跑一些UCOSIII 或者RT_Thread等RTOS毫无压力,当然了,emwin这种GUI就算了。官板上,板载STlink,可以很方便的下载,且带有串口,连接的是G0的USART2,使用A2,A3复用。板载一个用户LED和一个用户按键,还有一个复位按键。: L& \, c# L( X5 _. m; y
任何板子都从点灯开始/ A: Q/ g/ m9 A2 ^/ n* t5 A- |
/ |7 D$ M: U; I( y! A
开始建立项目并点亮第一个灯6 P1 r0 O9 o0 b/ r5 ]% l4 C2 B
通过配置STM32CubeMX,配置好时钟等外设之后,从原理图上,可以找到LD4接的是A5这个引脚。通过在STM32CubeMX上将该引脚配置为推挽输出模式,点解生成代码即可。STM32CubeMX使用的是HAL库,所以要让LD4交替闪烁,我们使用HAL库上的API) [1 H8 `- s, @; [2 C7 r
  1. HAL_GPIO_TogglePin()
复制代码
0 F: G4 s" F% e# W
使用这个API函数,再使用4 S1 Z3 A8 F- I* R) |
  1. HAL_Delay(500),
复制代码

# a8 D3 {+ p8 V( P. V4 q( E则LD4可以以500MS的时间交替闪烁。而这整个过程,只要熟悉了STM32CubeMX,都可以很快建立好工程并实现控制效果。
2 t" R: c$ C1 M, b. ~6 L2 u; S7 B6 y$ B0 V' z2 L
配置ADC
  y5 Z( N1 {6 P+ E5 _/ O通过STM32CubeMX,配置A1,A2两个管脚,复用为ADC功能。ADC的配置程序如下:( G( b: ~: K& k/ z) I: j

7 p. R3 h# G  v% B9 ?& ?4 c
  1. void adc1_init(void)
    ( S8 C) W* k. O/ j0 E* F. y- Y' \8 P
  2. {' i; j: x, R  C% H+ G+ h8 |
  3.     GPIO_InitTypeDef GPIO_Init;
    * j1 F7 b& G" h+ n0 m$ A
  4.     __HAL_RCC_GPIOA_CLK_ENABLE();2 f- U! V# Z7 H( G5 @- A
  5.     __HAL_RCC_ADC_CLK_ENABLE();  //开启ADC时钟
    : Q& H1 e6 d. O' v
  6.   P3 G% N' D( ?  [! o% ^
  7. GPIO_Init.Pin = GPIO_PIN_0|GPIO_PIN_1;
    ' d' ~5 w1 [( ]. Q; s2 L
  8. GPIO_Init.Mode = GPIO_MODE_ANALOG;6 v3 G( @4 Z* ~# E- o  p) O6 u
  9. GPIO_Init.Pull = GPIO_NOPULL;& M$ M) D7 i& M) @& }; R. Q, I
  10. HAL_GPIO_Init(GPIOA, &GPIO_Init);( f. S/ c& m; S: u8 f
  11. 8 @( ]7 R8 X; V9 m+ l& ?; c/ H
  12. hadc1.Instance = ADC1;          , T% @" f9 y7 E! s% Z* T! D$ x, V
  13. hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;   //4分频 64/4= 16MHz
    4 V7 f" G7 I2 V- U
  14. hadc1.Init.Resolution = ADC_RESOLUTION_12B;             //12位模式
    # |& j: |7 {& U- o1 V
  15. hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;             //右对齐
    0 Q/ w& L( F+ W
  16. hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;             //ADC扫描模式  非
    2 G# ~6 N) _5 Y2 J: j
  17. hadc1.Init.EOCSelection = DISABLE;                      //关闭EOC中断% x5 }5 f6 X3 Y+ r3 L
  18. hadc1.Init.LowPowerAutoWait = DISABLE;                  //低功耗自动等待模式
    , ~4 c% E2 ]6 ~
  19. hadc1.Init.LowPowerAutoPowerOff = DISABLE;              //低功耗自动掉电模式% h! S8 g; p6 p$ _4 u3 L/ Y9 Y' X
  20. hadc1.Init.ContinuousConvMode = DISABLE;                 //关闭连续转换
    4 |. H. Z& I/ w7 {9 B/ X7 @; d
  21. hadc1.Init.NbrOfConversion = 2;1 t% `) L% P: w) D
  22. hadc1.Init.DiscontinuousConvMode = DISABLE;
    . ?( w, q" C% ^; f# V+ S6 Z
  23. hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;9 \, y. @7 _7 V" m& u
  24. hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;, o1 r3 w$ N% l/ j" n6 ]$ r& |
  25. hadc1.Init.DMAContinuousRequests = DISABLE;
    * t$ ~! L  t3 O" \
  26. hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
    ! U" ?; P: q# i4 E0 @# F/ n
  27. hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_1CYCLE_5;9 H: Z! h/ v, T9 U
  28. hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_1CYCLE_5;6 `2 {5 J3 [; b+ a
  29. hadc1.Init.OversamplingMode = DISABLE;7 d, m1 z% E% w
  30. hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
    ) j, @: Z- p1 x3 R; N8 d2 p5 g$ m" @

  31. ! S% w+ \* E& |: H  F: ^! U4 C
  32. if (HAL_ADC_Init(&hadc1) != HAL_OK); W# K8 H4 b  @* ~' c/ M' N
  33. {
    . W/ M6 `: X% I* m
  34.       Error_Handler();6 [5 @( J. x8 @( Y: q; ?5 C
  35.     }
    , {( r# N3 U- ?  D) Y: s+ ?, b
  36. }
复制代码

# u5 a9 s5 T/ J9 g3 P! l而ADC的读取函数,另外编写,, d% L! {  t# c, t2 j; T: [5 s% P6 x) m
" r& c& f5 V& w
  1. uint16_t ADC_GET(uint32_t adc_ch) " ?8 @: L- t2 E) z
  2. {
    ! \+ y1 A1 v& I. b
  3.     ADC_ChannelConfTypeDef sConfig;* o1 @% M" b" Y

  4.   }' g, L+ I0 W* f0 S% m
  5.     sConfig.Channel = adc_ch;0 P/ f, e( j( ~  z
  6.     sConfig.Rank = ADC_REGULAR_RANK_1;
    2 u5 y0 t" J: A" w: Q' G/ k: D" b
  7.     sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;
    ; |: W9 c4 p$ s4 |8 @. W( @& s

  8. : A, {( m: I* {
  9.     HAL_ADC_ConfigChannel(&hadc1, &sConfig);
      l, l1 X2 B  T7 o
  10. 4 X8 a1 l- a& e5 L
  11.     HAL_ADC_Start(&hadc1);" ?; u5 j0 Y( S. z
  12.     HAL_ADC_PollForConversion(&hadc1,10);
    . H% K; r& z5 Z% p6 q) q- I

  13. $ a. g  p* S* W- u8 }9 a$ z% f
  14.     return HAL_ADC_GetValue(&hadc1);
    ( F9 @6 P1 R5 a1 ]- B$ L0 k
  15. }
复制代码

+ J$ T, E& Y, t
5 |9 C) A8 ?: B1 r6 x1 j最后讲程序烧写进去之后,将会发现一件很神奇的事情,
+ j, }+ |% @* }# z2 a8 g0 t7 r3 v% O* Y
' R! k. f! g, k& q$ H  E  ]
20190729163347613.png

0 `% t1 _' x4 J* ]7 F! p7 y- N: j/ T( M! f5 r" y
会出现这样的情况。原因在于ADC初始化两个通道需要比较长的时间,而慢慢地会回归到正常值。在使用STM32F103ZET6的时候并没有出现这种情况。但是在STM32F429IG上也有过这种情况的出现,因此本虫认为G070RB的ADC功能并没有F1系列的好用。& n* y" r7 O0 d. p5 M! Q( W
! m5 q2 `! u- M4 z; B
, e( S. @7 f' ?8 m) J
收藏 评论0 发布时间:2021-12-9 10:26

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版