• C语言 Cortex-A7核 PWM实验


    1 实验目的

    驱动开发板蜂鸣器风扇、马达进行工作

    2 代码

    pwm.h

    1. #ifndef __PWM_H__
    2. #define __PWM_H__
    3. #include "stm32mp1xx_rcc.h"
    4. #include "stm32mp1xx_gpio.h"
    5. #include "stm32mp1xx_tim.h"
    6. //蜂鸣器:PB6 ---> TIM4_CH1
    7. void hal_beep_init();
    8. //风扇:PE9 ---> TIM1_CH1
    9. void hal_fan_init();
    10. //马达:PF6 ---> TIM16_CH1
    11. void hal_monitor_init();
    12. #endif

    pwm.c

    1. #include "pwm.h"
    2. //蜂鸣器:PB6 ---> TIM4_CH1
    3. void hal_beep_init()
    4. {
    5. //RCC章节初始化
    6. //1.使能GPIOB组控制器 MP_AHB4ENSETR[1] = 1
    7. RCC->MP_AHB4ENSETR |= (0x1 << 1);
    8. //2.使能TIM4组控制器 MP_APB1ENSETR[2] = 1
    9. RCC->MP_APB1ENSETR |= (0X1 << 2);
    10. //GPIO章节初始化
    11. //1.设置PB6引脚为复用功能 GPIOB->MODER[13:12] = 10
    12. GPIOB->MODER &= (~(0x3 << 12));
    13. GPIOB->MODER |= (0x1 << 13);
    14. //2.设置PB6引脚复用功能为TIM4_CH1功能 GPIOB->AFRL[27:24] = 0010
    15. GPIOB->AFRL &= (~(0xf << 24));
    16. GPIOB->AFRL |= (0x1 << 25);
    17. //TIM1章节
    18. //PWM方波频率为 : 1000HZ
    19. //思路: 1.准备值(分频器,自动重载计数器,比较捕获寄存器)
    20. //2.使能/输出
    21. TIM4->ARR = 1000; //设置自动重载计数器中的值
    22. TIM4->PSC = 209-1; //设置系统提供的时钟源进行分频
    23. TIM4->CCR1 = 300; //设置捕获/比较寄存器中的值
    24. //CR1寄存器初始化
    25. TIM4->CR1 |= (0x1 << 7); //设置自动重载计数器预加载使能 CR1[7] = 1
    26. TIM4->CR1 &= (~(0x3 << 5)); //设置计数器为边沿对齐模式 CR1[6:5] = 00
    27. TIM4->CR1 |= (0x1 << 4); //设置计数器为递减计数器方式 CR1[4] = 1
    28. TIM4->CR1 |= (0x1 << 0); //设置计数器使能 CR1[0] = 1
    29. //CCMR1寄存器初始化
    30. TIM4->CCMR1 &= (~(0x1 << 4)); //设置PWM模式选择 CCMR1[16][6:4] = 0110
    31. TIM4->CCMR1 &= (~(0x1 << 16));
    32. TIM4->CCMR1 |= (0x3 << 5);
    33. TIM4->CCMR1 |= (0x1 << 3); //设置输出比较预加载使能 CCMR1[3] = 1
    34. TIM4->CCMR1 &= (~(0x3 << 0)); //设置捕获/比较选择输出
    35. //CCER、CCR1寄存器初始化
    36. TIM4->CCER &= (~(0x5 << 1)); //设置捕获比较寄存器默认输出极性为高电平 CCER[3][1] = 00(高电平)/01(低电平)
    37. TIM4->CCER |= (0x1 << 0); //设置捕获/比较输出使能 CCER[0] = 1
    38. }
    39. //风扇:PE9 ---> TIM1_CH1
    40. void hal_fan_init()
    41. {
    42. //RCC章节初始化
    43. //1.使能GPIOE组控制器 MP_AHB4ENSETR[4] = 1
    44. RCC->MP_AHB4ENSETR |= (0x1 << 4);
    45. //2.使能TIM1组控制器 MP_AHB2ENSETR[0] = 1
    46. RCC->MP_APB2ENSETR |= (0X1 << 0);
    47. //GPIO章节初始化
    48. //1.设置PE9引脚为复用功能 [19:18] = 10
    49. GPIOE->MODER &= (~(0x3 << 18));
    50. GPIOE->MODER |= (0x1 << 19);
    51. //2.设置PE9引脚复用功能为TIM1_CH1功能 AF1 0001 GPIOE->AFRH[7:4] = 0001
    52. GPIOE->AFRH &= (~(0xf << 4));
    53. GPIOE->AFRH |= (0x1 << 4);
    54. //TIM1章节
    55. //PWM方波频率为 : 1000HZ
    56. //思路: 1.准备值(分频器,自动重载计数器,比较捕获寄存器)
    57. TIM1->ARR = 1000; //设置自动重载计数器中的值
    58. TIM1->PSC = 800; //设置系统提供的时钟源进行分频
    59. TIM1->CCR1 = 300; //设置捕获/比较寄存器中的值
    60. //CR1寄存器初始化
    61. TIM1->CR1 |= (0x1 << 7); //设置自动重载计数器预加载使能 CR1[7] = 1
    62. TIM1->CR1 &= (~(0x3 << 5)); //设置计数器为边沿对齐模式 CR1[6:5] = 00
    63. TIM1->CR1 |= (0x1 << 4); //设置计数器为递减计数器方式 CR1[4] = 1
    64. TIM1->CR1 |= (0x1 << 0); //设置计数器使能 CR1[0] = 1
    65. //CCMR1寄存器初始化
    66. TIM1->CCMR1 &= (~(0x1 << 4)); //设置PWM模式选择 CCMR1[16][6:4] = 0110
    67. TIM1->CCMR1 &= (~(0x1 << 16));
    68. TIM1->CCMR1 |= (0x3 << 5);
    69. TIM1->CCMR1 |= (0x1 << 3); //设置输出比较预加载使能 CCMR1[3] = 1
    70. TIM1->CCMR1 &= (~(0x3 << 0)); //设置捕获/比较选择输出
    71. //CCER、CCR1寄存器初始化
    72. TIM1->CCER &= (~(0x5 << 1)); //设置捕获比较寄存器默认输出极性为高电平 CCER[3][1] = 00(高电平)/01(低电平)
    73. TIM1->CCER |= (0x1 << 0); //设置捕获/比较输出使能 CCER[0] = 1
    74. TIM1->BDTR |= (0x1 << 15); //BDTR使能
    75. }
    76. //马达:PF6 ---> TIM16_CH1
    77. void hal_monitor_init()
    78. {
    79. //RCC章节初始化
    80. //1.使能GPIOF组控制器 MP_AHB2ENSETR[5] = 1
    81. RCC->MP_AHB4ENSETR |= (0x1 << 5);
    82. //2.使能TIM16组控制器 MP_APB2ENCLRR[3] = 1
    83. RCC->MP_APB2ENSETR |= (0X1 << 3);
    84. //GPIO章节初始化
    85. //1.设置PF6引脚为复用功能 GPIOF->MODER[13:12] = 10
    86. GPIOF->MODER &= (~(0x3 << 12));
    87. GPIOF->MODER |= (0x1 << 13);
    88. //2.设置PF6引脚复用功能为TIM16_CH1功能 AF1 0001 GPIOF->AFRL [27:24] = 0001
    89. GPIOF->AFRL &= (~(0xf << 24));
    90. GPIOF->AFRL |= (0x1 << 24);
    91. //TIM16章节
    92. //PWM方波频率为 : 1000HZ
    93. //思路: 1.准备值(分频器,自动重载计数器,比较捕获寄存器)
    94. TIM16->ARR = 1000; //设置自动重载计数器中的值
    95. TIM16->PSC = 209-1; //设置系统提供的时钟源进行分频
    96. TIM16->CCR1 = 300; //设置捕获/比较寄存器中的值
    97. //CR1寄存器初始化
    98. TIM16->CR1 |= (0x1 << 7); //设置自动重载计数器预加载使能 CR1[7] = 1
    99. TIM16->CR1 &= (~(0x3 << 5)); //设置计数器为边沿对齐模式 CR1[6:5] = 00
    100. TIM16->CR1 |= (0x1 << 4); //设置计数器为递减计数器方式 CR1[4] = 1
    101. TIM16->CR1 |= (0x1 << 0); //设置计数器使能 CR1[0] = 1
    102. //CCMR1寄存器初始化
    103. TIM16->CCMR1 &= (~(0x1 << 4)); //设置PWM模式选择 CCMR1[16][6:4] = 0110
    104. TIM16->CCMR1 &= (~(0x1 << 16));
    105. TIM16->CCMR1 |= (0x3 << 5);
    106. TIM16->CCMR1 |= (0x1 << 3); //设置输出比较预加载使能 CCMR1[3] = 1
    107. TIM16->CCMR1 &= (~(0x3 << 0)); //设置捕获/比较选择输出
    108. //CCER、CCR1寄存器初始化
    109. TIM16->CCER &= (~(0x5 << 1)); //设置捕获比较寄存器默认输出极性为高电平 CCER[3][1] = 00(高电平)/01(低电平)
    110. TIM16->CCER |= (0x1 << 0); //设置捕获/比较输出使能 CCER[0] = 1
    111. TIM16->BDTR |= (0x1 << 15); //BDTR使能
    112. }

    main.c

    1. #include "pwm.h"
    2. extern void printf(const char *fmt, ...);
    3. void delay_ms(int ms)
    4. {
    5. int i,j;
    6. for(i = 0; i < ms;i++)
    7. for (j = 0; j < 1800; j++);
    8. }
    9. int main()
    10. {
    11. hal_beep_init(); //蜂鸣器初始化
    12. hal_fan_init();//风扇初始化
    13. hal_monitor_init();//马达初始化
    14. while(1)
    15. {
    16. }
    17. return 0;
    18. }

    3 实验效果

  • 相关阅读:
    CentOS7+Linux version 3.10.0-693.2.2.el7.x86_64 上安装docker
    vue2中的props属性
    贪心算法----几个基本例题
    C语言的break、continue、switch、goto语句
    Node.js | 你不知道的 express 路由使用技巧
    【React】面试题5题
    Pycharm 自定义文件和代码模板
    SpringCloud Alibaba微服务实战五 - 配置隔离
    Qt moc: Too many input files specified
    ScanNet数据集转rosbag的脚本
  • 原文地址:https://blog.csdn.net/Smallxu_/article/details/133465962