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

【经验分享】STM32G0-NUCLEO测试

[复制链接]
STMCU小助手 发布时间:2021-12-9 10:26
G0的介绍
/ K, e( b6 w& J; u# M0 d/ a5 y. }G0是ST新推出的系列,我手上的是ST官方送出的STM32G070RB-NUCLEO板,在峰会上有幸获得。拿到这个板子的第一反应是觉得,它跟STM32F103RB长得好像啊,但一看原理图才发现,G0满满的IO口,IO的占用率高了好多.。
( Z! s. x9 v# ]0 k: Q
5 d2 C9 t- m2 c6 r; n% Z
20190721155641195.png
2 w( x( W2 Q$ Y1 Z2 n

. Z& ~+ {. K$ ]- S& C3 k7 m安装好STM32CubeMX之后,打开一看,IO的复用也很多,片上外设很丰富,对于普通的控制使用,完全没问题。内置有64K的ROM和128K的flash,对于跑一些UCOSIII 或者RT_Thread等RTOS毫无压力,当然了,emwin这种GUI就算了。官板上,板载STlink,可以很方便的下载,且带有串口,连接的是G0的USART2,使用A2,A3复用。板载一个用户LED和一个用户按键,还有一个复位按键。, ~: x4 n) c6 |/ j; x
任何板子都从点灯开始
/ t! d$ E0 s' {* O
3 ~7 c/ @# F/ i/ X; l* L3 R- B4 R/ q开始建立项目并点亮第一个灯/ M  U6 g' T  I. k5 K4 u
通过配置STM32CubeMX,配置好时钟等外设之后,从原理图上,可以找到LD4接的是A5这个引脚。通过在STM32CubeMX上将该引脚配置为推挽输出模式,点解生成代码即可。STM32CubeMX使用的是HAL库,所以要让LD4交替闪烁,我们使用HAL库上的API5 D/ ]' a# `, p
  1. HAL_GPIO_TogglePin()
复制代码
$ \& H3 z) k/ ^- I; j
使用这个API函数,再使用
9 o: g- A4 X' K6 n0 {# {
  1. HAL_Delay(500),
复制代码

: E! H" ?0 ?  i+ {5 ^则LD4可以以500MS的时间交替闪烁。而这整个过程,只要熟悉了STM32CubeMX,都可以很快建立好工程并实现控制效果。
& m" P% e0 E& ?1 @- a  [, i1 ]4 q8 I5 r4 L9 p5 z& d9 ^+ I
配置ADC
( Q* O$ a. T2 n2 t1 @5 a5 a$ [. k4 S通过STM32CubeMX,配置A1,A2两个管脚,复用为ADC功能。ADC的配置程序如下:) t6 X. f4 a& w, ?, u+ J% V" S3 {

. n8 g. C( i9 [8 t
  1. void adc1_init(void) 1 Q, q  v0 D2 d0 C( J; b, G
  2. {
    # g/ y: ^/ r% c+ `; T/ Y2 h. }
  3.     GPIO_InitTypeDef GPIO_Init;( ?- S: o, \' d
  4.     __HAL_RCC_GPIOA_CLK_ENABLE();, y0 }, p) n* D! t8 |, g/ m
  5.     __HAL_RCC_ADC_CLK_ENABLE();  //开启ADC时钟
    * G1 @( ^$ f! D* K; U& w
  6. / @% e9 G5 p8 t- Y# g3 e9 m6 o  B' O( L
  7. GPIO_Init.Pin = GPIO_PIN_0|GPIO_PIN_1;
    & }# Y: H  N; }7 Z+ }+ x
  8. GPIO_Init.Mode = GPIO_MODE_ANALOG;
    ; i( U$ g# e: H3 O/ Q% F5 N
  9. GPIO_Init.Pull = GPIO_NOPULL;
    ! K: V" j& L8 ~! }
  10. HAL_GPIO_Init(GPIOA, &GPIO_Init);7 p( A& l* W% Q  }) n
  11. 6 b$ Y; S- X( h5 d
  12. hadc1.Instance = ADC1;         
    , {4 c4 @! S  t+ F: e6 G
  13. hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;   //4分频 64/4= 16MHz
    ( M6 E5 u+ {7 B: x" ]. i5 `8 A& }3 ?
  14. hadc1.Init.Resolution = ADC_RESOLUTION_12B;             //12位模式
    5 C9 S  Q$ }1 N0 h2 Q
  15. hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;             //右对齐
    " g1 ^% o- G! p" U; X
  16. hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;             //ADC扫描模式  非
    7 N6 Q3 O% `, N8 ~: L" E' @  |# `: n
  17. hadc1.Init.EOCSelection = DISABLE;                      //关闭EOC中断
    % c+ w; w3 o; _' C1 ~1 f% X
  18. hadc1.Init.LowPowerAutoWait = DISABLE;                  //低功耗自动等待模式
    ! [  r- y( `9 m
  19. hadc1.Init.LowPowerAutoPowerOff = DISABLE;              //低功耗自动掉电模式
    " m) p) `5 Q3 q& c/ h
  20. hadc1.Init.ContinuousConvMode = DISABLE;                 //关闭连续转换, ?/ f/ r$ q* O# w0 {. M2 s5 R
  21. hadc1.Init.NbrOfConversion = 2;
    * b& I0 S) L. l) F$ L
  22. hadc1.Init.DiscontinuousConvMode = DISABLE;
    8 Q. r2 L# L  Y5 U" H- p) K( b# j
  23. hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    / V. n3 d& H% `5 `! c! H/ Y+ e0 z
  24. hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;- |, \$ g; \2 G1 }
  25. hadc1.Init.DMAContinuousRequests = DISABLE;
    . V* K; _# I: J% J& ^
  26. hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;! @' m( A" G& g1 m7 U% n- S
  27. hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_1CYCLE_5;* k$ h# ?' a( h8 u! [5 w
  28. hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_1CYCLE_5;9 z# w/ L( y) t# }  {' z
  29. hadc1.Init.OversamplingMode = DISABLE;* Y# c" O9 v# i: X; d1 u- [% r* n
  30. hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
    $ a. k  N) p( V
  31. ! A3 e; v. ]6 A* R) w& y7 f( z& f
  32. if (HAL_ADC_Init(&hadc1) != HAL_OK)
    / P3 g" P5 W- A4 k) L
  33. {1 c1 c' ?7 `! N3 D5 e3 I5 ~
  34.       Error_Handler();' P( L$ c  _. M% n
  35.     }1 \" t( x' u7 P
  36. }
复制代码
# `0 B2 @! ]; c: W& T. G. e9 a
而ADC的读取函数,另外编写,( s$ l! @- |+ ?+ o- J

! E! T3 t" b; M% r
  1. uint16_t ADC_GET(uint32_t adc_ch) + B' y5 t  `/ T
  2. {5 J# n) u. v. h; T+ I8 B
  3.     ADC_ChannelConfTypeDef sConfig;; y% d# |& [' m

  4. / |- ]: _; u$ }5 k
  5.     sConfig.Channel = adc_ch;9 \- b* d2 v# o  X  I
  6.     sConfig.Rank = ADC_REGULAR_RANK_1;) G8 m, r0 w) z' [  Z
  7.     sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;  C3 \$ }  q9 U$ R

  8. 9 K7 L' g8 ~1 ~9 X# ?. ?8 W
  9.     HAL_ADC_ConfigChannel(&hadc1, &sConfig);. l: p9 B* ~% C2 B+ e2 i
  10. 3 q2 e- w4 l& Z+ X
  11.     HAL_ADC_Start(&hadc1);
    % C- ]4 u1 c. R1 `8 h  @
  12.     HAL_ADC_PollForConversion(&hadc1,10);; [6 {1 \+ X- r  K7 C- [! d" c

  13. # ]& l4 v1 T1 Q' n- I: b
  14.     return HAL_ADC_GetValue(&hadc1);6 T, M% X( _* s
  15. }
复制代码

" [& e' v0 F; s: {% n1 @
; {8 N: s2 |1 z6 ^/ i( b' V7 o最后讲程序烧写进去之后,将会发现一件很神奇的事情,5 D% X+ E& `* T; S  g1 P  y! e

. y5 R  |# }& L+ b+ k
20190729163347613.png

4 V) k; H9 V: s% \2 T- P
% ]( a( f4 j4 Q+ l' ?/ c- n* M会出现这样的情况。原因在于ADC初始化两个通道需要比较长的时间,而慢慢地会回归到正常值。在使用STM32F103ZET6的时候并没有出现这种情况。但是在STM32F429IG上也有过这种情况的出现,因此本虫认为G070RB的ADC功能并没有F1系列的好用。
3 U  O3 V5 b0 Z  l* E& x+ h7 a, P6 L, f$ z& z5 ^

# Y0 m7 f$ x% J5 t6 _9 [+ i
收藏 评论0 发布时间:2021-12-9 10:26

举报

0个回答

所属标签

相似分享

官网相关资源

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