2@TOC
(1)前言
(1)起源
最近作了有关ws2812灯带的后续测试,这源于一个简单的问题。
如果用STM32F4点灯带,每个DMA数据流都用上,那么可以点亮多少条灯带?
实际情况更加复杂些,自己将情况转化成上述问题,由此有了篇内容,本着事实求是的态度,实际测试16个数据流通道中,使得14个成功输出想要的波形。
(2)需要了解的基础知识
我们产看F4参考手册“STM32F4xx中文参考手册”,可以找到“DMA1请求映射表”和“DMA2请求映射表”,如下图所示。
—DMA1请求映射表
—DMA2请求映射表
问题转换称,就是
使用DMA1+DMA2推动PWM波形,电亮灯带WS2812.
(2)环境
- 软件环境:STM32cubeIDE 1.8.0
- 硬件芯片:STM32F407ZGT6
- HAL库版本:stm32cube_fw_f4_v1262
- 检测工具:逻辑分析仪(DSView)
- 灯带型号:WS2812
注意:其实不必必须要有灯带,有逻辑分析也行,二选一,都有更好。
(3)先行文章
自己也是参照之前的文章,建议先看看。
软件STM32cubeIDE下STM32F4xx使用32位定时器2(TIM2)用DMA+PWM点亮灯带WS2812-基础样例
(4)实验过程
本次实验同时配置多个DMA+PWM,所以只列举出重要的几个步骤,配置定时器时很多都是重复操作。
(1)下载以及时钟配置
(1)时钟配置
(2)下载口配置
(2)外部晶振表配置
(3)定时器配置(举例TIM2 和 TIM1 )
这块还是需要注意的,实际查了下,其实TIM2和TIM5是32位自动装载寄存器,选择DMA时,切记选全字(word)如下图,做TIM1和TIM8是高级定时器,却是16位自动装载寄存器,使用时候要注意下,自己就被卡在这里,”细节点“里会详细说这个事情。
(1)tim2相关配置
由上图可以到(AutoReload Register - 32 bits value)字样,那么在配置DMA时 选择word。
(2)tim1相关配置
定时器这自己群起来的每个选项,都需要注意,每个选择,都有一定影响。
定时器1如下图所示,可以到(AutoReload Register - 16 bits value)字样,那在选择half word
这里有三个通道,所以要给三个通道都赋值,要注意下。
增加DMA通道配置,选择half word.
(3)其它定时器配置
这里就不一一列举了,做了一个表格,引脚,通道,等相关信息,一目了然,直接看。
实在不确定,就去下代码。
(4)加入灯带控制代码
然后就可以保存,然后生成代码。在主函数里加入相应灯带控制代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360uint32_t tim2_ccr1_value[]={10,20,30,40,50,60,70,80,90}; uint16_t tim3_ccr1_value[]={10,20,30,40,50,60,70,80,90}; #define ONE_PULSE (59) //1 #define ZERO_PULSE (29) //0 #define RESET_PULSE (48) //80 ¸ #define LED_NUMS (22) //led ¸ #define LED_DATA_LEN (24) //led #define WS2812_DATA_LEN (LED_NUMS*LED_DATA_LEN) //ws2812 uint16_t RGB_buffur[RESET_PULSE + WS2812_DATA_LEN] = { 0 }; uint32_t RGB_buffur1[RESET_PULSE + WS2812_DATA_LEN] = { 0 }; void ws2812_set_RGB(uint8_t R, uint8_t G, uint8_t B, uint16_t num) { uint16_t * p = (RGB_buffur + RESET_PULSE) + (num * LED_DATA_LEN); for (uint16_t i = 0;i < 8;i++) { p[i] = (G << i) & (0x80)?ONE_PULSE:ZERO_PULSE; p[i + 8] = (R << i) & (0x80)?ONE_PULSE:ZERO_PULSE; p[i + 16] = (B << i) & (0x80)?ONE_PULSE:ZERO_PULSE; } } void ws2812_set_RGB1(uint8_t R, uint8_t G, uint8_t B, uint16_t num) { uint32_t * p = (RGB_buffur1 + RESET_PULSE) + (num * LED_DATA_LEN); for (uint16_t i = 0;i < 8;i++) { p[i] = (G << i) & (0x80)?ONE_PULSE:ZERO_PULSE; p[i + 8] = (R << i) & (0x80)?ONE_PULSE:ZERO_PULSE; p[i + 16] = (B << i) & (0x80)?ONE_PULSE:ZERO_PULSE; } } void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) { //if(htim) __HAL_TIM_SetCompare(htim, TIM_CHANNEL_1,0); //占空比清0,若不清会导致灯珠颜色不�?? HAL_TIM_PWM_Stop_DMA(htim,TIM_CHANNEL_1); __HAL_TIM_SetCompare(htim, TIM_CHANNEL_2,0); //占空比清0,若不清会导致灯珠颜色不�?? HAL_TIM_PWM_Stop_DMA(htim,TIM_CHANNEL_2); __HAL_TIM_SetCompare(htim, TIM_CHANNEL_3,0); //占空比清0,若不清会导致灯珠颜色不�?? HAL_TIM_PWM_Stop_DMA(htim,TIM_CHANNEL_3); __HAL_TIM_SetCompare(htim, TIM_CHANNEL_4,0); //占空比清0,若不清会导致灯珠颜色不�?? HAL_TIM_PWM_Stop_DMA(htim,TIM_CHANNEL_4); } void ws2812_example(void) { ws2812_set_RGB1(0x22, 0x00, 0x00, 0); ws2812_set_RGB1(0x00, 0x22, 0x00, 1); ws2812_set_RGB1(0x00, 0x00, 0x22, 2); ws2812_set_RGB1(0x22, 0x22, 0x22, 3); ws2812_set_RGB1(0x22, 0x00, 0x00, 4); ws2812_set_RGB1(0x00, 0x22, 0x00, 5); ws2812_set_RGB1(0x00, 0x00, 0x22, 6); ws2812_set_RGB1(0x22, 0x22, 0x22, 7); ws2812_set_RGB1(0x22, 0x00, 0x00, 8); ws2812_set_RGB1(0x00, 0x22, 0x00, 9); ws2812_set_RGB1(0x00, 0x00, 0x22, 10); ws2812_set_RGB1(0x22, 0x22, 0x22, 11); ws2812_set_RGB1(0x22, 0x00, 0x00, 12); ws2812_set_RGB1(0x00, 0x22, 0x00, 13); ws2812_set_RGB1(0x00, 0x00, 0x22, 14); ws2812_set_RGB1(0x22, 0x22, 0x22, 15); ws2812_set_RGB1(0x22, 0x00, 0x00, 16); ws2812_set_RGB1(0x00, 0x22, 0x00, 17); ws2812_set_RGB1(0x00, 0x00, 0x22, 18); ws2812_set_RGB1(0x22, 0x22, 0x22, 19); ws2812_set_RGB1(0x22, 0x00, 0x00, 20); ws2812_set_RGB1(0x00, 0x22, 0x00, 21); ///R-�??///G-�??//B-�??/第几个灯// ws2812_set_RGB(0x22, 0x22, 0x22, 0); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 1); //0010 0010 0000 0000 0000 0000 ws2812_set_RGB(0x00, 0x22, 0x00, 2); //0000 0000 0010 0010 0000 0000 ws2812_set_RGB(0x00, 0x00, 0x22, 3); //0000 0010 0000 0000 0010 0010 ws2812_set_RGB(0x22, 0x22, 0x22, 4); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 5); //0010 0010 0000 0000 0000 0000 ws2812_set_RGB(0x00, 0x22, 0x00, 6); //0000 0000 0010 0010 0000 0000 ws2812_set_RGB(0x00, 0x00, 0x22, 7); //0000 0010 0000 0000 0010 0010 ws2812_set_RGB(0x22, 0x22, 0x22, 8); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 9); //0010 0010 0000 0000 0000 0000 ws2812_set_RGB(0x00, 0x22, 0x00, 10); //0000 0000 0010 0010 0000 0000 ws2812_set_RGB(0x00, 0x00, 0x22, 11); //0000 0010 0000 0000 0010 0010 ws2812_set_RGB(0x22, 0x22, 0x22, 12); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 13); //0010 0010 0000 0000 0000 0000 ws2812_set_RGB(0x00, 0x22, 0x00, 14); //0000 0000 0010 0010 0000 0000 ws2812_set_RGB(0x00, 0x00, 0x22, 15); //0000 0010 0000 0000 0010 0010 ws2812_set_RGB(0x22, 0x22, 0x22, 16); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 17); //0010 0010 0000 0000 0000 0000 ws2812_set_RGB(0x00, 0x22, 0x00, 18); //0000 0000 0010 0010 0000 0000 ws2812_set_RGB(0x00, 0x00, 0x22, 19); //0000 0010 0000 0000 0010 0010 ws2812_set_RGB(0x22, 0x22, 0x22, 20); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 21); //0010 0010 0000 0000 0000 0000 HAL_TIM_PWM_Start_DMA(&htim2,TIM_CHANNEL_1,(uint32_t *)RGB_buffur1,576); HAL_TIM_PWM_Start_DMA(&htim3,TIM_CHANNEL_1,(uint32_t *)RGB_buffur,576); HAL_Delay(10); HAL_TIM_PWM_Start_DMA(&htim2, TIM_CHANNEL_1, tim2_ccr1_value, 9); HAL_TIM_PWM_Start_DMA(&htim3, TIM_CHANNEL_1, (uint32_t *)tim3_ccr1_value, 9); HAL_Delay(400); /* ///R-�??///G-�??//B-�??/第几个灯// ws2812_set_RGB(0x22, 0x22, 0x22, 0); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 1); //0010 0010 0000 0000 0000 0000 ws2812_set_RGB(0x00, 0x22, 0x00, 2); //0000 0000 0010 0010 0000 0000 ws2812_set_RGB(0x00, 0x00, 0x22, 3); //0000 0010 0000 0000 0010 0010 ws2812_set_RGB(0x22, 0x22, 0x22, 4); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 5); //0010 0010 0000 0000 0000 0000 ws2812_set_RGB(0x00, 0x22, 0x00, 6); //0000 0000 0010 0010 0000 0000 ws2812_set_RGB(0x00, 0x00, 0x22, 7); //0000 0010 0000 0000 0010 0010 ws2812_set_RGB(0x22, 0x22, 0x22, 8); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 9); //0010 0010 0000 0000 0000 0000 ws2812_set_RGB(0x00, 0x22, 0x00, 10); //0000 0000 0010 0010 0000 0000 ws2812_set_RGB(0x00, 0x00, 0x22, 11); //0000 0010 0000 0000 0010 0010 ws2812_set_RGB(0x22, 0x22, 0x22, 12); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 13); //0010 0010 0000 0000 0000 0000 ws2812_set_RGB(0x00, 0x22, 0x00, 14); //0000 0000 0010 0010 0000 0000 ws2812_set_RGB(0x00, 0x00, 0x22, 15); //0000 0010 0000 0000 0010 0010 ws2812_set_RGB(0x22, 0x22, 0x22, 16); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 17); //0010 0010 0000 0000 0000 0000 ws2812_set_RGB(0x00, 0x22, 0x00, 18); //0000 0000 0010 0010 0000 0000 ws2812_set_RGB(0x00, 0x00, 0x22, 19); //0000 0010 0000 0000 0010 0010 ws2812_set_RGB(0x22, 0x22, 0x22, 20); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 21); //0010 0010 0000 0000 0000 0000 //发�?? HAL_TIM_PWM_Start_DMA(&htim2,TIM_CHANNEL_1,(uint32_t *)RGB_buffur,576); HAL_TIM_PWM_Start_DMA(&htim3,TIM_CHANNEL_1,(uint32_t *)RGB_buffur,576); HAL_Delay(100); HAL_TIM_PWM_Start_DMA(&htim2, TIM_CHANNEL_1, tim2_ccr1_value, 9); HAL_TIM_PWM_Start_DMA(&htim3, TIM_CHANNEL_1, (uint32_t *)tim3_ccr1_value, 9); HAL_Delay(300); */ } uint8_t interval_time_temp=2; void ws2812_example2(void) { HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim2, TIM_CHANNEL_1, tim2_ccr1_value, 9); HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim2, TIM_CHANNEL_2, tim2_ccr1_value, 9); HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim5, TIM_CHANNEL_3, tim2_ccr1_value, 9); HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim5, TIM_CHANNEL_4, tim2_ccr1_value, 9); HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim3, TIM_CHANNEL_1, (uint32_t *)tim3_ccr1_value, 9); HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim3, TIM_CHANNEL_4, (uint32_t *)tim3_ccr1_value, 9); HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim4, TIM_CHANNEL_2, (uint32_t *)tim3_ccr1_value, 9); HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim4, TIM_CHANNEL_3, (uint32_t *)tim3_ccr1_value, 9); HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_1, (uint32_t *)tim3_ccr1_value, 9); HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_2, (uint32_t *)tim3_ccr1_value, 9); HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_3, (uint32_t *)tim3_ccr1_value, 9); HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_4, (uint32_t *)tim3_ccr1_value, 9); HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim8, TIM_CHANNEL_2, (uint32_t *)tim3_ccr1_value, 9); HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim8, TIM_CHANNEL_3, (uint32_t *)tim3_ccr1_value, 9); HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim8, TIM_CHANNEL_4, (uint32_t *)tim3_ccr1_value, 9); HAL_Delay(400); /* ///R-�??///G-�??//B-�??/第几个灯// ws2812_set_RGB(0x22, 0x22, 0x22, 0); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 1); //0010 0010 0000 0000 0000 0000 ws2812_set_RGB(0x00, 0x22, 0x00, 2); //0000 0000 0010 0010 0000 0000 ws2812_set_RGB(0x00, 0x00, 0x22, 3); //0000 0010 0000 0000 0010 0010 ws2812_set_RGB(0x22, 0x22, 0x22, 4); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 5); //0010 0010 0000 0000 0000 0000 ws2812_set_RGB(0x00, 0x22, 0x00, 6); //0000 0000 0010 0010 0000 0000 ws2812_set_RGB(0x00, 0x00, 0x22, 7); //0000 0010 0000 0000 0010 0010 ws2812_set_RGB(0x22, 0x22, 0x22, 8); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 9); //0010 0010 0000 0000 0000 0000 ws2812_set_RGB(0x00, 0x22, 0x00, 10); //0000 0000 0010 0010 0000 0000 ws2812_set_RGB(0x00, 0x00, 0x22, 11); //0000 0010 0000 0000 0010 0010 ws2812_set_RGB(0x22, 0x22, 0x22, 12); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 13); //0010 0010 0000 0000 0000 0000 ws2812_set_RGB(0x00, 0x22, 0x00, 14); //0000 0000 0010 0010 0000 0000 ws2812_set_RGB(0x00, 0x00, 0x22, 15); //0000 0010 0000 0000 0010 0010 ws2812_set_RGB(0x22, 0x22, 0x22, 16); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 17); //0010 0010 0000 0000 0000 0000 ws2812_set_RGB(0x00, 0x22, 0x00, 18); //0000 0000 0010 0010 0000 0000 ws2812_set_RGB(0x00, 0x00, 0x22, 19); //0000 0010 0000 0000 0010 0010 ws2812_set_RGB(0x22, 0x22, 0x22, 20); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 21); //0010 0010 0000 0000 0000 0000 //发�?? HAL_TIM_PWM_Start_DMA(&htim2,TIM_CHANNEL_1,(uint32_t *)RGB_buffur,576); HAL_TIM_PWM_Start_DMA(&htim3,TIM_CHANNEL_1,(uint32_t *)RGB_buffur,576); HAL_Delay(100); HAL_TIM_PWM_Start_DMA(&htim2, TIM_CHANNEL_1, tim2_ccr1_value, 9); HAL_TIM_PWM_Start_DMA(&htim3, TIM_CHANNEL_1, (uint32_t *)tim3_ccr1_value, 9); HAL_Delay(300); */ } void ws2812_example3(void) { ws2812_set_RGB1(0x22, 0x00, 0x00, 0); ws2812_set_RGB1(0x00, 0x22, 0x00, 1); ws2812_set_RGB1(0x00, 0x00, 0x22, 2); ws2812_set_RGB1(0x22, 0x22, 0x22, 3); ws2812_set_RGB1(0x22, 0x00, 0x00, 4); ws2812_set_RGB1(0x00, 0x22, 0x00, 5); ws2812_set_RGB1(0x00, 0x00, 0x22, 6); ws2812_set_RGB1(0x22, 0x22, 0x22, 7); ws2812_set_RGB1(0x22, 0x00, 0x00, 8); ws2812_set_RGB1(0x00, 0x22, 0x00, 9); ws2812_set_RGB1(0x00, 0x00, 0x22, 10); ws2812_set_RGB1(0x22, 0x22, 0x22, 11); ws2812_set_RGB1(0x22, 0x00, 0x00, 12); ws2812_set_RGB1(0x00, 0x22, 0x00, 13); ws2812_set_RGB1(0x00, 0x00, 0x22, 14); ws2812_set_RGB1(0x22, 0x22, 0x22, 15); ws2812_set_RGB1(0x22, 0x00, 0x00, 16); ws2812_set_RGB1(0x00, 0x22, 0x00, 17); ws2812_set_RGB1(0x00, 0x00, 0x22, 18); ws2812_set_RGB1(0x22, 0x22, 0x22, 19); ws2812_set_RGB1(0x22, 0x00, 0x00, 20); ws2812_set_RGB1(0x00, 0x22, 0x00, 21); ///R-�??///G-�??//B-�??/第几个灯// ws2812_set_RGB(0x22, 0x22, 0x22, 0); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 1); //0010 0010 0000 0000 0000 0000 ws2812_set_RGB(0x00, 0x22, 0x00, 2); //0000 0000 0010 0010 0000 0000 ws2812_set_RGB(0x00, 0x00, 0x22, 3); //0000 0010 0000 0000 0010 0010 ws2812_set_RGB(0x22, 0x22, 0x22, 4); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 5); //0010 0010 0000 0000 0000 0000 ws2812_set_RGB(0x00, 0x22, 0x00, 6); //0000 0000 0010 0010 0000 0000 ws2812_set_RGB(0x00, 0x00, 0x22, 7); //0000 0010 0000 0000 0010 0010 ws2812_set_RGB(0x22, 0x22, 0x22, 8); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 9); //0010 0010 0000 0000 0000 0000 ws2812_set_RGB(0x00, 0x22, 0x00, 10); //0000 0000 0010 0010 0000 0000 ws2812_set_RGB(0x00, 0x00, 0x22, 11); //0000 0010 0000 0000 0010 0010 ws2812_set_RGB(0x22, 0x22, 0x22, 12); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 13); //0010 0010 0000 0000 0000 0000 ws2812_set_RGB(0x00, 0x22, 0x00, 14); //0000 0000 0010 0010 0000 0000 ws2812_set_RGB(0x00, 0x00, 0x22, 15); //0000 0010 0000 0000 0010 0010 ws2812_set_RGB(0x22, 0x22, 0x22, 16); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 17); //0010 0010 0000 0000 0000 0000 ws2812_set_RGB(0x00, 0x22, 0x00, 18); //0000 0000 0010 0010 0000 0000 ws2812_set_RGB(0x00, 0x00, 0x22, 19); //0000 0010 0000 0000 0010 0010 ws2812_set_RGB(0x22, 0x22, 0x22, 20); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 21); //0010 0010 0000 0000 0000 0000 // HAL_TIM_PWM_Start_DMA(&htim2,TIM_CHANNEL_1,(uint32_t *)RGB_buffur1,576); // HAL_TIM_PWM_Start_DMA(&htim3,TIM_CHANNEL_1,(uint32_t *)RGB_buffur,576); HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim2, TIM_CHANNEL_1, (uint32_t *)RGB_buffur1, 576); HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim2, TIM_CHANNEL_2, (uint32_t *)RGB_buffur1, 576); HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim5, TIM_CHANNEL_3, (uint32_t *)RGB_buffur1, 576); HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim5, TIM_CHANNEL_4, (uint32_t *)RGB_buffur1, 576); HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim3, TIM_CHANNEL_1, (uint32_t *)RGB_buffur, 576); HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim3, TIM_CHANNEL_4, (uint32_t *)RGB_buffur, 576); HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim4, TIM_CHANNEL_2, (uint32_t *)RGB_buffur, 576); HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim4, TIM_CHANNEL_3, (uint32_t *)RGB_buffur, 576); HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_1, (uint32_t *)RGB_buffur, 576); HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_2, (uint32_t *)RGB_buffur, 576); HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_3, (uint32_t *)RGB_buffur, 576); HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_4, (uint32_t *)RGB_buffur, 576); HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim8, TIM_CHANNEL_2, (uint32_t *)RGB_buffur, 576); HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim8, TIM_CHANNEL_3, (uint32_t *)RGB_buffur, 576); HAL_Delay(interval_time_temp); HAL_TIM_PWM_Start_DMA(&htim8, TIM_CHANNEL_4, (uint32_t *)RGB_buffur, 576); HAL_Delay(400); // HAL_Delay(10); // HAL_TIM_PWM_Start_DMA(&htim2, TIM_CHANNEL_1, tim2_ccr1_value, 9); // HAL_TIM_PWM_Start_DMA(&htim3, TIM_CHANNEL_1, (uint32_t *)tim3_ccr1_value, 9); HAL_Delay(400); /* ///R-�??///G-�??//B-�??/第几个灯// ws2812_set_RGB(0x22, 0x22, 0x22, 0); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 1); //0010 0010 0000 0000 0000 0000 ws2812_set_RGB(0x00, 0x22, 0x00, 2); //0000 0000 0010 0010 0000 0000 ws2812_set_RGB(0x00, 0x00, 0x22, 3); //0000 0010 0000 0000 0010 0010 ws2812_set_RGB(0x22, 0x22, 0x22, 4); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 5); //0010 0010 0000 0000 0000 0000 ws2812_set_RGB(0x00, 0x22, 0x00, 6); //0000 0000 0010 0010 0000 0000 ws2812_set_RGB(0x00, 0x00, 0x22, 7); //0000 0010 0000 0000 0010 0010 ws2812_set_RGB(0x22, 0x22, 0x22, 8); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 9); //0010 0010 0000 0000 0000 0000 ws2812_set_RGB(0x00, 0x22, 0x00, 10); //0000 0000 0010 0010 0000 0000 ws2812_set_RGB(0x00, 0x00, 0x22, 11); //0000 0010 0000 0000 0010 0010 ws2812_set_RGB(0x22, 0x22, 0x22, 12); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 13); //0010 0010 0000 0000 0000 0000 ws2812_set_RGB(0x00, 0x22, 0x00, 14); //0000 0000 0010 0010 0000 0000 ws2812_set_RGB(0x00, 0x00, 0x22, 15); //0000 0010 0000 0000 0010 0010 ws2812_set_RGB(0x22, 0x22, 0x22, 16); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 17); //0010 0010 0000 0000 0000 0000 ws2812_set_RGB(0x00, 0x22, 0x00, 18); //0000 0000 0010 0010 0000 0000 ws2812_set_RGB(0x00, 0x00, 0x22, 19); //0000 0010 0000 0000 0010 0010 ws2812_set_RGB(0x22, 0x22, 0x22, 20); //0010 0010 0010 0010 0010 0010 ws2812_set_RGB(0x22, 0x00, 0x00, 21); //0010 0010 0000 0000 0000 0000 //发�?? HAL_TIM_PWM_Start_DMA(&htim2,TIM_CHANNEL_1,(uint32_t *)RGB_buffur,576); HAL_TIM_PWM_Start_DMA(&htim3,TIM_CHANNEL_1,(uint32_t *)RGB_buffur,576); HAL_Delay(100); HAL_TIM_PWM_Start_DMA(&htim2, TIM_CHANNEL_1, tim2_ccr1_value, 9); HAL_TIM_PWM_Start_DMA(&htim3, TIM_CHANNEL_1, (uint32_t *)tim3_ccr1_value, 9); HAL_Delay(300); */ }
(5)实验测试
(1)测试实验说明
(1)逻辑分析仪代码测试,开始时候,我实际没有灯带,就像用逻辑分析仪测试,如果你也想用逻辑分析仪测试,建议使用样例2,如下图,这个样例是输出百分比波形,而不是灯带需要的波形。
(2)后来我想想,觉得既然给到他人,那么他人可能没有逻辑分析仪,而有灯带(型号要匹配:ws2812),那么可以使用样例3,这个是点亮20个灯(每记错的话,忘记20几个了)。
(2)测试实验实测数据
本着实事求是的原则,每个通道都自己测试了一便,同时自己用两条灯带自己每个通道引脚,实际插了一遍。
(1)用例1:逻辑分析仪测试数据截图。
1)定期器1的3路
2)定期器8的3路
3)定时器2和定时器5
定时2的PA1引脚连接外部设备,影响的原因,这路在开发板上无法正常输出,之前论证过程。
4)定时器3和定时器4
(1)用例2:实际点灯,插的硬件引脚图。
实际上按照上述表格来插灯带的,又因为PA1不能用,所以下列测试看起来不是成双成对的。
1)定期器2的PA0 和 定时器5的PA2
2)定期器5的PA3 和 定时器3的PA6
3)定期器3的PB1 和 定时器4的PD13
4)定期器4的PD14 和 定时器1的PE9
5)定期器1的PE11 和 定时器1的PE13
6)定期器8的PC7 和 定时器8的PC8
7)定时器8的PC9
(6)实验代码
实验代码连接:https://download.csdn.net/download/qq_22146161/87254477
(7)细节点
实际测试,细节点还是挺多的,稍微不注意,就可能出问题。
(1)半字全字
开始就说了,注意选择时,如果重装载寄存器是32位就选word,反之就选16位的,在调试代码是,也要区分16位。
如果选错就会出现,3.8us毫秒,不受控制情况。
代码也要注意下。
(2)循环与不循环
DMA在调试时,设置循环与不循环时,会影响接下里的输出,第一波后,如果循环,会继续发之前的。下图是在代码中调整是否循环。
效果如下,是不循环
效果如下,是循环
(3)引脚标识错误
在使用开发板是,看见正点原子上“D14”标识,以为就是PD14引脚,其实那个是显示屏的D14引脚,实际上是D0,这点查了原理图才知道,我说调了半天就是不出波形。
(4)软件阻止问题
我们选择一个通道后,再去选择其它通道,有时会显示红色,说明软件本身就告诉你,DMA通道就那些,这个选择了,相同数据流就选择不了。
另外还有一种提示,是告诉你已经没有通道可以选了。
(5)开发板特殊引脚无法使用
这个在之前文章验证过,使用另一个没有外设影响的,验证PA1时,是可以输出的。
(6)通道对应 IDE软件无法找到TIM1_UP 和 TIM1_TRIG
开始自己不知道,以为这两个TIM1_UP 和 TIM1_TRIG也可以使用PWM输出,后来请教大佬后,才知道,这两个是定时器事件没办法输出PWM,也没有通道,这也解释了,为什么只有14个可以输出PWM。
另外我尝试搜索这俩,也没有,如下图所示。
(7) 定时器重装在寄存器
特意去手册里核对了下,发现TIM2和TIM5确实是32位自动装载定时器,而作为高级定时器的TIM1和TIM8是16位的。
TIM2和TIM5如下
(8)内存到外设设置
设置的时候,自己操作错误,忘记设置内存到外设,而软件是默认外设到内存,所以也没有输出,这点还是要注意下的。
(9)引脚选定与迁移
我这里其实相当选择了默认的引脚,实际根据需求,可以先定引脚,订到自己需要引脚上去。
(9)总结
本次测试,自己遇到的问题点也都说了,尽可能详细,当然也不可能逻辑所有可能,这个灯带也写了好几篇了,细节也分布在那里,所以不了解的时候,建议看看我写的其它文章,同时也非常欢迎互相交流。
最后
以上就是积极中心最近收集整理的关于【软件STM32cubeIDE下STM32F4xx使用DMA+定时器+推PWM+点亮灯带WS2812相关-进阶(全数据流版)】(1)前言(2)环境(3)先行文章(4)实验过程(5)实验测试(6)实验代码(7)细节点(9)总结的全部内容,更多相关【软件STM32cubeIDE下STM32F4xx使用DMA+定时器+推PWM+点亮灯带WS2812相关-进阶(全数据流版)】(1)前言(2)环境(3)先行文章(4)实验过程(5)实验测试(6)实验代码(7)细节点(9)总结内容请搜索靠谱客的其他文章。
发表评论 取消回复