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

STM32CubeMX学习教程:PWM实现呼吸灯效果

[复制链接]
STMCU-管管 发布时间:2021-5-28 16:40
完整源码下载:
6 W5 b9 E" f' q3 H' X# n4 shttps://github.com/simonliu009/STM32CubeMX-PWM-Output
& |) [/ o9 P8 X& z" W* \% g! {% ?% h" f* V% W# j2 v3 S

) d4 K* ~' g& v( x软件:2 q7 ?4 Y4 [: a& H# H
STM32CubeMX V4.25.0  
2 A; I. h7 F/ V1 pSystem Workbench V2.45 n- |; Y9 h8 x9 P3 ?
4 `+ `! k5 X! y

* k3 e1 [$ @1 i  C8 E2 m+ B0 G3 T固件库版本:  g. d6 c4 B1 Z  k  k
STM32Cube FW_F1 V1.6.1
  F% I4 T: |/ \
2 f* k4 O( @1 `3 c+ B
* w: H0 F) [0 F& a; l0 x" ]
硬件:! q. g& N( j4 b, o9 ^
OneNet 麒麟座V2.3/ d4 ^6 }! C9 |, h4 P+ D; U
+ ]* _% d" U4 n
6 ^; P. f6 x" V
在STM32CubeMX中新建项目,选择正确的MCU型号
; o, `5 G) w( ]0 N# A 1.png % O# |) j3 N0 q4 ~3 }) Z& v# r' ?0 ^
首先设置RCC和SYS,如下图7 A/ x; _. x# z+ [! g0 w2 t" v2 r
2.png 2 ?# a0 t  o5 j8 p% e
然后根据板子实际情况设置时钟(麒麟座外部晶振是12M,STM32F103x的最高主频是72M),如下图
! ^. \# v- s2 D$ c5 n 3.png - @- P2 |3 W5 E8 D6 B' m; {; \
设置PC7 管脚为TIM3_CH2, 即定时器TIM3的Channel2% P% q+ f3 a7 ?6 v) K
4.png : A9 {; R2 u4 }( Z4 U/ Z5 K
然后设置TIM3的Channel2为PWM Generation CH23 L- @0 C7 |3 u
5.png # a0 F1 @+ o- |: }- Y* i
我们知道TIM3是挂在APB1总线上的,看时钟树我们知道APB1总线的Timer频率是72MHz。
  w) y4 {" p, }# ~' `1 M- L& U& _ 6.png
1 R8 C3 S. ]1 C, X; v6 A5 _配置TIM3参数,预分频系数设置为72-1, 自动重载值设置为1000-1,那么PWM频率为72,000,000/72/1000=1000Hz,即1KHz。由于LED是低电平点亮,所以我们把极性设置为low。
  @, U  \5 p" a 7.png
! z1 \+ Q6 e8 \$ Q0 KProject - setting ,ToolChain/IDE选择 SW4STM32$ P, U) x/ ~. }7 `  l
8.png
  I( M+ s( l6 K" t% d4 `勾选这里4 \2 d: |' ^! F8 \' S0 }* s- I
9.png % g1 x  E6 {0 m3 B' m2 |' A- D
保存以后,点击任务栏的生成代码图标
' s4 ~" A( G6 O; U3 h* A) {) ] 10.png
+ Y8 I1 U/ L, ~# O生成完毕以后在弹出的对话框点击"Open Project", System Workbench自动打开Eclipse并导入和打开了项目。) }9 O" ^% z1 y7 R0 ?, r: c0 r

+ `0 [4 Z3 a! ^4 j" d: B/ u
7 A0 f2 Y. p* U. k, [7 u; n
在main.c中,先定义一个变量存储我们设置的占空比1 [% I) _" e% h4 Q$ `
  1.   /* USER CODE BEGIN 1 */8 L! G2 {. d  V# d9 F& K
  2. uint16_t dutyCycle = 0;
    ) ]7 O- V6 v% h. i. F, a
  3.   /* USER CODE END 1 */
复制代码
然后使能TIM3的PWM Channel2 输出。; N! R8 `5 D( P0 d. C; L; q
  1. /* USER CODE BEGIN 2 */
    6 B: n: Q" V# \6 y7 E( F7 ^# Z
  2.   HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);7 R* w5 X$ Y- q1 l: h2 k
  3.   /* USER CODE END 2 */
复制代码
然后在while(1)中改变dutyCycle的值  a& p/ b; A4 }; v
  1. /* USER CODE BEGIN WHILE */
    5 ?! Z0 ~  V# Q7 h: E& p4 E  q! }+ G
  2.   while (1)
    # C. W8 U/ t& A/ e6 l3 w
  3.   {# i* G7 C& _% b* o
  4.           while (dutyCycle < 1000)9 J4 a. m! Y: ^
  5.           {- M  S! P( l$ P( H0 u* R
  6.                   dutyCycle ++;. _' q( ^) c# j, C
  7.                   __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, dutyCycle);2 |4 ?# j( k: M
  8. //                  TIM3->CCR2 = dutyCycle;
    ( v! V8 J0 {- _6 J7 N
  9.                   HAL_Delay(1);$ o0 Q3 x; a% Z) l  v# @2 h5 \
  10.           }( D7 W5 f1 x) g6 b; P* ~" G
  11.           while (dutyCycle)6 U  U; ?7 ^. o6 w0 c. v) n
  12.           {
    , Y4 V! `$ ]" \/ M* A
  13.                   dutyCycle --;
    ) @9 W  s+ R, d2 X  J) z
  14.                   __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, dutyCycle);
    ) u- r% b) R  Z8 _2 G
  15. //                  TIM3->CCR2 = dutyCycle;* |/ m. v! o: q, K9 w8 t# S
  16.                   HAL_Delay(1);' w3 G1 O) U6 u: S  `( g
  17.           }
    6 M( \0 f# t  a" B2 ]  S3 z
  18.           HAL_Delay(200);
      S2 q, v! f  X% ?- s+ K0 z2 R
  19.   /* USER CODE END WHILE */
    5 n8 m  y1 Y8 g; u+ l" v& D
复制代码
然后右键点击项目,选择Properties, Run-Debug Settings, 点击右侧的New,在弹出对话框中选择Ac6 STM32 Debugging。7 O$ j) c4 m7 ?" Z/ O/ G4 m
11.png # A( [# T- G- X( O' i1 A
然后任务栏上点击Run图,当然会报错的,所以需要右键点击  项目名Run.cfg ,给它改个名字,/ T5 V+ S! H# g) x
12.png
$ b2 a! w0 e# ~1 C然后右键点击项目树里面的项目名称,选择“Propeties”,然后在Run/Debug Settings-选择项目名-Edit-Main-C/C++Application那里点击“Search Project”,然后选择出现的默认的elf文件:
0 N" e1 k6 ^6 Q0 c& ?5 U- p 13.png
' m1 z7 ~7 ]0 ]7 T& v8 N4 Q然后在Debugger-User Defined-Browse 那里选择你自己改名的配置文件:
' ~2 R& k5 m) [2 U& e 14.png ' q+ r. K8 r( t; O' {: ~. g% e
然后右键点击那个新的cfg文件,选择"Open With - Text Editor", 进行如下更改:
: _* S( v$ R* {% r- p: x/ k( L6 `# l8 @1 T4 o9 V
7 j' i3 K. ^4 s+ i
source [find interface/stlink.cfg] 更改为 source [find interface/stlink-v2.cfg]
+ e9 h# a: [1 @+ O/ }- q8 Xreset_config srst_only srst_nogate connect_assert_srst 这一行改为 reset_config none " {8 j. a! r$ |: `
! D& [  M4 ?  g+ C- M2 H

; Q! d  j  L3 X" E, A然后再Run一下,就可以了。9 ?. @: r: b+ L: ?) O% R) v* @
程序实现了呼吸灯效果。
+ K+ ]/ [" }% D1 ~; F3 [
: A2 m7 v8 E! a7 K! s' J1 I
' b7 w8 N" j! z4 j+ Y# ?
注意
1 H9 \3 k: s' A8 q: C' q4 T3 G
. T# V/ Q# C8 T) O" S2 Y

7 c. D- T  {* o+ Z% p* e+ kTIM3->CCR2 = dutyCycle和__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, dutyCycle);
& m9 V8 Q# |  ]+ u% b
' T9 I1 P5 h8 g. }6 W; l

$ c5 [) T0 D  U是等效的。& p' e  ?% H% V1 F
$ _9 N5 @" S- |& k7 F9 Z+ b

8 z+ D; r- Q. F7 y* I' k& B; M
赞 收藏 评论0 发布时间:2021-5-28 16:40

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版