• 22081-12-5 cortex-A7核PWM实验


    1. //头文件
    2. #ifndef __PWM_H__
    3. #define __PWM_H__
    4. #include"stm32mp1xx_rcc.h"
    5. #include"stm32mp1xx_gpio.h"
    6. #include"stm32mp1xx_tim.h"
    7. /***********蜂鸣器初始化************/
    8. void sp_pwm(void);
    9. /***********风扇初始化*************/
    10. void fan_pwm(void);
    11. /***********马达初始化*************/
    12. void motor_pwm(void);
    13. #endif
    1. //功能函数
    2. #include"pwm.h"
    3. /***********蜂鸣器PB6初始化************/
    4. void sp_pwm()
    5. {
    6. /*---------RCC章节-----------*/
    7. //GPIOB使能
    8. RCC->MP_AHB4ENSETR |= (0x1 << 1);
    9. //TIM4使能
    10. RCC->MP_APB1ENSETR |= (0x1 << 2);
    11. /*----------GPIO章节----------*/
    12. //设置PB6引脚为复用功能
    13. GPIOB->MODER &= (~(0x3 << 12));
    14. GPIOB->MODER |= (0x2 << 12);
    15. //设置PB6复用功能为TIM4_CH1
    16. GPIOB->AFRL &= (~(0xf << 24));
    17. GPIOB->AFRL |= (0x2 << 24);
    18. /*----------TIM4章节----------*/
    19. //设置分频
    20. TIM4->PSC = 209;
    21. //设置自动重载计数器值
    22. TIM4->ARR = 1000;
    23. //设置捕获计数器的值
    24. TIM4->CCR1 = 700;
    25. //CR1寄存器初始化控制寄存器
    26. //边沿对齐
    27. TIM4->CR1 &= (~(0x3 << 5));
    28. //设置递减计数器
    29. TIM4->CR1 |= (0x1 << 4);
    30. //设置比较捕获寄存器初始化
    31. //设置pwm模式
    32. TIM4->CCMR1 &= (~(0x1 << 16));
    33. TIM4->CCMR1 &= (~(0x7 << 4));
    34. TIM4->CCMR1 |= (0x6 << 4);
    35. //自动重载计数器预加载使能
    36. TIM4->CR1 |= (0x1 << 7);
    37. //输出比较寄存器预加载使能
    38. TIM4->CCMR1 |= (0x1 << 3);
    39. //配置捕获/比较寄存器输出模式
    40. TIM4->CCMR1 &= (~0x3);
    41. //比较/捕获寄存器
    42. TIM4->CCER &= (~(0x1 << 3));
    43. TIM4->CCER &= (~(0X1 << 1));
    44. TIM4->CCER |= 0x1;
    45. //设置计数器使能
    46. TIM4->CR1 |= 0x1;
    47. }
    48. /***********风扇PE9初始化*************/
    49. void fan_pwm()
    50. {
    51. /*---------RCC章节-----------*/
    52. //GPIO组使能
    53. RCC->MP_AHB4ENSETR |= (0x1 << 4);
    54. //TIM1使能
    55. RCC->MP_APB2ENSETR |= 0x1;
    56. /*---------GPIO章节----------*/
    57. //设置PE9引脚为复用功能
    58. GPIOE->MODER &= (~(0x3 << 18));
    59. GPIOE->MODER |= (0x2 << 18);
    60. //设置复用功能为TIM1_CH1
    61. GPIOE->AFRH &= (~(0xf << 4));
    62. GPIOE->AFRH |= (0x1 << 4);
    63. /*-------------TIME1_CH1章节----------*/
    64. //设置分频
    65. TIM1->PSC =209;
    66. //设置自动重载计数器的值
    67. TIM1->ARR =1000;
    68. //设置比较/捕获计数器的值
    69. TIM1->CCR1=700;
    70. //BDTR寄存器
    71. TIM1->BDTR |= (0x1 << 15);
    72. //设置计数器采用边沿对齐方式
    73. TIM1->CR1 &= (~(0x3 << 5));
    74. //设置计数器为递减计数器
    75. TIM1->CR1 |= (0x1 << 4);
    76. //配置输出比较模式为pwm
    77. TIM1->CCMR1 &= (~(0x1 << 16));
    78. TIM1->CCMR1 &= (~(0x7 << 4));
    79. TIM1->CCMR1 |= (0x6 << 4);
    80. //配置捕获/比较寄存器输出模式
    81. TIM1->CCMR1 &= (~0x3);
    82. //设置比较/捕获寄存器通道1输出极性
    83. TIM1->CCER &= (~(0x1 << 3));
    84. //设置起始状态为高电平
    85. TIM1->CCER &= (~(0x1 << 1));
    86. //设置比较/捕获寄存器为输出信号
    87. TIM1->CCER |= 0x1;
    88. //自动重载计数器预加载使能
    89. TIM1->CR1 |= (0x1 << 7);
    90. //配置输出比较寄存器预加载使能
    91. TIM1->CCMR1 |= (0x1 << 3);
    92. //设置计数器使能
    93. TIM1->CR1 |= 0x1;
    94. }
    95. /***********马达PF6初始化*************/
    96. void motor_pwm()
    97. {
    98. /*---------RCC章节-----------*/
    99. //GPIO组使能
    100. RCC->MP_AHB4ENSETR |= (0x1 << 5);
    101. //TIM16使能
    102. RCC->MP_APB2ENSETR |= (0x1 << 3);
    103. /*---------GPIO章节----------*/
    104. //设置PF6引脚为复用功能
    105. GPIOF->MODER &= (~(0x3 << 12));
    106. GPIOF->MODER |= (0x2 << 12);
    107. //设置复用功能为TIM16_CH1
    108. GPIOF->AFRL &= (~(0xf << 24));
    109. GPIOF->AFRL |= (0x1 << 24);
    110. /*-------------TIME16_CH1章节----------*/
    111. //设置分频
    112. TIM16->PSC =209;
    113. //设置自动重载计数器的值
    114. TIM16->ARR =1000;
    115. //设置比较/捕获计数器的值
    116. TIM16->CCR1=700;
    117. //BDTR寄存器
    118. TIM16->BDTR |= (0x1 << 15);
    119. //配置输出比较模式为pwm
    120. TIM16->CCMR1 &= (~(0x1 << 16));
    121. TIM16->CCMR1 &= (~(0x7 << 4));
    122. TIM16->CCMR1 |= (0x6 << 4);
    123. //配置捕获/比较寄存器输出模式
    124. TIM16->CCMR1 &= (~0x3);
    125. //设置比较/捕获寄存器通道1输出极性
    126. TIM16->CCER &= (~(0x1 << 3));
    127. //设置起始状态为高电平
    128. TIM16->CCER &= (~(0x1 << 1));
    129. //设置比较/捕获寄存器为输出信号
    130. TIM16->CCER |= 0x1;
    131. //配置输出比较寄存器预加载使能
    132. TIM16->CCMR1 |= (0x1 << 3);
    133. //自动重载计数器预加载使能
    134. TIM16->CR1 |= (0x1 << 7);
    135. //计数器使能
    136. TIM16->CR1 |= 0x1;
    137. }
    1. //主函数
    2. #include "pwm.h"
    3. extern void printf(const char *fmt, ...);
    4. void delay_ms(int ms)
    5. {
    6. int i,j;
    7. for(i = 0; i < ms;i++)
    8. for (j = 0; j < 1800; j++);
    9. }
    10. int main()
    11. {
    12. sp_pwm();
    13. fan_pwm();
    14. motor_pwm();
    15. while(1)
    16. {
    17. }
    18. return 0;
    19. }

    //实验结果

    1、蜂鸣器

    2、风扇转动

    3、马达声音响

  • 相关阅读:
    Linux零拷贝解析
    回归预测 | Matlab实现SO-CNN-SVM蛇群算法优化卷积神经网络-支持向量机的多输入单输出回归预测
    MD5 加密安全吗?
    docker安装gitlab 并dump出表结构
    docker容器添加新端口映射的步骤及`wsl$`目录的作用
    让人疑惑的STM32F4F7芯片
    DHCP原理与配置
    分析 Base64 编码和 URL 安全 Base64 编码
    MySQL之事务和redo日志
    LVM使用与管理
  • 原文地址:https://blog.csdn.net/wyl2333/article/details/128192966