当前位置:   article > 正文

STM32H750/STM32F103驱动WS2812案例(HAL库,STM32CubeMX)_stm32f030 ws2812

stm32f030 ws2812

依据数据手册找到需要的参数

ws2812的需要参数

        

0码 |--|---|   高电平时间范围220ns~420ns|低电平时间范围750ns~1600ns
    320 960     
1码 |---|--|
    960 320 

帧数据时间范围800ns~1400ns

当前单片机的需要参数

单片机的主频

举例两个单片机的先是H750的480M

480M的主频320ns的延时大概需要96个空操作

72M        则需要16个空操作(理论值)

        单片机一个指令所需的机器时钟是不一样的,在ns级别循环和函数调用对此时间都是略有差异的。

废话不多说,直接看代码(H750)

先初始化端口和一些方便使用的宏定义

我这里用的是PC5

  1. #define rgb_led_low  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET)
  2. #define rgb_led_high  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET)
  3. #define LED_COUNT 60 // 假设有60个LED灯  
  4. #define ANIMATION_STEPS 10 // 动画步骤数  
  5. #define DELAY_TIME 50 // 每步动画之间的延时,单位毫秒  
  6. void ws2812_init(void){
  7.   GPIO_InitTypeDef gpio_init_struct = {0};
  8.   __HAL_RCC_GPIOC_CLK_ENABLE();
  9.   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET);
  10.   /* 配置控制引脚 */
  11.     gpio_init_struct.Pin = GPIO_PIN_5;
  12.     gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;//推挽输出
  13.     gpio_init_struct.Pull = GPIO_PULLDOWN;
  14.     gpio_init_struct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;//高速
  15.     HAL_GPIO_Init(GPIOC, &gpio_init_struct);
  16.   
  17. }

编写延时函数

  1. void delay_320nm(void){  
  2.   //volatile关键字告诉编译器不要优化对i的访问
  3.   __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); //10
  4.   __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();//20
  5.   __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();//30
  6.   __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
  7.   __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
  8.   __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
  9.   __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();//70
  10.   __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
  11. }

帧单位延时函数

  1. //帧单位大于300这里给350
  2. void out_led_reset(void){
  3.   rgb_led_low;
  4.   delay_us(350);
  5. }

HAL库不自带nm延时可使用:

HAL_Delay(1);

发送1码函数

  1. void out_led_1(void){
  2.         rgb_led_high;
  3.   delay_320nm();
  4.   delay_320nm();
  5.   delay_320nm();
  6.         rgb_led_low;
  7.     delay_320nm();
  8. }

发送0码函数

  1. void out_led_0(void){
  2.     rgb_led_high;
  3.   delay_320nm();
  4.     rgb_led_low;
  5.   delay_320nm();
  6.   delay_320nm();
  7.   delay_320nm();
  8. }

发送数据位函数

  1. /*
  2. 给单个LED发送RGB数据
  3. */
  4. void rgb_led_data(uint8_t red,uint8_t green,uint8_t blue){
  5.     uint8_t i;
  6.     for(i=0;i<8;i++)
  7.     {
  8.         green<<=i;
  9.         if(green&0x80)
  10.              out_led_1();
  11.         else
  12.             out_led_0();
  13.     }
  14.     for(i=0;i<8;i++)
  15.     {
  16.         red<<=i;
  17.         if(red&0x80)
  18.              out_led_1();
  19.         else
  20.             out_led_0();
  21.     }
  22.     for(i=0;i<8;i++)
  23.     {
  24.         blue<<=i;
  25.         if(blue&0x80)
  26.              out_led_1();
  27.         else
  28.             out_led_0();
  29.     }
  30.   out_led_reset();
  31. }

在此就可以调用进行亮灯动画了

示例:

  1. //波浪效果
  2. void motion1(void){
  3.   uint16_t i, j;  
  4.   for (i = 0; i < LED_COUNT * 5; i++) { // 波浪来回5次  
  5.       for (j = 0; j < LED_COUNT; j++) {  
  6.           if (j < i % LED_COUNT) {  
  7.               rgb_led_data(colors[1][0], colors[1][1], colors[1][2]); // 蓝色波浪  
  8.           } else if (j > LED_COUNT - 1 - (i % LED_COUNT)) {  
  9.               rgb_led_data(colors[2][0], colors[2][1], colors[2][2]); // 绿色波浪  
  10.           } else {  
  11.               rgb_led_data(0, 0, 0); // 黑色背景  
  12.           }  
  13.       }  
  14.       delay_ms(DELAY_TIME); // 延迟以展示波浪效果  
  15.   }
  16. }

主函数

  1. int main(void){
  2.         while(1){
  3.                 motion1();
  4.         }
  5. }

完整代码

WS2812B.c

  1. #include "WS2812B.h"
  2. //#define rgb_led_low HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET)
  3. //#define rgb_led_high HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET)
  4. #define rgb_led_low HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET)
  5. #define rgb_led_high HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET)
  6. #define LED_spend 30
  7. static uint8_t colors[][3] = {
  8. {255, 0, 0}, // 红色
  9. {255, 0, 255}, // 品红
  10. {255, 165, 0}, // 橙色
  11. {255, 255, 0}, // 黄色
  12. {0, 255, 0}, // 绿色
  13. {0, 0, 255}, // 蓝色
  14. {75, 0, 130}, // 靛色
  15. {128, 0, 128}, // 紫色
  16. {255, 192, 203}, // 粉色
  17. {0, 255, 255}, // 青色
  18. {255, 255, 255}, // 白色
  19. {0, 0, 0} // 黑色
  20. };
  21. void ws2812_init(void){
  22. GPIO_InitTypeDef gpio_init_struct = {0};
  23. __HAL_RCC_GPIOC_CLK_ENABLE();
  24. HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET);
  25. /* 配置控制引脚 */
  26. gpio_init_struct.Pin = GPIO_PIN_5;
  27. gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;
  28. gpio_init_struct.Pull = GPIO_PULLDOWN;
  29. gpio_init_struct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  30. HAL_GPIO_Init(GPIOC, &gpio_init_struct);
  31. }
  32. void delay_320nm(void){
  33. //volatile关键字告诉编译器不要优化对i的访问
  34. __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); //10
  35. __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();//20
  36. __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();//30
  37. __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
  38. __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
  39. __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
  40. __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();//70
  41. __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
  42. }
  43. /*
  44. 0码 |--|---| 高电平时间范围220ns~420ns|低电平时间范围750ns~1600ns|帧数据时间范围800ns~1400ns
  45. 320 960
  46. 1码 |---|--|
  47. 960 320
  48. */
  49. void out_led_1(void){
  50. rgb_led_high;
  51. delay_320nm();
  52. delay_320nm();
  53. delay_320nm();
  54. rgb_led_low;
  55. delay_320nm();
  56. }
  57. void out_led_0(void){
  58. rgb_led_high;
  59. delay_320nm();
  60. rgb_led_low;
  61. delay_320nm();
  62. delay_320nm();
  63. delay_320nm();
  64. }
  65. //帧单位大于300这里给350
  66. void out_led_reset(void){
  67. rgb_led_low;
  68. delay_us(350);
  69. }
  70. /*
  71. 给单个LED发送RGB数据
  72. */
  73. void rgb_led_data(uint8_t red,uint8_t green,uint8_t blue){
  74. uint8_t i;
  75. for(i=0;i<8;i++)
  76. {
  77. green<<=i;
  78. if(green&0x80)
  79. out_led_1();
  80. else
  81. out_led_0();
  82. }
  83. for(i=0;i<8;i++)
  84. {
  85. red<<=i;
  86. if(red&0x80)
  87. out_led_1();
  88. else
  89. out_led_0();
  90. }
  91. for(i=0;i<8;i++)
  92. {
  93. blue<<=i;
  94. if(blue&0x80)
  95. out_led_1();
  96. else
  97. out_led_0();
  98. }
  99. out_led_reset();
  100. }
  101. void cartoon1(void){
  102. uint16_t is,id;
  103. uint16_t arr = 60; //600
  104. for(is=0;is<arr;is++)
  105. {
  106. for(id=arr;id-is>0;id--){
  107. rgb_led_data(0,0,0);
  108. }
  109. for(id=0;id<is;id++){
  110. rgb_led_data(255,255,100); //10,7,200
  111. }
  112. HAL_Delay(50);
  113. }
  114. }
  115. void cartoon2(void){
  116. uint8_t is,id;
  117. for(is=0;is<30;is++)
  118. {
  119. // rgb_led_data(10,5,10);
  120. // HAL_Delay(1000);
  121. for(id=30;id-is>0;id--){
  122. rgb_led_data(255,255,10);
  123. }
  124. for(id=0;id<is;id++){
  125. rgb_led_data(10,100,10);
  126. }
  127. HAL_Delay(LED_spend);
  128. }
  129. }
  130. void cartoon3(void){
  131. //uint8_t is,id,ir,ig; //,ib
  132. uint16_t ir,id,ic=0,is=600,sc;
  133. //uint8_t rs=0,gs=0,bs=0;
  134. for(id=0;id<12;id++){
  135. ic+=50;
  136. sc=id%2;
  137. for(ir=0;ir<ic;ir++){
  138. rgb_led_data(colors[sc][0], colors[sc][1], colors[sc][2]);
  139. }
  140. if(ic==600){
  141. ic=0;
  142. }
  143. for(ir=0;ir<is-ic;ir++){
  144. rgb_led_data(0, 0, 0);
  145. }
  146. HAL_Delay(LED_spend+1000);
  147. }
  148. }
  149. void cartoon4(void){
  150. //int num_colors = sizeof(colors) / sizeof(colors[0]);
  151. HAL_Delay(LED_spend); // 调整延迟时间以控制彩虹流动速度
  152. for (uint16_t i = 0; i < 7 * 5; i++) {
  153. for (uint16_t j = 0; j < 60; j++) {
  154. uint8_t color_index = (i + j) % 7;
  155. rgb_led_data(colors[color_index][0], colors[color_index][1], colors[color_index][2]);
  156. }
  157. HAL_Delay(LED_spend+50);
  158. }
  159. }
  160. /*
  161. iz=层数
  162. */
  163. void cartoon5(void){
  164. uint16_t id; //is=600
  165. for(id=0;id<12;id++){
  166. for (uint16_t j = 0; j < id*50; j++) {
  167. rgb_led_data(0, 0, 0);
  168. }
  169. for (uint16_t j = id*50; j < id*50+50; j++) {
  170. rgb_led_data(241,241,102); //0, 0, 200
  171. }
  172. HAL_Delay(1000);
  173. }
  174. for (uint16_t j = 0; j < 600; j++) {
  175. rgb_led_data(0, 0, 0);
  176. }
  177. HAL_Delay(1000);
  178. }
  179. void cartoon6(void){
  180. //uint8_t is,id,ir,ig; //,ib
  181. uint16_t ir,id,ic=0,is=600;
  182. //uint8_t rs=0,gs=0,bs=0;
  183. for(id=0;id<12;id++){
  184. ic+=50;
  185. for(ir=0;ir<ic;ir++){
  186. rgb_led_data(colors[4][0], colors[4][1], colors[4][2]);
  187. }
  188. if(ic==600){
  189. ic=0;
  190. break;
  191. }
  192. for(ir=0;ir<is-ic;ir++){
  193. rgb_led_data(0, 0, 0);
  194. }
  195. HAL_Delay(LED_spend+1000);
  196. }
  197. for (uint16_t j = 0; j < 600; j++) {
  198. rgb_led_data(0, 0, 0);
  199. }
  200. HAL_Delay(1000);
  201. }
  202. void cartoon7(void){
  203. uint16_t i, j;
  204. for (i = 0; i < LED_COUNT * 2; i++) { // 波浪来回两次
  205. for (j = 0; j < LED_COUNT; j++) {
  206. if (j < i % LED_COUNT) {
  207. rgb_led_data(colors[1][0], colors[1][1], colors[1][2]); // 蓝色波浪
  208. } else if (j > LED_COUNT - 1 - (i % LED_COUNT)) {
  209. rgb_led_data(colors[2][0], colors[2][1], colors[2][2]); // 绿色波浪
  210. } else {
  211. rgb_led_data(0, 0, 0); // 黑色背景
  212. }
  213. }
  214. delay_ms(DELAY_TIME); // 延迟以展示波浪效果
  215. }
  216. }
  217. void cartoon8(void){
  218. uint16_t i,j;
  219. for(i=3;i<LED_COUNT+3;i++){
  220. for(j=0;j<i-3;j++){
  221. rgb_led_data(0,0,0);
  222. }
  223. for(j=0;j<i;j++){
  224. rgb_led_data(colors[5][0],colors[5][1],colors[5][2]);
  225. }
  226. delay_ms(DELAY_TIME);
  227. }
  228. }
  229. void led_off(void){
  230. uint16_t i;
  231. for(i=0;i<600;i++){
  232. rgb_led_data(0, 0, 0);
  233. }
  234. }
  235. //波浪效果
  236. void motion1(void){
  237. uint16_t i, j;
  238. for (i = 0; i < LED_COUNT * 5; i++) { // 波浪来回5次
  239. for (j = 0; j < LED_COUNT; j++) {
  240. if (j < i % LED_COUNT) {
  241. rgb_led_data(colors[1][0], colors[1][1], colors[1][2]); // 蓝色波浪
  242. } else if (j > LED_COUNT - 1 - (i % LED_COUNT)) {
  243. rgb_led_data(colors[2][0], colors[2][1], colors[2][2]); // 绿色波浪
  244. } else {
  245. rgb_led_data(0, 0, 0); // 黑色背景
  246. }
  247. }
  248. delay_ms(DELAY_TIME); // 延迟以展示波浪效果
  249. }
  250. }
  251. //呼吸灯效果
  252. void motion2(void){
  253. uint8_t brightness = 0;
  254. uint8_t direction = 1; // 1表示亮度增加,-1表示亮度减少
  255. uint16_t i,j=LED_COUNT;
  256. while (j--) { // 无限循环
  257. for (i = 0; i < LED_COUNT; i++) {
  258. rgb_led_data(brightness, brightness, brightness); // 设置所有LED为相同的亮度
  259. }
  260. brightness += direction; // 改变亮度
  261. if (brightness == 0 || brightness == 255) { // 到达最大或最小亮度时改变方向
  262. direction *= -1;
  263. }
  264. delay_ms(50); // 较快地更新亮度以创建呼吸效果
  265. }
  266. }
  267. //彩虹效果
  268. void motion3(void){
  269. uint16_t position = 0;
  270. uint16_t i,j=LED_COUNT;
  271. while (j--) {
  272. for (i = 0; i < LED_COUNT; i++) {
  273. uint8_t color_index = (position + i) % 9; // 循环使用6种颜色
  274. rgb_led_data(colors[color_index][0], colors[color_index][1], colors[color_index][2]);
  275. }
  276. position++; // 移动彩虹位置
  277. delay_ms(DELAY_TIME); // 延迟以展示彩虹效果
  278. }
  279. }
  280. //随机闪烁效果
  281. void motion4(void){
  282. // 初始化随机数生成器
  283. // srand((unsigned int)time(NULL));
  284. //
  285. // while (1) { // 无限循环
  286. // for (uint16_t i = 0; i < LED_COUNT; i++) {
  287. // if (rand() % 2) { // 50%的概率打开LED
  288. // rgb_led_data(colors[rand() % 6][0], colors[rand() % 6][1], colors[rand() % 6][2]);
  289. // } else {
  290. // rgb_led_data(0, 0, 0); // 关闭LED
  291. // }
  292. // }
  293. // delay_ms(DELAY_TIME); // 延迟以展示随机闪烁效果
  294. // }
  295. }
  296. //
  297. void motion5(void){
  298. uint16_t position = 0;
  299. uint16_t i,j=LED_COUNT;
  300. while (j--) { // 无限循环
  301. for (i = 0; i < LED_COUNT; i++) {
  302. uint8_t color_index = (position + i) % 6; // 循环使用6种颜色
  303. rgb_led_data(colors[color_index][0], colors[color_index][1], colors[color_index][2]);
  304. }
  305. position++; // 移动彩虹位置
  306. //delay_ms(DELAY_TIME + 100); // 延迟以展示彩虹效果 熄灭延时
  307. // 闪烁效果:将所有LED设置为黑色,然后稍微延迟后再次显示彩虹
  308. for (uint16_t i = 0; i < LED_COUNT; i++) {
  309. rgb_led_data(0, 0, 0); // 关闭所有LED
  310. }
  311. delay_ms(DELAY_TIME +300); // 短暂延迟,创造闪烁效果
  312. }
  313. }
  314. //
  315. void motion6(void){
  316. uint16_t i,j=LED_COUNT;
  317. while (j--) { // 无限循环
  318. j--;
  319. for (i = 0; i < LED_COUNT; i++) {
  320. // 计算颜色渐变
  321. uint8_t red = (i * 255) / LED_COUNT;
  322. uint8_t green = ((LED_COUNT - i) * 255) / LED_COUNT;
  323. uint8_t blue = 0; // 可以添加蓝色渐变或其他颜色组合
  324. rgb_led_data(red, green, blue);
  325. }
  326. delay_ms(DELAY_TIME); // 延迟以展示渐变彩虹效果
  327. // 可以添加其他逻辑,比如改变渐变的方向或速度
  328. }
  329. }
  330. //
  331. void motion7(void){
  332. #define CHASE_GROUP_SIZE 5 // 追逐组的大小
  333. uint16_t chase_position = 0; // 追逐组的起始位置
  334. uint16_t j=LED_COUNT,i;
  335. while (j--) { // 无限循环
  336. // 初始化所有LED为黑色
  337. for (i = 0; i < LED_COUNT; i++) {
  338. rgb_led_data(0, 0, 0);
  339. }
  340. // 设置追逐组的LED为白色或其他亮色
  341. for (i = 0; i < CHASE_GROUP_SIZE; i++) {
  342. if (chase_position + i < LED_COUNT) {
  343. rgb_led_data(255, 255, 255); // 假设rgb_led_data接受索引作为最后一个参数
  344. }
  345. }
  346. // 移动追逐组的位置
  347. chase_position = (chase_position + 1) % LED_COUNT;
  348. delay_ms(DELAY_TIME); // 延迟以展示追逐效果
  349. }
  350. }
  351. //
  352. void motion8(uint16_t i){
  353. // 计算每个颜色段的大小
  354. uint16_t color_segment_size = LED_COUNT / 9;
  355. for (uint16_t j = 0; j < LED_COUNT; j++) {
  356. // 计算当前LED属于哪个颜色段
  357. uint16_t color_index = j / color_segment_size;
  358. // 如果LED在颜色段的边界上,确保它使用正确的颜色
  359. if (j % color_segment_size == 0) {
  360. color_index = (color_index + i) % 9; // 根据波浪位置滚动颜色
  361. }
  362. // 设置LED的颜色
  363. rgb_led_data(colors[color_index][0], colors[color_index][1], colors[color_index][2]);
  364. }
  365. }
  366. //
  367. void motion9(void){
  368. uint16_t i = 0;
  369. // 增加i的值以移动波浪 // 保证i在0到8之间循环
  370. for(i=0;i<9;i++){
  371. motion8(i); // 不断更新i来创建动画效果
  372. delay_ms(DELAY_TIME+500); // 延时一段时间,控制动画速度
  373. }
  374. }

WS2812B.h

  1. /*******************************************************************************
  2. * @file HDL_WS2812B.h
  3. * @author huiyang
  4. * @version V1.0
  5. * @date 01/21/2022
  6. ******************************************************************************/
  7. #ifndef __WS2812B_H
  8. #define __WS2812B_H
  9. //#include "gpio.h"
  10. #include "sys.h"
  11. #include "delay.h"
  12. #include <stdlib.h> // 为了使用rand()和srand()
  13. /* 根据DataSheet定义0/1编码对应的高电平比较值,因为高电平在前,定义高电平的即可
  14. ** 高低电平的比例约为2:1
  15. */
  16. /* 灯珠亮的个数 */
  17. #define LED_COUNT 60 // 假设有60个LED灯
  18. #define ANIMATION_STEPS 10 // 动画步骤数
  19. #define DELAY_TIME 50 // 每步动画之间的延时,单位毫秒
  20. void ws2812_init(void);
  21. void delay_320nm(void);
  22. void out_led_0(void);
  23. void out_led_1(void);
  24. void out_led_reset(void);
  25. void rgb_led_data(uint8_t red,uint8_t gree,uint8_t blue);
  26. void cartoon1(void);
  27. void cartoon2(void);
  28. void cartoon3(void);
  29. void cartoon4(void);
  30. void cartoon5(void);
  31. void cartoon6(void);
  32. void cartoon7(void);
  33. void cartoon8(void);
  34. void led_off(void);
  35. void motion1(void);
  36. void motion2(void);
  37. void motion3(void);
  38. void motion4(void);
  39. void motion5(void);
  40. void motion6(void);
  41. void motion7(void);
  42. void motion8(uint16_t i);
  43. void motion9(void);
  44. extern uint16_t spend;
  45. #endif

main.c

  1. /* USER CODE END Header */
  2. /* Includes ------------------------------------------------------------------*/
  3. #include "main.h"
  4. #include "gpio.h"
  5. #include "sys.h"
  6. #include "delay.h"
  7. #include "WS2812B.h"
  8. /* Private includes ----------------------------------------------------------*/
  9. /* USER CODE BEGIN Includes */
  10. /* USER CODE END Includes */
  11. /* Private typedef -----------------------------------------------------------*/
  12. /* USER CODE BEGIN PTD */
  13. /* USER CODE END PTD */
  14. /* Private define ------------------------------------------------------------*/
  15. /* USER CODE BEGIN PD */
  16. /* USER CODE END PD */
  17. /* Private macro -------------------------------------------------------------*/
  18. /* USER CODE BEGIN PM */
  19. /* USER CODE END PM */
  20. /* Private variables ---------------------------------------------------------*/
  21. /* USER CODE BEGIN PV */
  22. /* USER CODE END PV */
  23. /* Private function prototypes -----------------------------------------------*/
  24. void SystemClock_Config(void);
  25. static void MPU_Config(void);
  26. /* USER CODE BEGIN PFP */
  27. /* USER CODE END PFP */
  28. /* Private user code ---------------------------------------------------------*/
  29. /* USER CODE BEGIN 0 */
  30. /* USER CODE END 0 */
  31. /**
  32. * @brief The application entry point.
  33. * @retval int
  34. */
  35. int main(void)
  36. {
  37. /* USER CODE BEGIN 1 */
  38. /* USER CODE END 1 */
  39. /* MPU Configuration--------------------------------------------------------*/
  40. MPU_Config();
  41. /* MCU Configuration--------------------------------------------------------*/
  42. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  43. HAL_Init();
  44. /* USER CODE BEGIN Init */
  45. /* USER CODE END Init */
  46. /* Configure the system clock */
  47. SystemClock_Config();
  48. /* USER CODE BEGIN SysInit */
  49. /* USER CODE END SysInit */
  50. /* Initialize all configured peripherals */
  51. MX_GPIO_Init();
  52. /* USER CODE BEGIN 2 */
  53. delay_init(480);
  54. ws2812_init();
  55. /* USER CODE END 2 */
  56. /* Infinite loop */
  57. /* USER CODE BEGIN WHILE */
  58. while (1)
  59. {
  60. motion6();
  61. motion5();
  62. motion4();
  63. motion3();
  64. motion2();
  65. motion1();
  66. }
  67. /* USER CODE END 3 */
  68. }
  69. /**
  70. * @brief System Clock Configuration
  71. * @retval None
  72. */
  73. void SystemClock_Config(void)
  74. {
  75. RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  76. RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  77. /** Supply configuration update enable
  78. */
  79. HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
  80. /** Configure the main internal regulator output voltage
  81. */
  82. __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  83. while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
  84. __HAL_RCC_SYSCFG_CLK_ENABLE();
  85. __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);
  86. while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
  87. /** Initializes the RCC Oscillators according to the specified parameters
  88. * in the RCC_OscInitTypeDef structure.
  89. */
  90. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  91. RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  92. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  93. RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  94. RCC_OscInitStruct.PLL.PLLM = 5;
  95. RCC_OscInitStruct.PLL.PLLN = 192;
  96. RCC_OscInitStruct.PLL.PLLP = 2;
  97. RCC_OscInitStruct.PLL.PLLQ = 2;
  98. RCC_OscInitStruct.PLL.PLLR = 2;
  99. RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
  100. RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
  101. RCC_OscInitStruct.PLL.PLLFRACN = 0;
  102. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  103. {
  104. Error_Handler();
  105. }
  106. /** Initializes the CPU, AHB and APB buses clocks
  107. */
  108. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  109. |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
  110. |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
  111. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  112. RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
  113. RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
  114. RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
  115. RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
  116. RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
  117. RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
  118. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
  119. {
  120. Error_Handler();
  121. }
  122. }
  123. /* USER CODE BEGIN 4 */
  124. /* USER CODE END 4 */
  125. /* MPU Configuration */
  126. void MPU_Config(void)
  127. {
  128. MPU_Region_InitTypeDef MPU_InitStruct = {0};
  129. /* Disables the MPU */
  130. HAL_MPU_Disable();
  131. /** Initializes and configures the Region and the memory to be protected
  132. */
  133. MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  134. MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  135. MPU_InitStruct.BaseAddress = 0x0;
  136. MPU_InitStruct.Size = MPU_REGION_SIZE_4GB;
  137. MPU_InitStruct.SubRegionDisable = 0x87;
  138. MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  139. MPU_InitStruct.AccessPermission = MPU_REGION_NO_ACCESS;
  140. MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
  141. MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
  142. MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  143. MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
  144. HAL_MPU_ConfigRegion(&MPU_InitStruct);
  145. /* Enables the MPU */
  146. HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
  147. }
  148. /**
  149. * @brief This function is executed in case of error occurrence.
  150. * @retval None
  151. */
  152. void Error_Handler(void)
  153. {
  154. /* USER CODE BEGIN Error_Handler_Debug */
  155. /* User can add his own implementation to report the HAL error return state */
  156. __disable_irq();
  157. while (1)
  158. {
  159. }
  160. /* USER CODE END Error_Handler_Debug */
  161. }
  162. #ifdef USE_FULL_ASSERT
  163. /**
  164. * @brief Reports the name of the source file and the source line number
  165. * where the assert_param error has occurred.
  166. * @param file: pointer to the source file name
  167. * @param line: assert_param error line source number
  168. * @retval None
  169. */
  170. void assert_failed(uint8_t *file, uint32_t line)
  171. {
  172. /* USER CODE BEGIN 6 */
  173. /* User can add his own implementation to report the file name and line number,
  174. ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  175. /* USER CODE END 6 */
  176. }
  177. #endif /* USE_FULL_ASSERT */

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/643436
推荐阅读
相关标签
  

闽ICP备14008679号