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

【经验分享】STM32G0-NUCLEO测试

[复制链接]
STMCU小助手 发布时间:2021-12-9 10:26
G0的介绍
. F$ t+ S! G2 {% ]& j; u+ r) QG0是ST新推出的系列,我手上的是ST官方送出的STM32G070RB-NUCLEO板,在峰会上有幸获得。拿到这个板子的第一反应是觉得,它跟STM32F103RB长得好像啊,但一看原理图才发现,G0满满的IO口,IO的占用率高了好多.。5 ^0 V3 s  N& e$ @8 C
9 g2 I; [4 f; [. e0 e. l# b
20190721155641195.png

* W3 u2 X7 K* S& f+ P' L( M  R& T$ w  e
安装好STM32CubeMX之后,打开一看,IO的复用也很多,片上外设很丰富,对于普通的控制使用,完全没问题。内置有64K的ROM和128K的flash,对于跑一些UCOSIII 或者RT_Thread等RTOS毫无压力,当然了,emwin这种GUI就算了。官板上,板载STlink,可以很方便的下载,且带有串口,连接的是G0的USART2,使用A2,A3复用。板载一个用户LED和一个用户按键,还有一个复位按键。  B, C; s4 ?3 i# }
任何板子都从点灯开始: {- B4 F# U9 g$ k) x( A2 z6 Z
8 ?9 ]1 q$ Q- R$ `: S3 u8 E; |& w' \
开始建立项目并点亮第一个灯- T& \4 x8 f0 l2 S: j6 n
通过配置STM32CubeMX,配置好时钟等外设之后,从原理图上,可以找到LD4接的是A5这个引脚。通过在STM32CubeMX上将该引脚配置为推挽输出模式,点解生成代码即可。STM32CubeMX使用的是HAL库,所以要让LD4交替闪烁,我们使用HAL库上的API
$ a% j2 Z  \0 r" C
  1. HAL_GPIO_TogglePin()
复制代码

6 k0 C. R. V9 u  g使用这个API函数,再使用% p9 H: s! S& R+ V1 _$ t, V( {/ E- h% q
  1. HAL_Delay(500),
复制代码

" N1 t; p- L9 ?4 h$ L  g8 d' V; }! v则LD4可以以500MS的时间交替闪烁。而这整个过程,只要熟悉了STM32CubeMX,都可以很快建立好工程并实现控制效果。  u8 r- D" a/ R% K) @
$ v$ U9 a6 N0 c- H
配置ADC5 C; H% r0 g, H' Q/ u1 i
通过STM32CubeMX,配置A1,A2两个管脚,复用为ADC功能。ADC的配置程序如下:
* C; z5 Z4 p$ o3 p* T5 e8 E2 p; M7 {, f) B% R' S: d5 ~$ [; P
  1. void adc1_init(void) ! S  b% T( J+ S; M5 b1 d7 t6 ]. q+ I" M: ?
  2. {
    ) I% S2 u1 O1 u4 U9 a: z) I& S6 n8 s
  3.     GPIO_InitTypeDef GPIO_Init;
    4 [- O# \* p) f' S. A* J
  4.     __HAL_RCC_GPIOA_CLK_ENABLE();4 V" S. \& N8 @+ X( V
  5.     __HAL_RCC_ADC_CLK_ENABLE();  //开启ADC时钟/ |; u3 A  B( O+ R: q6 W) e, k5 D

  6. ) {, K! m: j/ ~4 \( i" n" H5 p$ S! E
  7. GPIO_Init.Pin = GPIO_PIN_0|GPIO_PIN_1;4 x+ H2 A# I( c* l: s6 B
  8. GPIO_Init.Mode = GPIO_MODE_ANALOG;& p. L( w. g2 P
  9. GPIO_Init.Pull = GPIO_NOPULL;
    / K2 [+ {4 a9 p) d2 |1 p
  10. HAL_GPIO_Init(GPIOA, &GPIO_Init);5 Y7 O1 B' @5 S. a- V
  11. * ~% l, K' a6 Q: d" @
  12. hadc1.Instance = ADC1;         
    2 y+ H. R! C1 W& _3 J' S& U8 a
  13. hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;   //4分频 64/4= 16MHz
    7 A1 d7 {" P- u# v  C
  14. hadc1.Init.Resolution = ADC_RESOLUTION_12B;             //12位模式) R$ P: y& e2 l# i9 F& q
  15. hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;             //右对齐( m" O: ]+ p! f  B  b# g
  16. hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;             //ADC扫描模式  非
    7 X/ z  I! r8 ?* _% P
  17. hadc1.Init.EOCSelection = DISABLE;                      //关闭EOC中断
    8 h$ [+ Q+ c# h% G
  18. hadc1.Init.LowPowerAutoWait = DISABLE;                  //低功耗自动等待模式. E( s) E  ~6 K, A
  19. hadc1.Init.LowPowerAutoPowerOff = DISABLE;              //低功耗自动掉电模式
    5 a! {- y. _) N+ ?
  20. hadc1.Init.ContinuousConvMode = DISABLE;                 //关闭连续转换
    ; H+ Q& d2 d- F; q
  21. hadc1.Init.NbrOfConversion = 2;. u5 x% g9 F4 F4 R
  22. hadc1.Init.DiscontinuousConvMode = DISABLE;+ d8 B- q4 b5 u2 r8 v" F
  23. hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;  E1 @. j5 |" G+ S0 {
  24. hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;! @1 _: h. J- z
  25. hadc1.Init.DMAContinuousRequests = DISABLE;
    1 b/ P9 G2 B* j9 l7 ~' K& I
  26. hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
    3 c( E3 S- M6 Y
  27. hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_1CYCLE_5;7 L& K( h  @  U' |  Y0 F$ Q
  28. hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_1CYCLE_5;
    3 @1 a! f- s! K' X; B
  29. hadc1.Init.OversamplingMode = DISABLE;
    . i) ~3 z; z, A1 E
  30. hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;2 @' R  R* i8 a5 P

  31. ; E6 t. U8 d2 r7 v* N2 }( ?% ~; H* I
  32. if (HAL_ADC_Init(&hadc1) != HAL_OK)
    ( d( o0 P. e9 M6 a
  33. {
    , A  d0 K: O+ n- [
  34.       Error_Handler();, Z* ?0 B% p6 i5 f/ d4 A
  35.     }
    , w- b/ w2 j* v6 X' J
  36. }
复制代码

  \. M0 f; Y- Y* ?- w* @( y而ADC的读取函数,另外编写,! y7 c9 }) [  X+ Z* ?. g

+ D: i* y* x4 T( z5 v9 {3 v/ B
  1. uint16_t ADC_GET(uint32_t adc_ch)
    ' x/ X( r, e+ Y& @, X/ c1 \
  2. {
    5 V, j6 G& g2 m7 v: L9 V! E
  3.     ADC_ChannelConfTypeDef sConfig;
    8 R) l, O9 s+ Q) f6 k; M. S2 t

  4. % O$ F; F$ c. P8 g/ I# c
  5.     sConfig.Channel = adc_ch;
    - p: m6 ^$ N$ i  T& c
  6.     sConfig.Rank = ADC_REGULAR_RANK_1;
    & V, H, {: J, o' E4 f6 B
  7.     sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;% M2 ?  a# }2 B

  8. % x  y" n* h0 E: W, T) d, w. i
  9.     HAL_ADC_ConfigChannel(&hadc1, &sConfig);
    " o* C- J0 _. x4 ^7 Z

  10. 6 m7 K! G0 f( P' ^( [0 C0 l
  11.     HAL_ADC_Start(&hadc1);
    3 e8 ?* d; o: g, O
  12.     HAL_ADC_PollForConversion(&hadc1,10);/ ]% h- y; v* [3 x7 h3 y

  13. % z2 @1 P; M5 N+ ^  b
  14.     return HAL_ADC_GetValue(&hadc1);
    # a# [5 f5 O4 y
  15. }
复制代码
8 J9 E$ n1 n" ~" @6 l
$ _0 \; O+ `& l
最后讲程序烧写进去之后,将会发现一件很神奇的事情,& ^% |2 D- S( E1 ?8 y
1 D$ B' }, }( i! o% k
20190729163347613.png

& g$ O, T) x' S8 ]1 }' ?. B" R2 i  `/ D* X. N. q
会出现这样的情况。原因在于ADC初始化两个通道需要比较长的时间,而慢慢地会回归到正常值。在使用STM32F103ZET6的时候并没有出现这种情况。但是在STM32F429IG上也有过这种情况的出现,因此本虫认为G070RB的ADC功能并没有F1系列的好用。
' a, E# H. m6 A' N5 n+ x  v; s; H! i8 ~3 Z/ I8 M# u8 k  A
) a, Y1 W' }/ O( e/ o
收藏 评论0 发布时间:2021-12-9 10:26

举报

0个回答

所属标签

相似技术帖

官网相关资源

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