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

【经验分享】STM32G0-NUCLEO测试

[复制链接]
STMCU小助手 发布时间:2021-11-7 22:09
G0的介绍. w5 r8 B! l; V, Q8 u3 n
G0是ST新推出的系列,我手上的是ST官方送出的STM32G070RB-NUCLEO板,在峰会上有幸获得。拿到这个板子的第一反应是觉得,它跟STM32F103RB长得好像啊,但一看原理图才发现,G0满满的IO口,IO的占用率高了好多.。' C5 @- T- B, A: y3 a/ I4 J# [
7 k6 i  p1 ]: B" e4 p/ J! _3 m! i
20190721155641195.png

! s, A0 C# @' O! Q1 R
) H5 q5 e$ l1 Q; n7 s% O安装好STM32CubeMX之后,打开一看,IO的复用也很多,片上外设很丰富,对于普通的控制使用,完全没问题。内置有64K的ROM和128K的flash,对于跑一些UCOSIII 或者RT_Thread等RTOS毫无压力,当然了,emwin这种GUI就算了。官板上,板载STlink,可以很方便的下载,且带有串口,连接的是G0的USART2,使用A2,A3复用。板载一个用户LED和一个用户按键,还有一个复位按键。" s. [/ Y3 @! z5 n' E
任何板子都从点灯开始. b6 x( q. ~$ x5 ?/ o* b

: x% x! F3 C# a( X7 {3 i2 V开始建立项目并点亮第一个灯" p/ s7 j5 K$ C8 m
通过配置STM32CubeMX,配置好时钟等外设之后,从原理图上,可以找到LD4接的是A5这个引脚。通过在STM32CubeMX上将该引脚配置为推挽输出模式,点解生成代码即可。STM32CubeMX使用的是HAL库,所以要让LD4交替闪烁,我们使用HAL库上的API
* V7 i( r% L. e! f- `9 N+ H
  1. HAL_GPIO_TogglePin()
复制代码

) s; s4 Q" B/ Q1 W2 w4 k2 L7 J使用这个API函数,再使用9 g2 M% x, _, G( x; H) E% R
  1. HAL_Delay(500),
复制代码
则LD4可以以500MS的时间交替闪烁。而这整个过程,只要熟悉了STM32CubeMX,都可以很快建立好工程并实现控制效果。$ r. B! q0 D3 ?% ]
6 M- Q! a+ z: y1 j9 h. L
配置ADC
/ D- I. j/ E6 ~! d6 s; m6 h& m; U通过STM32CubeMX,配置A1,A2两个管脚,复用为ADC功能。ADC的配置程序如下:5 x1 a. ^; L2 a3 K9 \  @) V4 F8 h
- q7 ]" H' w5 b5 J' I. U8 l: D
  1. void adc1_init(void)
    ) E6 O5 O0 @$ z. d0 Y, j
  2. {
    8 y1 v! J$ x: E7 S( j, R8 e
  3.     GPIO_InitTypeDef GPIO_Init;6 T& W$ h& c' ?( V
  4.     __HAL_RCC_GPIOA_CLK_ENABLE();
    ! C9 h$ O% w& M& F6 F( Y
  5.     __HAL_RCC_ADC_CLK_ENABLE();  //开启ADC时钟
    9 ^0 r0 X. a$ L. n+ y
  6. " i2 g* k! l4 |2 V/ T
  7. GPIO_Init.Pin = GPIO_PIN_0|GPIO_PIN_1;
    * H5 t1 b0 u5 E( [1 v+ j
  8. GPIO_Init.Mode = GPIO_MODE_ANALOG;9 z# d9 i% ?4 m
  9. GPIO_Init.Pull = GPIO_NOPULL;
    7 M. t% T( s' A  O* R
  10. HAL_GPIO_Init(GPIOA, &GPIO_Init);8 T! {  Y1 h- B6 T' d

  11. ; \" k/ E5 `/ J/ \9 k
  12. hadc1.Instance = ADC1;          ) c2 y$ x# q+ p; N1 V2 s
  13. hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;   //4分频 64/4= 16MHz
    7 ]* ]! `1 a9 i, U, ?0 R* v
  14. hadc1.Init.Resolution = ADC_RESOLUTION_12B;             //12位模式
    . g  H. H4 J+ _7 R- J
  15. hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;             //右对齐
    . C% k# y& k: L
  16. hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;             //ADC扫描模式  非
    * N2 z' Y1 D8 P) G$ x, `+ I
  17. hadc1.Init.EOCSelection = DISABLE;                      //关闭EOC中断" t4 S# H' Y; b7 h
  18. hadc1.Init.LowPowerAutoWait = DISABLE;                  //低功耗自动等待模式
    5 X( @" s$ c( `1 l9 W! E( O
  19. hadc1.Init.LowPowerAutoPowerOff = DISABLE;              //低功耗自动掉电模式
    ) l0 q! L  O  x* i2 g; A1 W! k- H
  20. hadc1.Init.ContinuousConvMode = DISABLE;                 //关闭连续转换
    0 @: o6 }# a' s' x* d8 e0 `' o+ R
  21. hadc1.Init.NbrOfConversion = 2;5 {. l6 b' r" L
  22. hadc1.Init.DiscontinuousConvMode = DISABLE;) Q# u( x8 B" b" I$ {6 l6 S
  23. hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    . X' x0 c- O8 Y6 f
  24. hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;8 O6 K% Q3 u- o- ]1 S
  25. hadc1.Init.DMAContinuousRequests = DISABLE;
    7 P4 o3 y% n7 R6 j# w
  26. hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
    0 {7 S6 d, v6 O; L' o
  27. hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_1CYCLE_5;/ e6 h/ c5 _' N5 a8 t
  28. hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_1CYCLE_5;
    2 N& a. C1 g9 o0 u$ w3 d4 ~0 C' b
  29. hadc1.Init.OversamplingMode = DISABLE;
    4 O6 E/ X( s+ ^0 p& Q. c" P
  30. hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
    4 I; u" ^9 e, n! i9 _6 A
  31. + C' k) u8 l$ D; @$ E9 C* A& U! ?
  32. if (HAL_ADC_Init(&hadc1) != HAL_OK); ?4 v, X6 a" C( C
  33. {) {, r0 g4 W% s. `8 \# Y
  34.       Error_Handler();2 t  ~4 P7 a3 _
  35.     }
复制代码

- K) A1 f' z* |8 G而ADC的读取函数,另外编写,# u6 F! w7 L& p! _5 l
& ]* U, M+ l  d" b4 s+ y
  1. uint16_t ADC_GET(uint32_t adc_ch) # b) w6 _  V: a$ M3 m+ j; F3 M+ _) y  {
  2. {! L! x0 j" `; U1 N
  3.     ADC_ChannelConfTypeDef sConfig;
    9 `* f2 A4 p( ^& y9 G
  4. 3 o% l8 W  _5 ~! ]3 |' y; k
  5.     sConfig.Channel = adc_ch;
    , {+ r4 S* c8 s  l& i/ |2 p9 K
  6.     sConfig.Rank = ADC_REGULAR_RANK_1;
    , P; z2 J7 @/ v0 L9 E) D. O
  7.     sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;
    : D- L: a0 t/ k

  8. ) E+ X; O- [% M. R$ W2 y
  9.     HAL_ADC_ConfigChannel(&hadc1, &sConfig);# F; u7 j" L) L6 E: Z' f( N
  10. 6 w: K: @- w. }; r5 e2 @' A
  11.     HAL_ADC_Start(&hadc1);
    ) p! Y' {; w' K" c
  12.     HAL_ADC_PollForConversion(&hadc1,10);
    6 L: D# Q: {# p, @

  13.   h" |  D+ w& I$ R# c/ r& M+ |3 D
  14.     return HAL_ADC_GetValue(&hadc1);
    ! z9 w# d8 P* k- c( o
  15. }
复制代码

: x( z4 o5 ?. |$ k6 O. s最后讲程序烧写进去之后,将会发现一件很神奇的事情,
( h( J% B' u5 M. \3 U0 \: k( ?6 r$ O5 {9 W
会出现这样的情况。原因在于ADC初始化两个通道需要比较长的时间,而慢慢地会回归到正常值。在使用STM32F103ZET6的时候并没有出现这种情况。但是在STM32F429IG上也有过这种情况的出现,因此本虫认为G070RB的ADC功能并没有F1系列的好用。5 J  a, ~) z" l

( \) l3 y  f& {6 Q9 ^
( x, L$ u2 C+ g# j* t. \
收藏 评论0 发布时间:2021-11-7 22:09

举报

0个回答

所属标签

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