前言
6 n' `" ]/ f6 Q9 k; Y, w5 \/ U利用PWM控制实现全彩LED灯4 }: h9 ?( @ O4 _4 f
5 M; a% h% }) v0 q% Q
一、相关知识
) ?, k* S6 M4 d2 Z; ^1.全彩 LED 灯简介
# r$ ]+ d; v# t, ^" B! \6 n全彩 LED 灯,实质上是一种把红、绿、蓝单色发光体集成到小面积区域中的 LED 灯,控制时对这三种颜色的灯管输出不同的光照强度,即可混合得到不同的颜色,其混色原理与光的三原色混合原理一致。
$ _+ I! B: n+ m. ]
7 n1 a% x) C$ j: c( g" C本工程配套开发板中的 RGB 灯就是一种全彩 LED 灯,实现LED 基本控制时候,只能控制 RGB 三色灯的亮灭,即 RGB 每盏灯有[0:1]两种等级,因此只能组合出 8种颜色。要使用 STM32 控制 LED 灯输出多种亮度等级,可以通过控制输出脉冲的占空比来实现2 f" g$ b, h5 m
* ~0 A/ {! L8 K9 G4 h' T
# Z f0 [; f# A) C, v1 ~$ N: c7 Z) ]" V0 [) q, B4 L0 t( Y0 m& L3 A. z
图中列出了周期相同而占空比分别为 100%、80%、50%和 20%的脉冲波形,假如利用这样的脉冲控制 LED 灯,即可控制 LED 灯亮灭时间长度的比例。若提高脉冲的频率,LED 灯将会高频率进行开关切换,由于视觉暂留效应,人眼看不到 LED 灯的开关导致的闪烁现象,而是感觉到使用不同占空比的脉冲控制 LED 灯时的亮度差别。即单个控制周期内,LED 灯亮的平均时间越长,亮度就越高,反之越暗。& \* x: d/ M! W5 t$ S
把脉冲信号占空比分成 256 个等级,即可用于控制 LED 灯输出 256 种亮度,使用三种这样的信号控制 RGB 灯即可得到 256256256 种颜色混合的效果。而要控制占空比直接使用 STM32定时器的 PWM 功能即可。
; x% S- k) u/ y0 v+ i8 U; G
& ~' v. C( _! r; i5 } d+ D) C- W2.硬件简介 M$ U3 |" r" ]1 j! Q
LED 硬件原理图
% ?2 c( I7 Q- K: w& O) J9 _8 k' V; f. z8 \% w. b( p' a
9 r8 f* u! l: p* ?" c* \
3 F( b: H; K# B1 p2 {7 [RGB 灯使用阴极分别连接到了 PB5、PB0 及 PB1,它们分别是定时器
! w% b7 ^0 G! K9 w8 m5 ?TIM3 的通道 2、3、4,其中 PB5用于定时器输出通道时,需要使用重定义功能。
u) r& H7 x& {' l8 `$ Q/ j' z2 P4 f7 |9 n2 I+ S
二、代码实现
" N% o$ `( w, S# O# o3 v/ v3 _1.编程要点
; O ~% W# a @+ B0 G3 J) O @初始化 RGB灯使用的 GPIO;# p I" y1 v$ A I
配置定时器输出 PWM 脉冲;) q C% L3 e( ?9 A& I5 w2 m
编写修改 PWM脉冲占空比大小的函数; \2 D8 d7 P" s) s. M. s
测试配置的定时器脉冲控制周期是否会导致 LED 灯明显闪烁;
( Y1 a0 [% ?9 O" H) h
6 z: R7 i: L' E; A2.LED灯硬件相关宏定义
. @: N5 f; |' A. J& Tcolor_led.h文件:- /********定时器通道*******/
& ]& u/ q6 G- t. [4 ]* y7 \- A - #define COLOR_TIMx TIM3
) Q) F' E) y) a - # w" {' V8 g/ @( E9 p/ Z
- #define COLOR_TIM_APBxClock_FUN RCC_APB1PeriphClockCmd
& a& N! @1 s: Q! ~ |/ s - #define COLOR_TIM_CLK RCC_APB1Periph_TIM3
. P- {1 e3 ]$ [8 z; S/ T% u - #define COLOR_TIM_GPIO_CLK (RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO)8 z9 Z7 O; N9 L+ e
- //红灯的引脚需要重映射# i, ?9 t6 @6 R5 S
- #define COLOR_GPIO_REMAP_FUN() GPIO_PinRemapConfig(GPI0_PartialRemap_TIM3,ENABLE);& X3 x8 L: n: b0 |/ r6 H- F
- /********红灯*********/
2 h X; b+ x( S a: n - #define COLOR_RED_TIM_LED_PORT GPIOB+ ^9 S2 p7 z9 H: V- V
- #define COLOR_RED_TIM_LED_PIN GPIO_Pin_5) x+ S p4 J' ], S( `& H& t
0 I1 Z0 w# F& D2 ]& [1 E# F- #define COLOR_RED_TIM_OCxInit TIM_0C2Init //初始化通道函数
: I5 ?+ r4 M; T( G9 x, m3 Q1 V - #define COLOR_RED_TIM_OCxPreloadconfig TIM_OC2Preloadconfig//通道重载配置函数5 N' Y: y! {( s( B6 G. D+ m
- 5 E, v `# m" W& ? O0 R
- //通道比较寄存器,以TIMx->CCRx方式可访问该寄存器,设置新的比较值,控制占空比7 C, c! j3 ^. |' q7 Z2 d, E
- //以宏封装后,使用这种形式: COLOR_TIMx->COLOR_RED_CCRx ,可访问该通道的比较寄存器& a! [% ~" ~% Q) d& j t0 |
- 8 I# |" i q& L% S' _
- #define COLOR_RED_CCRx CCR2
9 y6 O; C5 ]5 H% B- x3 i1 x - 8 | m2 f; ~' V
- /************绿灯***********/
3 c+ b* r! O3 R, t \
, e9 p1 m7 m3 r- #define COLOR_GREEN_TIM_LED_PORT GPIOB( D+ b; Z! h. v. ~- B* e
- #define COLOR_GREEN_TIM_LED_PIN GPIO_Pin_0& R4 `- ]: I6 c( D
O& _' W4 T8 D8 K- #define COLOR_GREEN_TIM_OCxInit TIM_0C3Init //初始化通道函数
0 ]/ a+ E* x/ a$ y - #define COLOR_GREEN_TIM_OCxPreloadconfig TIM_OC3Preloadconfig//通道重载配置函数5 b' [9 {2 W* p, t+ G3 Q: d
- //通道比较寄存器,以TIMx->CCRx方式可访问该寄存器,设置新的比较值,控制占空比
! z8 @2 E5 E( Z* o' G5 g7 a- R - //以宏封装后,使用这种形式: COLOR_TIMx->COLOR_GREEN_CCRx ,可访问该通道的比较寄存器
! x2 ]3 M+ ]4 c2 |0 m - #define COLOR_GREEN_CCRx CCR34 N$ }2 V1 n6 L% c1 A
- " \- l' O3 F9 ^1 m# L1 b
- /************蓝灯***********/& T0 { H$ f8 k3 K
2 y! H6 ?& {$ S6 F# r( o- #define COLOR_BLUE_TIM_LED_PORT GPIOB4 t# f, j M4 i& {* G/ M) R
- #define COLOR_BLUE_TIM_LED_PIN GPIO_Pin_1
6 s9 m5 N- h4 ~. F1 U* O* t& u
+ m$ W! X4 P- r& J* m- #define COLOR_BLUE_TIM_OCxInit TIM_0C4Init //初始化通道函数
0 W7 ~0 v! b8 b; \ - #define COLOR_BLUE_TIM_OCxPreloadconfig TIM_OC4Preloadconfig//通道重载配置函数( |$ r* ^/ D4 O" Y
- //通道比较寄存器,以TIMx->CCRx方式可访问该寄存器,设置新的比较值,控制占空比
# b' x: o, q8 n1 L - //以宏封装后,使用这种形式: COLOR_TIMx->COLOR_BLUE_CCRx ,可访问该通道的比较寄存器5 l) d3 [1 m( j
- #define COLOR_BLUE_CCRx CCR4: H2 \" j7 B: l0 o# O
- Y! J) n7 w; Y9 V
" p8 C! j# [- {3 F
) h- D/ g: E5 ^; d6 C& k) K/ K# V" p- ' B' {' I. Z$ \" N0 _% A$ X* X
复制代码
0 W, c/ `0 z+ c, C# l1 K0 ?3 K5 \这些宏定义包括使用的定时器编号 COLOR_TIMx、定时器时钟使能库函数COLOR_TIM_APBxClock_FUN 和引脚重映射操作COLOR_GPIO_REMAP_FUN。4 E; l+ f0 q! `! [9 R/ B& M! ]1 s
控制各个 LED 灯时,每个颜色占用一个通道,这些与通道相关的也使用宏封装起来了,如:端口号 COLOR_xxx_TIM_LED_PORT、引脚号 COLOR_xxx_TIM_LED_PIN、通道初始化 库函 数 COLOR_xxx_TIM_OCxInit 、 通 道 重 载 配 置 库 函 数COLOR_xxx_TIM_OCxPreloadConfig 以及通道对应的比较寄存器名 COLOR_xxx_CCRx。其中 xxx宏中的 xxx指 RED、GREEN 和 BLUE 三种颜色。/ d' m m' n$ i. @& W
为方便修改定时器某通道输出脉冲的占空比,初始化定时器后,可以直接使用形如―TIM3->CCR2=0xFFFFFF‖的代码修改定时器 TIM3 通道 2 的比较寄存器中的数值,使用本工程中的宏封装后,形式改为―COLOR_TIMx ->COLOR_RED_CCRx=0xFFFFFF。/ S' }+ f1 j7 y3 L( Y) [
U3 S8 o' e% s1 L' O2.初始化 GPIO) j# F$ u( q/ E5 M
初始化用于定时器输出通道的 GPIO- //配置COLOR_TIMx复用输出PWM时用到的工/O
9 F6 i" w3 V' e5 ]3 p - 6 C |- ], Z! l- C/ q7 } b/ h
- static void COLOR_TIMx_GPIO_Config (void). s# I" q' c# ^) q; R8 g* ^
- {
) g3 F$ X r) D2 w$ [! w/ I - GPIO_InitTypeDef GPIO_InitStructure;% x+ {6 W- i# w7 L" ?" Q$ P/ r
- /* GPIo clock enable */0 g _) b* p/ X; }
- RCC_APB2PeriphClockCmd (COLOR_TIM_GPIO_CLK,ENABLE);
% W- `, Q; K' u# w8 l - //IO设置* K% K! G: L5 k$ s% P5 x4 a9 `" m
- COLOR_GPIO_REMAP_FUN () ;( R( K h) ^ i- P8 `: S/ a3 E3 v
- /*配置LED灯用到的引脚*/
0 S1 A6 }, ]9 W/ Z* z9 M1 n - //红
0 J- e# y# W5 R: k' W4 x8 P - GPIO_Initstructure.GPIO_Pin = COLOR_RED_TIM_LED_PIN ;
; \% M0 l% s+ A& T, l) w# D( C. T' E9 _ - GPIO_Initstructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出# H! z7 A8 e0 \8 s5 ~
- GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;
* B$ C4 [& n3 B4 c7 {- V( U4 y - GPIO_Init(COLOR_RED_TIM_LED_PORT,&GPIO_Initstructure) ; U" q+ d0 G2 w! j
- //绿5 n" s' Q/ U. G' v
- GPIO_Initstructure.GPIO_Pin = COLOR_GREEN_TIM_LED_PIN ;9 g5 E8 M5 K! a7 q# E
- GPIO_Init(COLOR_GREEN_TIM_LED_PORT,&GPIO_Initstructure) ;7 w. Z, z& Q- F5 t
- //蓝
2 W/ U3 \: b4 c9 h; R - GPIO_Initstructure.GPIO_Pin = COLOR_BLUE_TIM_LED_PIN ;
- \. E& ~; Y" ^6 l+ V - GPIO_Init(COLOR_BLUE_TIM_LED_PORT,&GPIO_Initstructure) ;* @% n. L; ^( m( Y0 d
- / p# q1 U3 @" c
- }5 L c4 H+ i% N8 F
复制代码 1 W4 T5 `, b- E/ p2 h( t- d
与 LED 灯的基本控制不同,由于本实训直接使用定时器输出通道的脉冲信号控制LED 灯,此处代码把 GPIO 相关的引脚都配置成了复用推挽输出模式。其中由于红灯使用的引脚需要用到第二功能,本代码使用 COLOR_GPIO_REMAP_FUN()进行了该引脚的功能重定义操作。
0 z2 I+ \& J* n# M3 @- k7 a& S6 u3 w( g5 u
3.定时器 PWM配置" M" \! M! A H0 Q& v
配置定时器输出 PWM 的工作模式
) E' A0 b. M' J1 `/ F' S$ p- //配置 COLOR_TIMx输出的PWM信号的模式,如周期、极性
3 X$ v- P+ t- d& u1 X - static void cOLOR_TIMx_Mode_Config (void)' N! N/ N& I9 d/ Z. g
- {* \0 R. B5 I( b( u- s. a' T
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;/ P/ l6 [8 ?# E$ o0 j
- TIM_OCInitTypeDef TIM_OCInitStructure;
! a9 M. e: e% X/ M% O8 V" k - /*设置TIM CLK时钟*/
6 I3 l8 K) G- z' l - //使能COLOR_TIMx时钟
& g5 a* @) Z4 `# Q" y - COLOR_TIM_APBxClock_FUN(COLOR_TIM_CLK,ENABLE);( N7 \( w8 L: b! t# W
- /*基本定时器配置*/' ]6 e5 s/ X; S: q0 x6 R( z
- //当定时器从0计数到255,即为256次,为一个定时周期
7 u( n& y2 j6 W: b" t - TIM_TimeBaseStructure.TIM_Period = 255;& O. v4 ` l) ~, R& A. D
- //设置预分频0 W5 [' k' o$ e- V
- TIM_TimeBaseStructure.TIM_Prescaler = 1999 ;; t4 e& g0 b$ x% r c) P
- //设置时钟分频系数:不分频(这里用不到)/ [1 E( B6 j( R" g3 R9 W- f0 \
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;
. s2 l9 y; Y6 q( x- ` - //向上计数模式
) k! X1 Q2 T7 p$ L- ?2 m3 X3 I1 m - TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
( I6 P1 i& q- w- z6 B) \ - TIM_TimeBaseInit(COLOR_TIMx,&TIM_TimeBaseStructure) ;
6 B0 k: @! E2 M% F6 p
% `; d `' W, P+ L- k- ' W& L+ m( d w
- /* PwM模式配置*/
2 e) R2 I' s$ G6 \! x - //配置为PWN模式1' C; l* U. ^ {
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWMl;
; `( ~4 j5 X' C5 O% \% b3 r! q - //使能输出
* X, E& p# S" X% q, ^ - TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
' G) O8 g. d3 |0 j" }3 Z" M. | - //设置初始PWM脉冲宽度为О- m4 M9 U$ i1 B! {3 S
- TIM_OCInitStructure.TIM_Pulse = 0 ;
; O0 N9 x5 f: V! ]5 b# j! G+ Y - //当定时器计数值小于CCR Val时为低电平$ M4 G% p; T+ `" G& T. T
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;1 q* G0 O1 r( O! q7 }
- //使能通道和预装载4 ~1 F2 q1 G; D$ X+ \
- COLOR_RED_TIM_OCxInit(COLOR_TIMx,&TIM_OCInitStructure);
- R* L5 f4 i" d - COLOR_RED_TIM_OCxPreloadConfig (COLOR_TIMx,TIM_OCPreload_Enable);) d2 O! F1 x' C, V
- //使能通道和预装载$ v* W, t( q ?5 Z1 W$ r+ L4 B
- COLOR_GREEN_TIM_OCxInit (COLOR_TIMx,&TIM_OCInitStructure) ;
V/ s3 ?& W. B. \ - COLOR_GREEN_TIM_OCxPreloadConfig(COLOR_TIMx,TIM_OCPreload_Enable) ;
+ ]7 o8 Z" T; v - //使能通道和预装载
8 ]- |; _, y) ]! y! u+ B- Q - COLOR_BLUE_TIM_OCxInit(COLOR_TIMx,&TIM_OCInitStructure);
: D C2 r r( ]+ r) I% N - COLOR_BLUE_TIM_OCxPreloadConfig (COLOR_TIMx,TIM_OCPreload_Enable);# l% C6 g( C5 U; B8 v& f. B
- //使能COLOR_TIMx重载寄存器ARR
5 E( b$ X6 H5 c3 c, |/ E% H9 u2 q2 t - TIM_ARRPreloadConfig(COLOR_TIMx,ENABLE) ;* F( J0 h$ [/ M% m3 D
- //使能定时器
+ @+ T9 @2 E8 T+ ] - TIM_Cmd(COLOR_TIMx,ENABLE) ;/ T, i8 h# y' |: H1 E# V
- }
; c4 _, w+ t0 ~/ G! \9 k - / E; B4 G, M2 [5 `- f
复制代码
! U! P) f. p% P8 O- _3 Y/ r本配置初始化了控制 RGB 灯用的定时器,它被配置为向上计数,TIM_Period 被配置为 255,即定时器每个时钟周期计数器加 1,计数至 255时溢出,从 0 开始重新计数;而代码中的 PWM 通道配置,当计数器的值小于输出比较寄存器 CCRx 的值时,PWM 通道输出低电平,点亮 LED 灯。所以上述代码配置把输出脉冲的单个周期分成了 256 份(注意区分定时器的时钟周期和输出脉冲周期),而输出比较寄存器 CCRx 配置的值即该脉冲周期内LED 灯点亮的时间份数,所以修改 CCRx 的值,即可控制输出[0:255]种亮度等级。' o4 f( S" a& b: u
关于定时器中的 TIM_Prescaler 分频配置,只要让它设置使得 PWM 控制脉冲的频率足够高,让人看不出 LED 灯闪烁即可,您可以亲自修改使用其它参数测试。# N/ Z3 Q2 R: n) \4 f, _/ |
4 M0 R$ Z- `7 \6 a" G4.设置混合颜色
4 c5 B- j' }: e) L: u- #define COLOR_TIMx TIM3
* j# e% W% H6 N6 d3 B - #define COLOR_RED_CCRx CCR2
: X2 p1 S3 \5 I* K9 ~: U1 F; e - #define COLOR_GREEN_CCRX CCR3; ]+ b. [5 y" j/ I8 d6 z: g9 Y
- #define COLOR_BLUE_CCRx CCR4.
/ \% s' C) ]& F/ g! [# b - /**
+ H0 H* a+ a' J, ~ - * @brief设置 RGB LED 的颜色
/ ] K. s& ~; O/ T- q5 z - * @param rgb:要设置LED显示的颜色值格式RGB888
/ D R, z4 W, K( Y) d& a8 `# V - * @retval 无
G% @' P5 D# j1 K - */
2 A, Y3 f/ [, [9 P I - void SetRGBColor (uint32_t rgb)( N' ?, |; F* j$ S
- {
B( n7 v) f7 T* _! M+ z4 d - //根据颜色值修改定时器的比较寄存器值9 ^ U7 p+ n0 [3 {/ r
- COLOR_TIMx->COLOR_RED_CCRx = (uint8_t) (rgb>>16) ;//R
/ @& C9 } Q/ n6 P, d& v% D2 Q - COLOR_TIMx->COLOR_GREEN_CCRx = (uint8_t) (rgb>>8); //G) h8 B6 Q: _. e; E7 k
- COLOR_TIMx->COLOR_BLUE_CCRx = (uint8_t) rgb;//B
) @2 G) f7 w% K4 E! y3 B, S: m - }
3 |9 U( `* V4 z- n+ Q - /**2 j5 n7 b0 ]6 F4 x W& m
- * @brief设置 RGB LED 的颜色2 M& o2 Z' k2 H# p
- * @param rgb:要设置LED显示的颜色值
a, E/ j# t1 Y0 n& f# z! a# Z - * @retval 无
3 |% T) ^' ~. g' Q& J2 E4 _ - */
$ O9 x. ^" b- B3 ^ V* o - void SetColorValue (uint8_t r,uint8_t g,uint8_t b)
8 z& Y; q' n; n% { - {
; L* c% h' k5 X2 ^5 N, _7 L% u0 | - //根据颜色值修改定时器的比较寄存器值! e" M- y: c5 y8 d6 o
- COLOR_TIMx->COLOR_RED_CCRx = r ;//R, c7 c' F! ?' D* P8 P! Q! z5 k, C
- COLOR_TIMx->COLOR_GREEN_CCRx = g; //G+ P, ]4 r% [, c
- COLOR_TIMx->COLOR_BLUE_CCRx = b;//B
) n, M1 j/ S4 D5 e - }# A5 E1 ^' ~7 q2 m- x- M! l
复制代码
! _! V, N, o; }/ [ C3 x& s/ V" A+ C6 K! J" L T/ [6 @- q+ _
本工程提供 SetRGBColor 和 SetColorValue 这两个函数用于设置 RGB 灯的颜色值,这两个函数功能和原理都一样,只是输入参数格式不同,方便使用不同格式的颜色值。) O/ ~ |. _# u) d7 |- Y: p
在代码层面,控制 RGB 灯的颜色实质就是控制各个 PWM 通道输出脉冲的占空比,而占空比可以通过设置定时器相应通道的输出比较寄存器值修改,又因为定时器已经把单个控制脉冲周期分成[0:255]份,控制时只要把 RGB888 各通道的颜色值直接赋予给输出比较寄存器即可。6 X9 y$ n! l1 h. I, ^/ g
% c1 e3 |$ I% Y7 W
- z' j/ L8 @( {( }1 p8 t5.主函数
/ ?! L1 }3 t( s c0 H2 q/ @- #define SOFT_DELAY() Delay(0xFFFFFF);
/ {# b1 b1 f. k' }0 y; l - . S8 ], v3 T7 J, K9 S
- void Delay(_IO u32 nCount);! y$ {. G$ o3 a
- int main(void)% m6 M F- ~5 B+ ~. B! K
- {8 V' p3 J$ y- f' ^6 m) T
- COLOR_TIMx_LED_Init();//初始化LED灯9 L# ~4 x9 |, ?* l) F' u
- while(1)
& M- L2 F- p/ V: z - {
4 Q% Q9 f, T7 Y2 f - //显示各种颜色9 H2 O% H& U) J$ p. V, ]3 ` F$ v
- SetRGBColor (0x8080ff) ;
$ N# \# b; H; L4 R - SOFT_DELAY () ;
M# i: U O B! M* O -
. p# o) o3 [' L& A- U: t- h - SetRGBColor (0xff8000) ;$ R5 U B( _7 J" o7 M
- SOFT_DELAY () ;2 X: P9 d8 W% P5 }
- 4 Z0 u4 X( W, a
- SetRGBColor (0xffc90e) ; .* i/ L* r5 Z/ A* |3 \. d
- SOFT_DELAY () ;6 n: Y0 l0 O' E' U/ Q( ^2 k
-
6 O! j0 E( M: q3 \ - SetColorValue(181,230,29) ;1 z! y$ H$ `" u, L; G
- SOFT_DELAY () ;2 c1 }2 Q2 z0 X% l c9 i/ ~; ?# c
-
# ?, @+ e/ q0 C- J - SetColorValue (255, 128, 64) ;
- R# B" }. O) N0 p! N: R( a - SOET_DELAY () ;+ e A& r6 g2 G. t5 y- ^2 t
; a! |+ Q, ]& G W. M! i; S- }
: D4 q" Q! r! e9 f- D$ T* i& P - }
, z3 t5 t D3 Q, n, | - void Delay(_IO uint32_t nCount)//简单的延时函数
4 J% B. l4 U$ Q% }* ~) b - {4 E6 o% i1 O# }* S& p
- for(; nCount != 0; nCount--) ;3 [5 e% x- k T' D' j7 _; o
: `. p& w* p' u- }
! Q2 ~0 x: K+ K& i: t
复制代码
+ G- p! r& u; d" V* R& i
% P# C$ V3 i% U% H# Tmain 函数中直接调用了 COLOR_TIMx_LED_Init 函数,而该函数内部又直接调用了前面 讲 解 的 GPIO 和 PWM 配 置 函 数 : COLOR_TIMx_GPIO_Config 和COLOR_TIMx_Mode_Config。初始化完成后,在 while 循环中调用 SetRGBColor 和SetColorValue切换 RGB灯显示的颜色。
! _0 G: {) i c* e
, s" r/ \$ j7 T2 y" L. j
5 }3 m( t8 b% ?1 Q- p6 n+ u- _1 r总结
0 L, M J: Y5 L( _# z* J. A编译并下载本程序到开发板,给开发板上电复位,可看到 RGB彩灯显示不同的色彩。
6 } ?; h; H4 s————————————————
5 {0 j- |3 J* p% @版权声明:清道 夫
- U& R/ L; o/ t) N9 E. p3 O; m/ `. k& }
/ V5 a8 N4 ~; R' ~1 q/ X+ V
|