• ARM蜂鸣器,风扇,马达


    1. #include "pwm.h"
    2. //蜂鸣器
    3. void hal_pwm_init(void)
    4. {
    5. //设置gpiob使能
    6. RCC->MP_AHB4ENSETR = (0x1 << 1);
    7. //设置TIM4使能
    8. RCC->MP_APB1ENSETR = (0x1 << 2);
    9. //设置pb6引脚为复用功能
    10. GPIOB->MODER &= (~(0x3<<12));
    11. GPIOB->MODER |= (0x2 << 12);
    12. //设置pb6引脚为TIM4_CH1功能
    13. GPIOB->AFRL &= (~(0xf << 24));
    14. GPIOB->AFRL |= (0x2 << 24);
    15. //设置预分频寄存器
    16. TIM4->PSC = 209 - 1;
    17. //设置PWM方波的最终的周期
    18. TIM4->ARR = 1000;
    19. //设置PWM方波的占空比
    20. TIM4->CCR1 = 700;
    21. //设置TIM4_CH1通道为PWM1模式
    22. TIM4->CCMR1 &= ~((0x1 << 16) | (0x7 << 4));
    23. TIM4->CCMR1 |= (0x6 << 4);
    24. //设置TIM4_CH1通道使能TIMx_CCR1预加载使能寄存器
    25. TIM4->CCMR1 |= (0x1 << 3);
    26. //设置TIM4_CH1通道输出PWM方波的极性,
    27. TIM4->CCER &= ~(0x1 << 1);
    28. //设置TIM4_CH1通道的输出使能位,输出PWM方波
    29. TIM4->CCER |= (0x1 << 0);
    30. //设置TIM4_CH1通道的TIMx_ARR预装载寄存器的缓冲区的使能
    31. TIM4->CR1 |= (0x1 << 7);
    32. //设置定时器的计数方式,边沿对齐
    33. TIM4->CR1 &= ~(0x3 << 5);
    34. //设置定时器计数的方向,采用递减计数/递增计数
    35. TIM4->CR1 &= ~(0x1 << 4);
    36. // 使能TIM4_CH1计数器
    37. TIM4->CR1 |= (0x1 << 0);
    38. }
    39. //风扇PE9
    40. void hal_fan_init(void)
    41. {
    42. //设置gpiob使能
    43. RCC->MP_AHB4ENSETR = (0x1 << 4);
    44. //设置TIM1使能
    45. RCC->MP_APB2ENSETR = (0x1 << 0);
    46. //设置PE9引脚为复用功能
    47. GPIOE->MODER &= (~(0x3<<18));
    48. GPIOE->MODER |= (0x2 << 18);
    49. //设置pe9引脚为TIM4_CH1功能
    50. GPIOE->AFRH &= (~(0xf << 4));
    51. GPIOE->AFRH |= (0x1 << 4);
    52. //设置预分频寄存器
    53. TIM1->PSC = 209 - 1;
    54. //设置PWM方波的最终的周期
    55. TIM1->ARR = 1000;
    56. //设置PWM方波的占空比
    57. TIM1->CCR1 = 700;
    58. //设置TIM1_CH1通道为PWM1模式
    59. TIM1->CCMR1 &= ~((0x1 << 16) | (0x7 << 4));
    60. TIM1->CCMR1 |= (0x6 << 4);
    61. //设置TIM1_CH1通道使能TIMx_CCR1预加载使能寄存器
    62. TIM1->CCMR1 |= (0x1 << 3);
    63. //设置TIM1_CH1通道输出PWM方波的极性,
    64. TIM1->CCER &= ~(0x1 << 1);
    65. //设置TIM1_CH1通道的输出使能位,输出PWM方波
    66. TIM1->CCER |= (0x1 << 0);
    67. //设置TIM1_CH1通道的TIMx_ARR预装载寄存器的缓冲区的使能
    68. TIM1->CR1 |= (0x1 << 7);
    69. //设置定时器的计数方式,边沿对齐
    70. TIM1->CR1 &= ~(0x3 << 5);
    71. //设置定时器计数的方向,采用递减计数/递增计数
    72. TIM1->CR1 &= ~(0x1 << 4);
    73. // 使能TIM1_CH1计数器
    74. TIM1->CR1 |= (0x1 << 0);
    75. //风扇寄存器
    76. TIM1->BDTR |= (0x1 << 15);
    77. }
    78. //马达
    79. void hal_monitor_init(void)
    80. {
    81. //设置gpiob使能
    82. RCC->MP_AHB4ENSETR = (0x1 << 5);
    83. //设置TIM4使能
    84. RCC->MP_APB2ENSETR = (0x1 << 3);
    85. //设置pf6引脚为复用功能
    86. GPIOF->MODER &= (~(0x3<<12));
    87. GPIOF->MODER |= (0x2 << 12);
    88. //设置pf6引脚为TIM4_CH1功能
    89. GPIOF->AFRL &= (~(0xf << 24));
    90. GPIOF->AFRL |= (0x1 << 24);
    91. //设置预分频寄存器
    92. TIM16->PSC = 209 - 1;
    93. //设置PWM方波的最终的周期
    94. TIM16->ARR = 1000;
    95. //设置PWM方波的占空比
    96. TIM16->CCR1 = 700;
    97. //设置TIM16_CH1通道为PWM1模式
    98. TIM16->CCMR1 &= ~((0x1 << 16) | (0x7 << 4));
    99. TIM16->CCMR1 |= (0x6 << 4);
    100. //设置TIM16_CH1通道使能TIMx_CCR1预加载使能寄存器
    101. TIM16->CCMR1 |= (0x1 << 3);
    102. //设置TIM16_CH1通道输出PWM方波的极性,
    103. TIM16->CCER &= ~(0x1 << 1);
    104. //设置TIM16_CH1通道的输出使能位,输出PWM方波
    105. TIM16->CCER |= (0x1 << 0);
    106. //设置TIM16_CH1通道的TIMx_ARR预装载寄存器的缓冲区的使能
    107. TIM16->CR1 |= (0x1 << 7);
    108. //设置定时器的计数方式,边沿对齐
    109. TIM16->CR1 &= ~(0x3 << 5);
    110. //设置定时器计数的方向,采用递减计数/递增计数
    111. TIM16->CR1 &= ~(0x1 << 4);
    112. // 使能TIM16_CH1计数器
    113. TIM16->CR1 |= (0x1 << 0);
    114. //马达寄存器
    115. TIM16->BDTR |= (0x1 << 15);
    116. }

  • 相关阅读:
    重磅消息:23年浙大MEM提前批面试政策正式出炉:金融工程方向停招
    笔记 | 非素数个数(朴素筛查 || 埃式筛查法)
    责任链模式
    [Leetcode]13. 罗马数字转整数
    数据治理-度量指标
    【蓝桥杯单片机】二、独立按键和矩阵按键
    关于Win10安装keil并且电脑连接jlink踩过的坑
    【WINDOWS / DOS 批处理】call命令的变量延迟展开特性
    华为云云耀云服务器L实例评测 | 实例使用教学之简单使用:通过命令行管理华为云云耀云服务器
    技术管理进阶——什么是管理者之体力、脑力、心力
  • 原文地址:https://blog.csdn.net/Pointerup/article/details/128193399