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

【经验分享】STM32G0-NUCLEO测试

[复制链接]
STMCU小助手 发布时间:2021-12-9 10:26
G0的介绍
& @3 K9 i$ d$ HG0是ST新推出的系列,我手上的是ST官方送出的STM32G070RB-NUCLEO板,在峰会上有幸获得。拿到这个板子的第一反应是觉得,它跟STM32F103RB长得好像啊,但一看原理图才发现,G0满满的IO口,IO的占用率高了好多.。) I6 k# o0 k% e, X- b; {5 I  z" b9 h

1 S- t0 O+ ^  S) K" a5 o7 Z
20190721155641195.png
( p5 g6 u4 G/ Y1 C- g$ R
# S; Q: _3 g! X. G
安装好STM32CubeMX之后,打开一看,IO的复用也很多,片上外设很丰富,对于普通的控制使用,完全没问题。内置有64K的ROM和128K的flash,对于跑一些UCOSIII 或者RT_Thread等RTOS毫无压力,当然了,emwin这种GUI就算了。官板上,板载STlink,可以很方便的下载,且带有串口,连接的是G0的USART2,使用A2,A3复用。板载一个用户LED和一个用户按键,还有一个复位按键。0 }& e6 y, X' h
任何板子都从点灯开始: T9 a1 h, f- v5 P
+ H4 |+ N! L5 d9 l( k
开始建立项目并点亮第一个灯
2 {( L& ^: M0 b! v  n$ j, K通过配置STM32CubeMX,配置好时钟等外设之后,从原理图上,可以找到LD4接的是A5这个引脚。通过在STM32CubeMX上将该引脚配置为推挽输出模式,点解生成代码即可。STM32CubeMX使用的是HAL库,所以要让LD4交替闪烁,我们使用HAL库上的API" K) ]8 {+ n, {- E/ j6 }
  1. HAL_GPIO_TogglePin()
复制代码

% T% |5 c5 }6 ^$ l使用这个API函数,再使用
& {! l& H( [, k! j1 c2 q  c
  1. HAL_Delay(500),
复制代码

! Q- Z: k; w6 }0 N* \则LD4可以以500MS的时间交替闪烁。而这整个过程,只要熟悉了STM32CubeMX,都可以很快建立好工程并实现控制效果。
" L) p. H8 u# m) j2 r) ?
+ O* q# U1 B7 a2 e9 ]配置ADC
, e4 ^6 b, V% z  K% V/ i( t. ^通过STM32CubeMX,配置A1,A2两个管脚,复用为ADC功能。ADC的配置程序如下:
$ U" P: `8 U0 }6 w% z* t6 k2 D; T, Z( V: n1 Y0 S+ a9 a
  1. void adc1_init(void)
    5 R) v5 g. U0 |6 E) d& o8 D5 {
  2. {
    + ~0 a4 J( M# K  n- ^- e6 p' G
  3.     GPIO_InitTypeDef GPIO_Init;
    3 A/ Q% y. e# E% n% o1 E2 w- P
  4.     __HAL_RCC_GPIOA_CLK_ENABLE();/ r2 ]7 e& `3 ?: Q: Q
  5.     __HAL_RCC_ADC_CLK_ENABLE();  //开启ADC时钟( t2 B) b; N3 [: Y- c* y0 f( z
  6. ! C. J' Z5 ^# B) b7 |5 d
  7. GPIO_Init.Pin = GPIO_PIN_0|GPIO_PIN_1;1 Z. L3 r- h! f% ~
  8. GPIO_Init.Mode = GPIO_MODE_ANALOG;
    $ {% H6 @. l1 ~! G7 Q$ |* u: r
  9. GPIO_Init.Pull = GPIO_NOPULL;8 `$ L* E- m! \; O" [$ p2 B
  10. HAL_GPIO_Init(GPIOA, &GPIO_Init);
    * [+ e, a' M! g6 t2 h) Z/ Z
  11. ) e( I# V' \0 i) {8 I3 m6 J, V
  12. hadc1.Instance = ADC1;          8 O/ i- I7 U/ M! v8 `
  13. hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;   //4分频 64/4= 16MHz; A/ a9 o8 J8 N3 m% W9 t1 R
  14. hadc1.Init.Resolution = ADC_RESOLUTION_12B;             //12位模式
    ( T+ L1 j9 U$ Q7 z/ C4 w) c
  15. hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;             //右对齐  S+ R; t$ F/ i) m* x$ T
  16. hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;             //ADC扫描模式  非
    0 O( Q; h( o" X6 L8 [
  17. hadc1.Init.EOCSelection = DISABLE;                      //关闭EOC中断- X% O) t: w- w" R' N
  18. hadc1.Init.LowPowerAutoWait = DISABLE;                  //低功耗自动等待模式
    2 R7 {# `3 ]+ M$ d
  19. hadc1.Init.LowPowerAutoPowerOff = DISABLE;              //低功耗自动掉电模式8 h0 }: t: x6 t& o* d/ a2 E: i3 S
  20. hadc1.Init.ContinuousConvMode = DISABLE;                 //关闭连续转换
    9 i1 W1 q- _8 g! r7 E, R" v" }
  21. hadc1.Init.NbrOfConversion = 2;
    : q' S) q  H) c2 A9 J8 n3 |* k, ?0 n' @" G
  22. hadc1.Init.DiscontinuousConvMode = DISABLE;
    & m9 p8 H8 t6 T- q
  23. hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;& G& y8 }: r+ l& g' b+ |
  24. hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
    0 {$ ?0 j! S3 Q5 _8 r, j
  25. hadc1.Init.DMAContinuousRequests = DISABLE;: J9 s" o& b! _3 m
  26. hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;4 v% L- K( e4 T
  27. hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_1CYCLE_5;& }0 R& b6 ^& _/ D
  28. hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_1CYCLE_5;
    ; R& {1 h& H8 @, S  M
  29. hadc1.Init.OversamplingMode = DISABLE;
    4 K- ~' J/ i" m- o& A
  30. hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
    9 D, W( h* ^% B* @# A) h8 S
  31. 2 X: Q1 F+ k  b5 ?4 Y) v6 J5 I. {
  32. if (HAL_ADC_Init(&hadc1) != HAL_OK)
    ) U6 M; u/ E* k7 k
  33. {
    # d' N" g( \; X& C" `1 A2 o
  34.       Error_Handler();
    ; W3 D3 F* L; Z) C
  35.     }' C9 v7 V4 f% e2 z* B3 d
  36. }
复制代码
) J/ v4 E6 F; p0 J, Q1 \
而ADC的读取函数,另外编写,
3 w* O4 c, |8 X5 t3 N: y! H
  X" Q- @2 c* {! F( l# E- @
  1. uint16_t ADC_GET(uint32_t adc_ch)
    ! A2 [, b" A: }3 R
  2. {$ B1 }. V4 o4 K& A
  3.     ADC_ChannelConfTypeDef sConfig;& o1 c. J  l  X. Z- T9 ~

  4. / x9 m0 t# o. {
  5.     sConfig.Channel = adc_ch;
    : d) B' k! @0 g& I
  6.     sConfig.Rank = ADC_REGULAR_RANK_1;' p& I/ n: l: @. h& S! U* t
  7.     sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;1 p2 I% x( G6 u, k# s# y) l/ F5 B
  8. " I: r  ]/ L# z7 {8 ~- {7 _9 A
  9.     HAL_ADC_ConfigChannel(&hadc1, &sConfig);9 B/ m8 @& y& l, `
  10. * f* r) n+ P4 A' l
  11.     HAL_ADC_Start(&hadc1);
    ! G. D; \' [6 H# n
  12.     HAL_ADC_PollForConversion(&hadc1,10);! y" J" Y/ d6 ]( S* F
  13. * C. `3 i! v' P- U/ p+ j
  14.     return HAL_ADC_GetValue(&hadc1);% T7 y- x: j( f6 z
  15. }
复制代码

! [- V4 N* d. E
! i4 G7 j5 t1 S# P: U最后讲程序烧写进去之后,将会发现一件很神奇的事情,, N' H; R7 u/ k  ~7 P

2 T" u: z3 B/ a8 f( H
20190729163347613.png

- F& b5 P) G: c8 c- }
+ P/ g1 m# B  Y& F4 D会出现这样的情况。原因在于ADC初始化两个通道需要比较长的时间,而慢慢地会回归到正常值。在使用STM32F103ZET6的时候并没有出现这种情况。但是在STM32F429IG上也有过这种情况的出现,因此本虫认为G070RB的ADC功能并没有F1系列的好用。
/ b- q) m3 y: U! u
& M- k0 w" u9 A3 S4 Q  x8 N  T- ~2 F& ]5 |3 J/ j8 B4 `
收藏 评论0 发布时间:2021-12-9 10:26

举报

0个回答

所属标签

相似分享

官网相关资源

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