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

【经验分享】STM32G0-NUCLEO测试

[复制链接]
STMCU小助手 发布时间:2021-11-7 22:09
G0的介绍
( z# _1 ]% ?7 H* y8 j2 c& xG0是ST新推出的系列,我手上的是ST官方送出的STM32G070RB-NUCLEO板,在峰会上有幸获得。拿到这个板子的第一反应是觉得,它跟STM32F103RB长得好像啊,但一看原理图才发现,G0满满的IO口,IO的占用率高了好多.。
$ b# n& w+ p2 U8 p3 ]: `
% q: [5 T: r3 C
20190721155641195.png
& Z: |8 }, h3 W+ M3 b" v+ P! e
8 ?" U3 I) p/ z8 b
安装好STM32CubeMX之后,打开一看,IO的复用也很多,片上外设很丰富,对于普通的控制使用,完全没问题。内置有64K的ROM和128K的flash,对于跑一些UCOSIII 或者RT_Thread等RTOS毫无压力,当然了,emwin这种GUI就算了。官板上,板载STlink,可以很方便的下载,且带有串口,连接的是G0的USART2,使用A2,A3复用。板载一个用户LED和一个用户按键,还有一个复位按键。1 `' e8 o: Y* n
任何板子都从点灯开始3 \5 g) c6 N5 F$ }7 [% j
- Q- |. O' }6 z1 t1 W% C* g
开始建立项目并点亮第一个灯
5 ?1 @; W! L. U. e, I! d  W通过配置STM32CubeMX,配置好时钟等外设之后,从原理图上,可以找到LD4接的是A5这个引脚。通过在STM32CubeMX上将该引脚配置为推挽输出模式,点解生成代码即可。STM32CubeMX使用的是HAL库,所以要让LD4交替闪烁,我们使用HAL库上的API
2 C* z; e2 g+ l4 f( [
  1. HAL_GPIO_TogglePin()
复制代码

6 U( q0 U! v, K$ h1 H使用这个API函数,再使用
5 ^: F- {$ H' Z  p
  1. HAL_Delay(500),
复制代码
则LD4可以以500MS的时间交替闪烁。而这整个过程,只要熟悉了STM32CubeMX,都可以很快建立好工程并实现控制效果。
! p/ e$ i& |) M4 L
/ V6 P- r  K* `配置ADC2 D  @/ P! c. ~  E
通过STM32CubeMX,配置A1,A2两个管脚,复用为ADC功能。ADC的配置程序如下:
2 Y2 l9 L, u5 h* r8 p6 ^0 F$ \; h
4 B- S5 v+ T/ z: l8 [
  1. void adc1_init(void)
    # E$ |3 Q: \" g9 ]% C
  2. {
    8 @" A9 H7 x% R/ G; C- E
  3.     GPIO_InitTypeDef GPIO_Init;1 P8 w& E; ^" Q
  4.     __HAL_RCC_GPIOA_CLK_ENABLE();
    : C; E$ D8 s9 S* I) A3 j+ s6 i
  5.     __HAL_RCC_ADC_CLK_ENABLE();  //开启ADC时钟
    1 N! Q0 G3 x6 m2 ~
  6. # r0 c- T3 P" k7 @$ G
  7. GPIO_Init.Pin = GPIO_PIN_0|GPIO_PIN_1;
    3 I- _3 |& L) w$ L- j
  8. GPIO_Init.Mode = GPIO_MODE_ANALOG;
    0 X( y. P" d* r" }9 ]
  9. GPIO_Init.Pull = GPIO_NOPULL;' _8 |, {4 C3 J& b$ P, n9 Y# J3 b. d
  10. HAL_GPIO_Init(GPIOA, &GPIO_Init);3 @$ y0 u2 F- X+ \8 f7 b

  11. 3 a0 U; o8 s5 [% @! M1 T$ Z" r
  12. hadc1.Instance = ADC1;          4 ]' C/ O. j+ h+ B2 M- R, x2 @
  13. hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;   //4分频 64/4= 16MHz' N: g* R1 ~: M& H0 h  l
  14. hadc1.Init.Resolution = ADC_RESOLUTION_12B;             //12位模式% E; j5 |+ |: E" h
  15. hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;             //右对齐
    . b/ z3 y8 C$ ^4 |9 s
  16. hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;             //ADC扫描模式  非. j9 o0 u5 R4 u4 O
  17. hadc1.Init.EOCSelection = DISABLE;                      //关闭EOC中断
    ) N$ ^7 W) Y# A3 u6 T
  18. hadc1.Init.LowPowerAutoWait = DISABLE;                  //低功耗自动等待模式; I7 ~6 j2 Y. Z8 W7 h1 [8 A
  19. hadc1.Init.LowPowerAutoPowerOff = DISABLE;              //低功耗自动掉电模式+ R0 I3 L* z7 R9 g$ P8 R
  20. hadc1.Init.ContinuousConvMode = DISABLE;                 //关闭连续转换
    3 t$ p  d" b) D7 b: q4 f
  21. hadc1.Init.NbrOfConversion = 2;, s/ h# s) O/ N6 o2 V; u
  22. hadc1.Init.DiscontinuousConvMode = DISABLE;2 e& f5 _/ h$ S8 p9 e
  23. hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    * Q. z* S# X8 f; j. n
  24. hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
    & c& }( g9 M+ I/ W* u9 M
  25. hadc1.Init.DMAContinuousRequests = DISABLE;9 J' G1 C; g8 r
  26. hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
    - w5 u# K& m8 ?. b/ _$ z
  27. hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_1CYCLE_5;
    1 B4 [$ {2 K: r* V, G
  28. hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_1CYCLE_5;9 Y/ Z  O3 n  P3 C
  29. hadc1.Init.OversamplingMode = DISABLE;
    ' y5 _2 D1 n4 b* q  {
  30. hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
    . I3 d; V* Y; h* t: i6 R
  31. 4 `3 I6 |+ o7 K3 j
  32. if (HAL_ADC_Init(&hadc1) != HAL_OK)  i! r( Z5 R8 c; e  E/ A& U5 Z9 x
  33. {1 w6 D' p( P3 B1 n  _
  34.       Error_Handler();$ l0 U* |1 g: R5 |8 f
  35.     }
复制代码

* c/ Q& Q! m; [8 a' Z( S  w而ADC的读取函数,另外编写,
; v8 Y' V1 k$ P0 }, |" e2 b4 y% e
2 S5 |% [3 u) A7 r2 y0 ]; H
  1. uint16_t ADC_GET(uint32_t adc_ch)
    8 E) \" g3 r! W0 Q' P
  2. {
    9 f5 ~' A6 t. _. U7 m! [
  3.     ADC_ChannelConfTypeDef sConfig;
    ) {- ]7 ~1 Q5 L2 W" g: W# L

  4. 4 x1 T- k  H$ y$ o
  5.     sConfig.Channel = adc_ch;1 F! e4 g3 Y: U# N" E, {
  6.     sConfig.Rank = ADC_REGULAR_RANK_1;
    6 c; v! c4 x6 K; K+ K
  7.     sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;
    4 B: p( \- d8 i: M

  8. + d' I4 P% O2 Q  Q
  9.     HAL_ADC_ConfigChannel(&hadc1, &sConfig);
    1 I: Q, y, a0 \. c! h+ P& o  F+ ^

  10. 4 _6 g6 g6 [+ {# N! ^* s7 y- ]
  11.     HAL_ADC_Start(&hadc1);% `- x4 r: `5 i; Y
  12.     HAL_ADC_PollForConversion(&hadc1,10);
    : r) f4 J$ ~, N

  13. ) T5 G3 t- {8 `
  14.     return HAL_ADC_GetValue(&hadc1);( i, d4 [" Q4 e4 O0 m7 ^7 F4 F* n
  15. }
复制代码

- F/ ?% {5 }* E8 A! z: Y1 X. `3 |最后讲程序烧写进去之后,将会发现一件很神奇的事情,
$ _' u" g1 N* H, w( Q! r* ]/ w& y# P5 i$ P2 j: n5 R+ }
会出现这样的情况。原因在于ADC初始化两个通道需要比较长的时间,而慢慢地会回归到正常值。在使用STM32F103ZET6的时候并没有出现这种情况。但是在STM32F429IG上也有过这种情况的出现,因此本虫认为G070RB的ADC功能并没有F1系列的好用。
+ G  ?/ {6 q4 _+ @# J, W
& {" c5 G) h/ O6 Y) K/ X# _* J& m
, y4 T' x- m" j( t2 U; p
收藏 评论0 发布时间:2021-11-7 22:09

举报

0个回答

所属标签

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