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

【经验分享】STM32G0-NUCLEO测试

[复制链接]
STMCU小助手 发布时间:2021-12-9 10:26
G0的介绍' ?# C2 I  {4 z! W, v7 G+ F' T, I
G0是ST新推出的系列,我手上的是ST官方送出的STM32G070RB-NUCLEO板,在峰会上有幸获得。拿到这个板子的第一反应是觉得,它跟STM32F103RB长得好像啊,但一看原理图才发现,G0满满的IO口,IO的占用率高了好多.。- E1 @' T* X" a/ l4 P
) N0 ]  Z1 c6 w( b. E# Q, L3 x
20190721155641195.png

8 t1 ^) N+ F5 M' o9 N
8 Z6 N  i5 y: {7 z, c2 h! l% F安装好STM32CubeMX之后,打开一看,IO的复用也很多,片上外设很丰富,对于普通的控制使用,完全没问题。内置有64K的ROM和128K的flash,对于跑一些UCOSIII 或者RT_Thread等RTOS毫无压力,当然了,emwin这种GUI就算了。官板上,板载STlink,可以很方便的下载,且带有串口,连接的是G0的USART2,使用A2,A3复用。板载一个用户LED和一个用户按键,还有一个复位按键。* F5 M1 h" k- ^' @5 S% D' e3 i
任何板子都从点灯开始
0 W$ j! z, x- {  M& _& P! B: K3 S. a4 b% ^1 T: p
开始建立项目并点亮第一个灯/ q+ X1 r7 W) ]2 {
通过配置STM32CubeMX,配置好时钟等外设之后,从原理图上,可以找到LD4接的是A5这个引脚。通过在STM32CubeMX上将该引脚配置为推挽输出模式,点解生成代码即可。STM32CubeMX使用的是HAL库,所以要让LD4交替闪烁,我们使用HAL库上的API8 a! L. {6 X* a% X- V6 x; M2 n- p
  1. HAL_GPIO_TogglePin()
复制代码
3 }2 \- O0 @9 K2 x# l* T: P
使用这个API函数,再使用
$ m* B/ @5 ]! f9 U
  1. HAL_Delay(500),
复制代码

, P$ S1 L8 u3 [$ J& m则LD4可以以500MS的时间交替闪烁。而这整个过程,只要熟悉了STM32CubeMX,都可以很快建立好工程并实现控制效果。
) A/ h; R, h' i8 e8 V+ r; U6 A
, X0 W0 k  K" i1 u; l; u) n配置ADC0 d; G6 G7 J$ c: o8 G6 e
通过STM32CubeMX,配置A1,A2两个管脚,复用为ADC功能。ADC的配置程序如下:: Z3 g! n' Q- w' h$ o+ R" f

$ w: f. y! g% R* O4 S7 }
  1. void adc1_init(void)
    8 _! m# Y  ~- k/ {8 N% J
  2. {! o0 D: t6 F- T2 q/ \$ L& `. w" \
  3.     GPIO_InitTypeDef GPIO_Init;
    " M% h4 ^+ X4 L2 S
  4.     __HAL_RCC_GPIOA_CLK_ENABLE();% P8 R. G' |/ G6 X4 }! E
  5.     __HAL_RCC_ADC_CLK_ENABLE();  //开启ADC时钟
    9 [& C7 }& ~4 [& C

  6. 2 a8 }* K2 x. g
  7. GPIO_Init.Pin = GPIO_PIN_0|GPIO_PIN_1;/ H$ X) D9 |6 i0 r* |: J
  8. GPIO_Init.Mode = GPIO_MODE_ANALOG;
    " z; q; E8 W9 H
  9. GPIO_Init.Pull = GPIO_NOPULL;" U0 o2 |$ B0 S: ]; U
  10. HAL_GPIO_Init(GPIOA, &GPIO_Init);
    2 c0 u9 V5 R9 ]1 W. G4 C

  11. : j7 A7 R) w3 @) N- s
  12. hadc1.Instance = ADC1;         
    ' M1 o& D" T" f3 G! O6 m
  13. hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;   //4分频 64/4= 16MHz+ @+ w. r  ]5 U; c" r& I- @
  14. hadc1.Init.Resolution = ADC_RESOLUTION_12B;             //12位模式
    3 ?+ x& [2 o& ?0 s6 F
  15. hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;             //右对齐
    ) U* m# \- w5 _5 z
  16. hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;             //ADC扫描模式  非* G& K( c$ q) W2 K5 Y9 j
  17. hadc1.Init.EOCSelection = DISABLE;                      //关闭EOC中断
    ( U8 f" E9 x  W: S7 R4 I; o
  18. hadc1.Init.LowPowerAutoWait = DISABLE;                  //低功耗自动等待模式/ S% }  F: v; t0 n6 \  t0 N
  19. hadc1.Init.LowPowerAutoPowerOff = DISABLE;              //低功耗自动掉电模式
    ( H' n2 C, r4 k' d  w& _
  20. hadc1.Init.ContinuousConvMode = DISABLE;                 //关闭连续转换; i0 \/ D. ^' U
  21. hadc1.Init.NbrOfConversion = 2;
    8 `: |  J& Z' a% F! `/ ?
  22. hadc1.Init.DiscontinuousConvMode = DISABLE;
    9 s6 _" T9 Z: [' K7 O
  23. hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    / P: U2 u& y( L; n% }) \- g
  24. hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
    . C$ W9 [+ @2 r: @6 |9 \. `
  25. hadc1.Init.DMAContinuousRequests = DISABLE;$ m- L' P- z; P( ]
  26. hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;; F) E9 I" z, p# B  I2 S
  27. hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_1CYCLE_5;
    " p1 Y, M7 _4 r' B& F9 G
  28. hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_1CYCLE_5;
      Z) _, I( L! A5 u
  29. hadc1.Init.OversamplingMode = DISABLE;: n9 E8 o: r7 J' X$ `$ I* ?
  30. hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;5 M+ {; A3 d" T6 ^' {6 {  r5 p

  31. ( N' m2 ^$ x, P. b
  32. if (HAL_ADC_Init(&hadc1) != HAL_OK)
    ' [  G- y4 h) Q
  33. {
    $ r- X3 {- A, Q* ~0 ^1 u
  34.       Error_Handler();/ r' ^, `& o  D: f
  35.     }0 x. l# u7 e3 N% ^
  36. }
复制代码
, m; p' V$ i" u  W! [* l3 F" e  a: x
而ADC的读取函数,另外编写,3 I% W0 \: ]. x9 O- Y* w
/ `2 R& d% ?& |. m* F
  1. uint16_t ADC_GET(uint32_t adc_ch) * M- `& d1 _9 n1 v1 F
  2. {
    ' r4 K3 w* M7 g" t( |
  3.     ADC_ChannelConfTypeDef sConfig;( f) G6 e# ^/ C  W% O2 v
  4. , E8 I! x& C: P' ~9 K8 W# c) m! @1 z
  5.     sConfig.Channel = adc_ch;* J2 Y9 J/ O0 N, ]: s! A4 S
  6.     sConfig.Rank = ADC_REGULAR_RANK_1;, G, B1 G. |( v; K: |$ C! l: z
  7.     sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;1 Z: J: _; g3 v* C6 }/ o: C; _% ^, z
  8. ; Z- A2 A/ C4 d/ K
  9.     HAL_ADC_ConfigChannel(&hadc1, &sConfig);9 U0 a* m$ P; V  [4 g6 i
  10.   `. j' W! R6 \# w) x. u
  11.     HAL_ADC_Start(&hadc1);/ M' I5 {- _* l2 l% q& u
  12.     HAL_ADC_PollForConversion(&hadc1,10);- {# ]9 p+ F  P) C8 h2 ~

  13. 7 o$ I2 {: y1 q& M
  14.     return HAL_ADC_GetValue(&hadc1);% l! v% T  L4 U. f2 ?
  15. }
复制代码

0 G3 r1 o) M9 d
4 L5 K9 T$ D. r最后讲程序烧写进去之后,将会发现一件很神奇的事情,
  _+ J8 y/ @9 [, B0 F: L# M
; x7 T; Z8 L) d( H$ G
20190729163347613.png
! p0 F: E9 }7 N6 j1 _

" F" h# p; N4 L7 w) Z6 L: a会出现这样的情况。原因在于ADC初始化两个通道需要比较长的时间,而慢慢地会回归到正常值。在使用STM32F103ZET6的时候并没有出现这种情况。但是在STM32F429IG上也有过这种情况的出现,因此本虫认为G070RB的ADC功能并没有F1系列的好用。
4 b  d$ R( @, O/ G0 _; a7 T4 b. ?% |0 \0 |1 {+ y: _+ A2 G0 l, f
5 m8 w: k! [' j# x4 i6 }
赞 收藏 评论0 发布时间:2021-12-9 10:26

举报

0个回答

所属标签

相似技术帖

官网相关资源

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