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

【经验分享】STM32G0-NUCLEO测试

[复制链接]
STMCU小助手 发布时间:2021-11-7 22:09
G0的介绍
3 v1 o+ ~2 w3 {5 H2 J5 vG0是ST新推出的系列,我手上的是ST官方送出的STM32G070RB-NUCLEO板,在峰会上有幸获得。拿到这个板子的第一反应是觉得,它跟STM32F103RB长得好像啊,但一看原理图才发现,G0满满的IO口,IO的占用率高了好多.。9 R1 X/ R# O/ I9 U* T
0 k6 s' }# y& d5 F
20190721155641195.png
7 |2 o( z! U: k3 Y6 N9 V8 }/ i0 B
$ e9 z! b  B' s+ s0 W4 X; i0 k
安装好STM32CubeMX之后,打开一看,IO的复用也很多,片上外设很丰富,对于普通的控制使用,完全没问题。内置有64K的ROM和128K的flash,对于跑一些UCOSIII 或者RT_Thread等RTOS毫无压力,当然了,emwin这种GUI就算了。官板上,板载STlink,可以很方便的下载,且带有串口,连接的是G0的USART2,使用A2,A3复用。板载一个用户LED和一个用户按键,还有一个复位按键。9 m8 {! j' I8 n
任何板子都从点灯开始
' h/ [: L' h- }* e* J2 g! k! D1 G, D+ F: m
开始建立项目并点亮第一个灯6 W1 L8 C% S" e  U0 u( {
通过配置STM32CubeMX,配置好时钟等外设之后,从原理图上,可以找到LD4接的是A5这个引脚。通过在STM32CubeMX上将该引脚配置为推挽输出模式,点解生成代码即可。STM32CubeMX使用的是HAL库,所以要让LD4交替闪烁,我们使用HAL库上的API
* S* q1 S" U* ]1 d/ i
  1. HAL_GPIO_TogglePin()
复制代码
4 A- L0 @  H" Q* P% ]3 |4 F. f
使用这个API函数,再使用0 L4 c- t3 F5 Z! Q
  1. HAL_Delay(500),
复制代码
则LD4可以以500MS的时间交替闪烁。而这整个过程,只要熟悉了STM32CubeMX,都可以很快建立好工程并实现控制效果。) {1 Y6 E5 C8 X( ~' |

( C+ l" O) M) v! n+ J3 F0 {3 [3 k: }配置ADC3 a# n& e7 ]  Q- n
通过STM32CubeMX,配置A1,A2两个管脚,复用为ADC功能。ADC的配置程序如下:+ M5 h: ~( z9 N2 A' y8 k

, }6 S' l# Y* @/ ]+ Q& m
  1. void adc1_init(void)
    : g; w6 w* p% F: d
  2. {
      ]9 \8 |6 P9 s
  3.     GPIO_InitTypeDef GPIO_Init;1 s: t3 o/ ]& r  Q; O
  4.     __HAL_RCC_GPIOA_CLK_ENABLE();. ?3 i' {% A; t; O4 n, s) p7 E
  5.     __HAL_RCC_ADC_CLK_ENABLE();  //开启ADC时钟, k6 W5 y9 \8 O, `
  6. " D$ D0 x* v4 Y) \# a- B2 @) E- ]
  7. GPIO_Init.Pin = GPIO_PIN_0|GPIO_PIN_1;) r+ j% N& [. i, _9 j& B0 f2 `
  8. GPIO_Init.Mode = GPIO_MODE_ANALOG;
    ! f  B  N3 }. Y. n
  9. GPIO_Init.Pull = GPIO_NOPULL;
    / E  E; D6 J! n0 E
  10. HAL_GPIO_Init(GPIOA, &GPIO_Init);
    " v( _$ C4 H* }: d# t

  11. 2 g8 p7 i# y  ^# V1 C% N
  12. hadc1.Instance = ADC1;          6 ]$ ?+ [7 r* n) g* x6 Q/ u' _' @
  13. hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;   //4分频 64/4= 16MHz1 N  b- B/ B7 @- q3 A3 p* `
  14. hadc1.Init.Resolution = ADC_RESOLUTION_12B;             //12位模式0 S. s' t* I) C! q
  15. hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;             //右对齐6 H0 A% D/ w# X7 N7 D1 v  R
  16. hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;             //ADC扫描模式  非* b% o8 k2 o* O6 M+ P6 z3 s; U
  17. hadc1.Init.EOCSelection = DISABLE;                      //关闭EOC中断( p. M! ^3 J# I' t; N
  18. hadc1.Init.LowPowerAutoWait = DISABLE;                  //低功耗自动等待模式
    8 I: M" M# X- X8 v. i
  19. hadc1.Init.LowPowerAutoPowerOff = DISABLE;              //低功耗自动掉电模式/ P/ P2 [; W) [
  20. hadc1.Init.ContinuousConvMode = DISABLE;                 //关闭连续转换/ ]' f4 R; F0 z* M' o
  21. hadc1.Init.NbrOfConversion = 2;
    / s# L  l5 z# I! P9 T; }
  22. hadc1.Init.DiscontinuousConvMode = DISABLE;
    * N4 Q6 q( v& i$ t
  23. hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    , l" i2 i2 p" Q
  24. hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;% _+ f7 g9 @% v2 w
  25. hadc1.Init.DMAContinuousRequests = DISABLE;% o# P+ H: n3 n6 {, a$ _$ @- {
  26. hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;$ E9 q/ X' J# G
  27. hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_1CYCLE_5;
    . j0 l. b; m" D. o. `8 m( `9 @
  28. hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_1CYCLE_5;
    " Q% F* X% {4 \! }
  29. hadc1.Init.OversamplingMode = DISABLE;
    8 M. \6 d* g3 g  |- A1 W  z
  30. hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;9 I- W, O/ Q! R
  31. , G+ q6 i: t0 b1 J4 a7 R* @
  32. if (HAL_ADC_Init(&hadc1) != HAL_OK)2 q1 z" n% x7 e. q/ T4 {. B4 Q
  33. {
    7 B9 |. O0 v7 O
  34.       Error_Handler();+ A+ F  W# R' l! F  p
  35.     }
复制代码

8 F  d' M' ~5 X6 L* B; u: O而ADC的读取函数,另外编写,/ C" [5 X& C& e) _1 p/ ]
. @  ~' \$ K# D* U6 l, t) S
  1. uint16_t ADC_GET(uint32_t adc_ch) 3 d4 |* ~; n! Y3 n1 I3 f
  2. {  E0 ?+ b6 d/ f: T8 t1 k: w
  3.     ADC_ChannelConfTypeDef sConfig;2 I9 Y0 v. b4 L$ z* i) X

  4. 4 ^/ ^+ o' f4 K5 H# c; A" C3 X( [
  5.     sConfig.Channel = adc_ch;
    , b. @1 k/ {7 I9 ^# [- t8 o
  6.     sConfig.Rank = ADC_REGULAR_RANK_1;& m( v2 F5 r3 h
  7.     sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;; v$ e1 R5 n: h! t3 c, S. b! I

  8. 8 N) _1 X) z5 V/ N, u7 I
  9.     HAL_ADC_ConfigChannel(&hadc1, &sConfig);
      a* K- k' V& |0 h# w+ T  N

  10. & Q5 k8 n- Z' q0 d
  11.     HAL_ADC_Start(&hadc1);
    ' C5 X/ q0 u, H4 |
  12.     HAL_ADC_PollForConversion(&hadc1,10);3 a' A2 w( `2 S1 F7 z0 T- i5 e
  13. 9 n( X3 z: H5 g$ _8 \. o
  14.     return HAL_ADC_GetValue(&hadc1);5 Y* ^$ Q6 F2 J( m" v4 T, r
  15. }
复制代码

# Q8 v5 x7 p6 B  Z1 M2 s* f' [最后讲程序烧写进去之后,将会发现一件很神奇的事情,
- A# @- m$ W  v
( z$ ^/ N" i! G. g会出现这样的情况。原因在于ADC初始化两个通道需要比较长的时间,而慢慢地会回归到正常值。在使用STM32F103ZET6的时候并没有出现这种情况。但是在STM32F429IG上也有过这种情况的出现,因此本虫认为G070RB的ADC功能并没有F1系列的好用。
; S  |( {' n# o& D8 e7 Q& K; J) A; A; `4 _- T0 h- G5 S

; k( u( S' O  u- z& t% G+ X2 O
收藏 评论0 发布时间:2021-11-7 22:09

举报

0个回答

所属标签

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