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

【经验分享】STM32G0-NUCLEO测试

[复制链接]
STMCU小助手 发布时间:2021-11-7 22:09
G0的介绍9 ]$ Y3 g$ V: {; d4 Q
G0是ST新推出的系列,我手上的是ST官方送出的STM32G070RB-NUCLEO板,在峰会上有幸获得。拿到这个板子的第一反应是觉得,它跟STM32F103RB长得好像啊,但一看原理图才发现,G0满满的IO口,IO的占用率高了好多.。/ {- D0 ^* ^; ]9 n, m

6 s1 k3 R+ Q7 y5 l  x3 z
20190721155641195.png

$ O% A! z8 ^/ `' {2 W5 J8 k: B
  A! V7 R: j4 p* Z) M. q安装好STM32CubeMX之后,打开一看,IO的复用也很多,片上外设很丰富,对于普通的控制使用,完全没问题。内置有64K的ROM和128K的flash,对于跑一些UCOSIII 或者RT_Thread等RTOS毫无压力,当然了,emwin这种GUI就算了。官板上,板载STlink,可以很方便的下载,且带有串口,连接的是G0的USART2,使用A2,A3复用。板载一个用户LED和一个用户按键,还有一个复位按键。. }6 H' b' f9 w8 h9 K
任何板子都从点灯开始9 w$ @0 v* e! H

# w4 m( d! J; R开始建立项目并点亮第一个灯( w" j) K4 Y0 Z
通过配置STM32CubeMX,配置好时钟等外设之后,从原理图上,可以找到LD4接的是A5这个引脚。通过在STM32CubeMX上将该引脚配置为推挽输出模式,点解生成代码即可。STM32CubeMX使用的是HAL库,所以要让LD4交替闪烁,我们使用HAL库上的API
1 l8 s9 M0 {7 N
  1. HAL_GPIO_TogglePin()
复制代码

7 F4 Z& B* r9 ]4 Q1 R& C( L* ]使用这个API函数,再使用
) z" d' @- z; q2 Z, }
  1. HAL_Delay(500),
复制代码
则LD4可以以500MS的时间交替闪烁。而这整个过程,只要熟悉了STM32CubeMX,都可以很快建立好工程并实现控制效果。  e6 T: ?/ n( B7 B, i2 ?; [

  n1 _2 l6 u4 g+ O! G/ w% y0 D配置ADC
7 V& k; s9 e/ r6 k/ s! J通过STM32CubeMX,配置A1,A2两个管脚,复用为ADC功能。ADC的配置程序如下:
6 s, K/ z2 e; w. Z: z1 p/ P- j0 G! H! A$ z, f' Z4 i
  1. void adc1_init(void) * d, z2 y. Z& m8 _2 R1 a: t/ c: R* W; ?( U
  2. {
    * H/ a; S3 {5 @. U6 a1 \
  3.     GPIO_InitTypeDef GPIO_Init;. k% a# g, f6 M, K  O# [  s
  4.     __HAL_RCC_GPIOA_CLK_ENABLE();- a8 }/ t" V9 y- I3 u1 `8 S
  5.     __HAL_RCC_ADC_CLK_ENABLE();  //开启ADC时钟9 a$ S/ p! x) j
  6. $ [# G( I7 S  q& p7 ?6 d; s
  7. GPIO_Init.Pin = GPIO_PIN_0|GPIO_PIN_1;8 d) s: X' n( d+ L/ i6 h; j
  8. GPIO_Init.Mode = GPIO_MODE_ANALOG;( H! ~& m' g: ^3 [$ o  s
  9. GPIO_Init.Pull = GPIO_NOPULL;( ]. j& }* I3 C1 p. u
  10. HAL_GPIO_Init(GPIOA, &GPIO_Init);4 r& P( N8 A/ k# y6 y% V
  11. $ f: e4 n1 j# f% u) B1 m9 w- ^
  12. hadc1.Instance = ADC1;         
    ; d1 Z' K6 E( p  |8 P9 k
  13. hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;   //4分频 64/4= 16MHz" U& L) Y& a9 g/ ?- M5 b
  14. hadc1.Init.Resolution = ADC_RESOLUTION_12B;             //12位模式* C. X" s. p1 g& E( }$ w7 a
  15. hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;             //右对齐  V( `- j. r6 m. N
  16. hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;             //ADC扫描模式  非; b4 [% y1 d. T3 x5 y
  17. hadc1.Init.EOCSelection = DISABLE;                      //关闭EOC中断
    ; P- `6 ^4 ^/ R) }; \
  18. hadc1.Init.LowPowerAutoWait = DISABLE;                  //低功耗自动等待模式! `8 v7 N2 q: Y, G
  19. hadc1.Init.LowPowerAutoPowerOff = DISABLE;              //低功耗自动掉电模式2 H$ A& s! i4 d
  20. hadc1.Init.ContinuousConvMode = DISABLE;                 //关闭连续转换
    2 ^. I8 `! `+ l. h& S) L/ m, N! N
  21. hadc1.Init.NbrOfConversion = 2;' n8 Z- ]$ B5 D0 y% c$ `' ]( I* ?
  22. hadc1.Init.DiscontinuousConvMode = DISABLE;3 p, f. k' E" Z
  23. hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    ( i' o" b% i4 c& x6 V( s
  24. hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;) u; I% b0 a- v( O, u. _
  25. hadc1.Init.DMAContinuousRequests = DISABLE;6 J7 c& G* C( ]$ i
  26. hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;# W3 Z0 i# F1 W- H
  27. hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_1CYCLE_5;* A; b- \8 D9 k: O( L6 \( W4 \7 F
  28. hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_1CYCLE_5;
    7 F- H& a" j- @
  29. hadc1.Init.OversamplingMode = DISABLE;
    # G8 L9 X5 k8 Z" }" a7 B
  30. hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;. N8 t$ S2 ^" J7 m* D7 W
  31. 2 w- d0 x9 \0 N- Y0 X% J' ^
  32. if (HAL_ADC_Init(&hadc1) != HAL_OK)5 U  S6 O0 s) i  p& f! ~
  33. {. z6 R: C! v0 q7 i8 j
  34.       Error_Handler();, Y/ }# F8 U7 ^3 ^- W
  35.     }
复制代码

* \! X) a' N) U9 N' l而ADC的读取函数,另外编写,
0 t# }+ t$ r2 J6 G, u  ]5 C+ u3 q) h  a5 V7 B( r9 R8 |% c
  1. uint16_t ADC_GET(uint32_t adc_ch)
    ' N. p# V# X0 I4 H* }5 A- D: H: |
  2. {
    $ ^' f3 P! y  `4 ]
  3.     ADC_ChannelConfTypeDef sConfig;
    7 k" |' K! h( u4 z% |
  4. % O* b8 E* }6 [5 x
  5.     sConfig.Channel = adc_ch;- ]2 f# k0 O! T
  6.     sConfig.Rank = ADC_REGULAR_RANK_1;1 k+ h' F* K/ b
  7.     sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;
    + v: G0 A, g1 c. K* K  [+ S

  8. 4 G- h9 o- _4 c
  9.     HAL_ADC_ConfigChannel(&hadc1, &sConfig);
    : z/ R! @6 S1 L" D$ u
  10. + F) {# a# A& j) Q
  11.     HAL_ADC_Start(&hadc1);
    % m' ^9 W3 |, t# u9 X# H; X' w3 p! _
  12.     HAL_ADC_PollForConversion(&hadc1,10);
    2 N" G" t* g; s- Y2 @
  13.   y+ w6 |# r  ]5 y& M0 z) f" W, L
  14.     return HAL_ADC_GetValue(&hadc1);
    : G, ~( p4 Z) u+ e
  15. }
复制代码

# A; N% e/ h5 s, |) u最后讲程序烧写进去之后,将会发现一件很神奇的事情,* }/ v6 `1 W4 w& Q! g  ~

/ W# u* W* p# H会出现这样的情况。原因在于ADC初始化两个通道需要比较长的时间,而慢慢地会回归到正常值。在使用STM32F103ZET6的时候并没有出现这种情况。但是在STM32F429IG上也有过这种情况的出现,因此本虫认为G070RB的ADC功能并没有F1系列的好用。
! N  s2 b! j( o
* A2 K* M5 {" U& C% P& M5 B4 C$ Z# j
收藏 评论0 发布时间:2021-11-7 22:09

举报

0个回答

所属标签

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