前言
d- T1 J& u8 s. D m利用PWM控制实现全彩LED灯2 W- v/ ]7 |+ R( x4 v
: h G7 i1 R6 \0 Y4 D( \
一、相关知识4 p/ F* m8 g4 D6 y0 |/ |
1.全彩 LED 灯简介
* J, u' {3 ^, ?: e全彩 LED 灯,实质上是一种把红、绿、蓝单色发光体集成到小面积区域中的 LED 灯,控制时对这三种颜色的灯管输出不同的光照强度,即可混合得到不同的颜色,其混色原理与光的三原色混合原理一致。; v- p5 o5 V$ L
4 P L1 J7 D7 N! l) H# t: L
本工程配套开发板中的 RGB 灯就是一种全彩 LED 灯,实现LED 基本控制时候,只能控制 RGB 三色灯的亮灭,即 RGB 每盏灯有[0:1]两种等级,因此只能组合出 8种颜色。要使用 STM32 控制 LED 灯输出多种亮度等级,可以通过控制输出脉冲的占空比来实现
- X4 C9 h) L1 c: h- @0 a
- U+ u r! t' Z* s6 L
; x% h3 g3 P) D; }
& x, _( X0 |. _. H) O
图中列出了周期相同而占空比分别为 100%、80%、50%和 20%的脉冲波形,假如利用这样的脉冲控制 LED 灯,即可控制 LED 灯亮灭时间长度的比例。若提高脉冲的频率,LED 灯将会高频率进行开关切换,由于视觉暂留效应,人眼看不到 LED 灯的开关导致的闪烁现象,而是感觉到使用不同占空比的脉冲控制 LED 灯时的亮度差别。即单个控制周期内,LED 灯亮的平均时间越长,亮度就越高,反之越暗。& X2 l; A8 j( v; _ [' h+ U9 W
把脉冲信号占空比分成 256 个等级,即可用于控制 LED 灯输出 256 种亮度,使用三种这样的信号控制 RGB 灯即可得到 256256256 种颜色混合的效果。而要控制占空比直接使用 STM32定时器的 PWM 功能即可。
3 @. D2 Z! G( `' I8 K# b4 P" g3 a( G
2.硬件简介6 r) q. ~& S0 n. X% P5 C
LED 硬件原理图% T( v# Y% _2 `7 q/ {# [7 u9 S
" s0 ?: s5 f, B
" h$ G% _$ U( \0 z& V% P' P
7 C0 c3 \! X6 q- JRGB 灯使用阴极分别连接到了 PB5、PB0 及 PB1,它们分别是定时器7 r5 C5 H# I% ~+ b* i* e* T9 j
TIM3 的通道 2、3、4,其中 PB5用于定时器输出通道时,需要使用重定义功能。* T9 ?/ j9 N% K6 \$ q7 r% R3 K7 W
7 X- c' _: ^* X, y2 I* n& D
二、代码实现
: b4 h4 {! w8 c/ I: d1.编程要点" @, C( V, ]9 z, B% S1 Q
初始化 RGB灯使用的 GPIO;/ f8 E) s6 \% y8 m
配置定时器输出 PWM 脉冲;7 o7 ~, U* }- ~6 @# m
编写修改 PWM脉冲占空比大小的函数;- \. u; M6 o8 q S6 C
测试配置的定时器脉冲控制周期是否会导致 LED 灯明显闪烁;
+ `3 | k1 V$ W, }+ b, T3 d; k Z: E- h: l ?" u" F% j" Z( |
2.LED灯硬件相关宏定义( {: G! f' `/ Y( q- |) O; k
color_led.h文件:- /********定时器通道*******/0 R$ Y0 ]7 b B1 g* p% \/ y6 |
- #define COLOR_TIMx TIM3
" U+ l0 u0 c" k0 }- F p3 S - * ]: [0 H& c& `; P
- #define COLOR_TIM_APBxClock_FUN RCC_APB1PeriphClockCmd5 C$ y8 a9 W+ L
- #define COLOR_TIM_CLK RCC_APB1Periph_TIM3# R; z+ }, G4 Y6 x1 R! z
- #define COLOR_TIM_GPIO_CLK (RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO)
4 o0 K/ U$ E+ U( F - //红灯的引脚需要重映射+ q0 {. ^/ L$ O& ?, z6 n5 G4 J3 X
- #define COLOR_GPIO_REMAP_FUN() GPIO_PinRemapConfig(GPI0_PartialRemap_TIM3,ENABLE);
. h- x+ _7 m$ \/ W$ b - /********红灯*********/
6 Y/ D; a: l) W/ t - #define COLOR_RED_TIM_LED_PORT GPIOB
# q. L, u9 v1 v1 a8 f7 P - #define COLOR_RED_TIM_LED_PIN GPIO_Pin_5- b6 R/ p- _9 ]% }7 b2 w
- , N; E4 k7 Q5 Y! I' ^, Z
- #define COLOR_RED_TIM_OCxInit TIM_0C2Init //初始化通道函数" J7 R* C0 k' C6 I7 C# g5 j
- #define COLOR_RED_TIM_OCxPreloadconfig TIM_OC2Preloadconfig//通道重载配置函数
' l j) Q3 [3 X# I
2 |& N! { U2 ~% t9 M- //通道比较寄存器,以TIMx->CCRx方式可访问该寄存器,设置新的比较值,控制占空比
1 ~+ ?( }; m1 N) ? - //以宏封装后,使用这种形式: COLOR_TIMx->COLOR_RED_CCRx ,可访问该通道的比较寄存器
! P; Q" U9 J7 q+ \) r2 ^' W
/ c! t1 c! K5 ?2 Q4 l0 t- #define COLOR_RED_CCRx CCR2
5 W+ d) T: f8 ]- M! k3 t# m2 Z
9 R9 E: E0 x) B" L- /************绿灯***********// \) Y/ ?" `) A3 @- A2 O& \
$ P' U- |8 R* V. Z7 o8 o7 C- #define COLOR_GREEN_TIM_LED_PORT GPIOB
( o" G1 W( e/ }6 _ - #define COLOR_GREEN_TIM_LED_PIN GPIO_Pin_0
5 c; R2 Q0 q( J( d* C1 _& G
( m9 f3 f! I7 V% Q- }2 u- #define COLOR_GREEN_TIM_OCxInit TIM_0C3Init //初始化通道函数
- `# _' W( f( n, r4 R# ^; h5 E - #define COLOR_GREEN_TIM_OCxPreloadconfig TIM_OC3Preloadconfig//通道重载配置函数
& g6 l6 r8 Z% K1 ~# z! t' S - //通道比较寄存器,以TIMx->CCRx方式可访问该寄存器,设置新的比较值,控制占空比
( [5 ], G2 T% d% p! t, x7 e - //以宏封装后,使用这种形式: COLOR_TIMx->COLOR_GREEN_CCRx ,可访问该通道的比较寄存器
+ q0 J- d1 O- q2 P - #define COLOR_GREEN_CCRx CCR3/ p' M) l# Q9 \0 v! T
( F. H+ K- P0 H6 r. i/ [- /************蓝灯***********/
7 T5 S) H3 x. J/ w' a+ e
( J7 O2 [2 c$ s- #define COLOR_BLUE_TIM_LED_PORT GPIOB7 X/ Z( k. m p
- #define COLOR_BLUE_TIM_LED_PIN GPIO_Pin_1
/ E4 C" N7 y; Z) j7 U5 f* z8 | - # u- _/ A' G$ D+ ^) m% j
- #define COLOR_BLUE_TIM_OCxInit TIM_0C4Init //初始化通道函数
5 Z3 U9 V3 U. `) s% W0 F - #define COLOR_BLUE_TIM_OCxPreloadconfig TIM_OC4Preloadconfig//通道重载配置函数5 F6 O% U: z% d6 R* C# m
- //通道比较寄存器,以TIMx->CCRx方式可访问该寄存器,设置新的比较值,控制占空比
7 J7 H! W) j6 c6 y3 y1 X - //以宏封装后,使用这种形式: COLOR_TIMx->COLOR_BLUE_CCRx ,可访问该通道的比较寄存器' t' b8 H( H; F% p) i
- #define COLOR_BLUE_CCRx CCR4) a5 Z3 _2 }* e4 |
- ( N3 j, ^2 p& T& c$ J2 G( k
- . G" ^7 s! y: x" m0 a
; Q: F- [- m' T U: w, b- ' i7 w" l7 p2 s! i3 D2 n
复制代码 / s6 ~$ w9 s( |4 Z$ q
这些宏定义包括使用的定时器编号 COLOR_TIMx、定时器时钟使能库函数COLOR_TIM_APBxClock_FUN 和引脚重映射操作COLOR_GPIO_REMAP_FUN。; I$ E$ K/ y. Q1 V6 ]* E! B
控制各个 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 三种颜色。 l) g3 B+ t; l. ^* Y
为方便修改定时器某通道输出脉冲的占空比,初始化定时器后,可以直接使用形如―TIM3->CCR2=0xFFFFFF‖的代码修改定时器 TIM3 通道 2 的比较寄存器中的数值,使用本工程中的宏封装后,形式改为―COLOR_TIMx ->COLOR_RED_CCRx=0xFFFFFF。# L6 l Y/ }' B" l0 Q
9 k) z+ s5 V& B* Z t2.初始化 GPIO$ E+ M. l/ h* J$ }
初始化用于定时器输出通道的 GPIO- //配置COLOR_TIMx复用输出PWM时用到的工/O
# B9 s7 O* ~5 a/ I4 i' \5 h2 s; q
- k2 G9 ]. S, p1 z- static void COLOR_TIMx_GPIO_Config (void)/ h# J( P2 J: H9 l7 O
- {
0 z3 ?( @5 Y$ F5 U" q' @' S - GPIO_InitTypeDef GPIO_InitStructure;
6 I) e% J# v/ r+ @0 |" `/ l - /* GPIo clock enable */
5 a8 @1 ]- I. G8 z; `1 V1 e! `' H - RCC_APB2PeriphClockCmd (COLOR_TIM_GPIO_CLK,ENABLE);
$ x b9 k, @1 x - //IO设置( h/ N2 a4 a& u
- COLOR_GPIO_REMAP_FUN () ;- s! Q: ~- n8 p2 ^/ N5 i0 _4 Y
- /*配置LED灯用到的引脚*/! O- H* b/ x! [; \3 k- R
- //红
2 h3 e, z- f, z7 t V" } - GPIO_Initstructure.GPIO_Pin = COLOR_RED_TIM_LED_PIN ;/ R6 R* b; F$ m
- GPIO_Initstructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
' I5 g2 `; s: h# w4 x. \ - GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;( v( |8 a8 x- }$ { L: h
- GPIO_Init(COLOR_RED_TIM_LED_PORT,&GPIO_Initstructure) ;; B$ I* V) X% [, r" O6 H7 p
- //绿. V% B6 L7 b& q& O4 I; A9 h
- GPIO_Initstructure.GPIO_Pin = COLOR_GREEN_TIM_LED_PIN ;' h' F1 k& X6 D5 R1 x
- GPIO_Init(COLOR_GREEN_TIM_LED_PORT,&GPIO_Initstructure) ;# G0 s+ j& L7 h. c0 y0 Z: c5 k
- //蓝$ I6 P( g: J0 f S! h# V
- GPIO_Initstructure.GPIO_Pin = COLOR_BLUE_TIM_LED_PIN ;+ L; L7 }' r, {, ^+ |# ~' }
- GPIO_Init(COLOR_BLUE_TIM_LED_PORT,&GPIO_Initstructure) ;
% z$ N; t1 l! l( T7 g3 P% k
L) L& a! o$ _+ I% W: c- }
1 A% `& q# s9 F' a- p' I V5 N, L# F
复制代码 * j0 a% K- U% ^" y
与 LED 灯的基本控制不同,由于本实训直接使用定时器输出通道的脉冲信号控制LED 灯,此处代码把 GPIO 相关的引脚都配置成了复用推挽输出模式。其中由于红灯使用的引脚需要用到第二功能,本代码使用 COLOR_GPIO_REMAP_FUN()进行了该引脚的功能重定义操作。! Q2 j* k6 r" Z- u. f9 s* E
1 I% E {5 t+ x, q9 j/ P
3.定时器 PWM配置( Q& K0 Y0 ~8 i( k- [
配置定时器输出 PWM 的工作模式( L& X6 u# t8 o
- //配置 COLOR_TIMx输出的PWM信号的模式,如周期、极性! h3 }3 p: Q7 Y9 @" g
- static void cOLOR_TIMx_Mode_Config (void)2 P+ h- {9 _, \
- {! t* e* V7 C# B
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;7 D4 T' X; V) v
- TIM_OCInitTypeDef TIM_OCInitStructure;
& K: d% F8 h: F+ X s" A% e" X - /*设置TIM CLK时钟*/0 W5 x0 c# r* c
- //使能COLOR_TIMx时钟
2 y6 o4 j# T5 k3 E1 x/ A; W - COLOR_TIM_APBxClock_FUN(COLOR_TIM_CLK,ENABLE);
# K7 p' E! Q) h1 } - /*基本定时器配置*/# W% ^5 m4 D% _4 Y @9 M
- //当定时器从0计数到255,即为256次,为一个定时周期
4 L0 l$ w$ H6 f - TIM_TimeBaseStructure.TIM_Period = 255;
( ~6 E7 q5 J5 h" F9 `* r7 Q - //设置预分频
* C8 W) F: p" }9 [5 N( J, i7 ^ - TIM_TimeBaseStructure.TIM_Prescaler = 1999 ;7 E5 l k' Z. @8 q, R
- //设置时钟分频系数:不分频(这里用不到)
2 f' `& C o6 }" x4 I1 y - TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;, O9 X7 H+ U6 X8 e
- //向上计数模式
) x2 |5 x9 ^$ \+ e+ J( ] - TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;6 y' D0 f" V$ P; Z
- TIM_TimeBaseInit(COLOR_TIMx,&TIM_TimeBaseStructure) ;* p- t8 Q4 z4 w5 g
$ }6 H+ C6 P/ N3 I Z0 e
6 b& E; G# }) I* T, g. R- /* PwM模式配置*/- Q k7 W7 i0 q
- //配置为PWN模式1, C* {: q9 X* }8 l6 I* F
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWMl;
' p; P- w6 u; s. e# x5 b3 g0 L& m - //使能输出6 L4 F& i7 p1 A. u& x: i: x
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
/ Y- Q+ Y' }2 D5 ]8 } - //设置初始PWM脉冲宽度为О
8 A# O9 A- G( L6 ^# [) l - TIM_OCInitStructure.TIM_Pulse = 0 ; u6 Q/ t/ r& a' j
- //当定时器计数值小于CCR Val时为低电平
( C, _) m6 r1 v' W9 a$ ~& r - TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;7 e1 D5 k# a* e, Q1 z# T) v* ^
- //使能通道和预装载
2 p( ^% \8 g3 ^: t, v# X2 i5 q, { - COLOR_RED_TIM_OCxInit(COLOR_TIMx,&TIM_OCInitStructure);' C/ s6 [8 V% s1 W; \
- COLOR_RED_TIM_OCxPreloadConfig (COLOR_TIMx,TIM_OCPreload_Enable);
/ v* t0 D5 D. a% }/ X O - //使能通道和预装载9 b" X6 i4 U( a- N- C
- COLOR_GREEN_TIM_OCxInit (COLOR_TIMx,&TIM_OCInitStructure) ;, e) u/ c' {& \4 N+ i+ I
- COLOR_GREEN_TIM_OCxPreloadConfig(COLOR_TIMx,TIM_OCPreload_Enable) ;
/ `& o; [" ^% ] - //使能通道和预装载% h) ^0 s+ i) Y o: M( ~
- COLOR_BLUE_TIM_OCxInit(COLOR_TIMx,&TIM_OCInitStructure);
- m, t J2 f6 b' u& `5 V! Q4 p - COLOR_BLUE_TIM_OCxPreloadConfig (COLOR_TIMx,TIM_OCPreload_Enable);
& G, U/ ^) Z/ T8 L( \ - //使能COLOR_TIMx重载寄存器ARR
4 i! u# o* [: Q8 Z/ A9 u - TIM_ARRPreloadConfig(COLOR_TIMx,ENABLE) ;
( b% v2 g8 \$ b# R - //使能定时器( y: P; t% ~4 M: w3 y( F, f
- TIM_Cmd(COLOR_TIMx,ENABLE) ;" a$ ?* h! g: ^* Y% I. s$ Q! u
- }' ]$ A; O! D d/ j
* [( _: F) H3 ?! ]3 }; V
复制代码
) Y9 u- I; V; }! D- y j! S- u本配置初始化了控制 RGB 灯用的定时器,它被配置为向上计数,TIM_Period 被配置为 255,即定时器每个时钟周期计数器加 1,计数至 255时溢出,从 0 开始重新计数;而代码中的 PWM 通道配置,当计数器的值小于输出比较寄存器 CCRx 的值时,PWM 通道输出低电平,点亮 LED 灯。所以上述代码配置把输出脉冲的单个周期分成了 256 份(注意区分定时器的时钟周期和输出脉冲周期),而输出比较寄存器 CCRx 配置的值即该脉冲周期内LED 灯点亮的时间份数,所以修改 CCRx 的值,即可控制输出[0:255]种亮度等级。
+ T; j6 Q! r+ [; f, z关于定时器中的 TIM_Prescaler 分频配置,只要让它设置使得 PWM 控制脉冲的频率足够高,让人看不出 LED 灯闪烁即可,您可以亲自修改使用其它参数测试。# `3 z( p$ x" m5 ]# f
! ^) c' j0 @, ^/ ]! V8 j& ^( Z
4.设置混合颜色
* B2 F% J+ f1 Q* _- #define COLOR_TIMx TIM3
2 M( s2 O6 k0 W. [! [ - #define COLOR_RED_CCRx CCR2) d# K4 [) C6 C+ u) \/ ^
- #define COLOR_GREEN_CCRX CCR3
4 A( t7 B' H; J/ j - #define COLOR_BLUE_CCRx CCR4.
* H( ~* O! X. u# e5 X - /**: e3 o! u8 L" l
- * @brief设置 RGB LED 的颜色( b' \3 n, m& _- G5 I. N7 K
- * @param rgb:要设置LED显示的颜色值格式RGB888
6 [2 G p+ T! O - * @retval 无( W- s% O/ U- J* [
- */7 w" a* q8 L* Y
- void SetRGBColor (uint32_t rgb)% B5 e& M% q) }
- {
/ n* z% F. u2 x0 `2 z# K - //根据颜色值修改定时器的比较寄存器值
/ j1 K }) Q4 k% D - COLOR_TIMx->COLOR_RED_CCRx = (uint8_t) (rgb>>16) ;//R
9 Z+ A/ k6 C6 H: R5 j - COLOR_TIMx->COLOR_GREEN_CCRx = (uint8_t) (rgb>>8); //G
7 o) I4 _- S# Q - COLOR_TIMx->COLOR_BLUE_CCRx = (uint8_t) rgb;//B
+ x6 R% n3 C8 q5 d! H - }% W, \4 m0 F9 N4 r9 S
- /**# s$ @( e0 h e9 e
- * @brief设置 RGB LED 的颜色
- S( ]5 n8 ]( i. R - * @param rgb:要设置LED显示的颜色值4 B& ~0 E3 p5 O6 J+ j* M: s" T
- * @retval 无
: F) e( x$ W1 d* B5 n; S4 y* D - */
0 e; G- t& ]9 O1 P' c" G2 k - void SetColorValue (uint8_t r,uint8_t g,uint8_t b)0 B" r) r9 g9 P
- {' }2 ^8 R8 `( i! D2 t. w( O
- //根据颜色值修改定时器的比较寄存器值
: r" {: k( d5 \! @2 _ - COLOR_TIMx->COLOR_RED_CCRx = r ;//R2 F9 N/ j* \2 {3 ` E8 B# G2 t
- COLOR_TIMx->COLOR_GREEN_CCRx = g; //G
2 W. c& {6 D$ S$ o { U - COLOR_TIMx->COLOR_BLUE_CCRx = b;//B
: `/ N7 s. `- X9 L! k( }4 @ - }1 J- q0 A3 Q! o( L* X5 x6 r! T3 L
复制代码 Y$ t4 x* v! P: x2 q7 N5 I, F
+ n. m7 R' m# ~; _# N1 ?+ ]本工程提供 SetRGBColor 和 SetColorValue 这两个函数用于设置 RGB 灯的颜色值,这两个函数功能和原理都一样,只是输入参数格式不同,方便使用不同格式的颜色值。
" J3 ^7 q+ e- \% G9 h8 t1 H& u在代码层面,控制 RGB 灯的颜色实质就是控制各个 PWM 通道输出脉冲的占空比,而占空比可以通过设置定时器相应通道的输出比较寄存器值修改,又因为定时器已经把单个控制脉冲周期分成[0:255]份,控制时只要把 RGB888 各通道的颜色值直接赋予给输出比较寄存器即可。
) U1 o+ S/ ?% I7 D6 k9 H! n% Z2 g3 K
4 c3 [' z1 m' n1 Y; T/ n9 Z3 e5.主函数
* B. E* d3 `, t) E0 X* h9 s- #define SOFT_DELAY() Delay(0xFFFFFF); f; E4 Z6 z2 B8 X& n3 [7 @8 `( |
3 T5 c7 J1 Z. ~( a0 I. S- void Delay(_IO u32 nCount);. b& r. V5 U) T
- int main(void)9 I J, {( l. S! f% a2 z
- {4 Y U x- s0 C( e3 x
- COLOR_TIMx_LED_Init();//初始化LED灯
6 ~6 a1 x+ V+ { - while(1)0 F3 `! k) v% ~& n
- {
+ z/ m# r" G, r m& Q c - //显示各种颜色
& P- {- C c! d. B( B/ K - SetRGBColor (0x8080ff) ;* `7 l& N8 u* y7 [: M: ^4 o( ^
- SOFT_DELAY () ;; T; ^, e4 Q; g0 ~2 A) Q
-
3 p0 j/ n; E' }3 v - SetRGBColor (0xff8000) ;- U9 G, ?% I- `$ S u
- SOFT_DELAY () ;
# a3 J4 b9 g% F$ K5 q$ l m0 c$ ? - 3 h6 z) a0 C, [* r
- SetRGBColor (0xffc90e) ; .
, d; P. V/ c# K9 Y2 M! B - SOFT_DELAY () ;- Z5 p7 u1 J& I* {5 j
- : L: f/ z; l; F0 m! m5 F
- SetColorValue(181,230,29) ;5 A/ @' Q5 c) j
- SOFT_DELAY () ;: L5 z, Q% m2 j" P/ S b: w# t8 b3 z; Y
- # U3 E0 g5 x0 h: e* s
- SetColorValue (255, 128, 64) ;% W: f# J& `" W! |
- SOET_DELAY () ;2 Q* r& X$ h! \/ e5 _7 a7 {! v
- 4 Z, T! u8 N' x% j( ?/ B C/ W2 R
- }
5 M8 Z! H+ i3 L# B7 c- p B - }. C' `; c7 t3 L
- void Delay(_IO uint32_t nCount)//简单的延时函数
7 W" F2 g* j, P N - {+ n8 V! i; J4 v8 I9 m8 m+ q
- for(; nCount != 0; nCount--) ;
5 |0 |$ T! d- a# ^$ g - 6 R8 n0 X3 x# }# ^
- }
+ \8 D; `) e( a5 Z! M
复制代码 & q" ^# D% M4 [+ s
) h) P& L6 g. W# L; ?, s
main 函数中直接调用了 COLOR_TIMx_LED_Init 函数,而该函数内部又直接调用了前面 讲 解 的 GPIO 和 PWM 配 置 函 数 : COLOR_TIMx_GPIO_Config 和COLOR_TIMx_Mode_Config。初始化完成后,在 while 循环中调用 SetRGBColor 和SetColorValue切换 RGB灯显示的颜色。1 v* P+ g- C% W% }2 z' M% X
% @2 Z) u9 X( d5 ~
- ]1 t. _/ x9 b" ?总结7 |6 d7 {" `0 a- ?
编译并下载本程序到开发板,给开发板上电复位,可看到 RGB彩灯显示不同的色彩。
- N9 r0 _# r" i8 i. ?' D————————————————# {; s5 s" \8 ~; g0 o4 o
版权声明:清道 夫7 ?% [1 ~/ U; {$ H+ Y
- |, v) B5 g4 n0 y s
% @( t/ p. ~% D8 e# q9 s0 L# h |