練習1:
PWM控制蜂鳴器,風扇,震動馬達
pwm.h
#ifndef __UART4_H__
#define __UART4_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_tim.h"//蜂鳴器 PB6 TIME4_CH1 初始化
void hal_beep_init();//風扇
void hal_fan_init();//馬達
void hal_monitor_init();#endif
pwm.c
#include "pwm.h"//蜂鳴器 PB6 TIM4_CH1
void hal_beep_init(){//rcc章節初始化//1.使能gpiob組控制器RCC->MP_AHB4ENSETR |= (0x1<<1);//2.使能tim4組控制器RCC->MP_APB1ENSETR |= (0x1<<2);//gpiob組控制器初始化//1.設置復用功能模式GPIOB->MODER &= (~(0x3<<12));GPIOB->MODER |= (0x2<<12);//2.設置復用功能為tim4_ch1GPIOB->AFRL &= (~(0xf<<24));GPIOB->AFRL |= (0x2<<24);//tim4章節初始化//產生方波 頻率1000hz//系統提供時鐘源位209mhz//1.設置預分頻器TIM4->PSC = 208; //因為時鐘頻率=fck_psc/(PSC[15:0]+1),所以這里傳輸208//2.設置自動重載值TIM4->ARR = 1000; //1000//3.設置比較寄存器,控制占空比TIM4->CCR1 = 300; //300//4.設置輸出比較模式TIM4->CCMR1 &= (~(0x7<<4));TIM4->CCMR1 &= (~(0x1<<16));TIM4->CCMR1 |= (0x6<<4);//5.輸出比較預加載使能TIM4->CCMR1 |= (0x1<<3);//6.設置通道1配置為輸出TIM4->CCMR1 &= (~(0x3<<0));//8.設置起始時低電平TIM4->CCER |= (0x1<<1);//9.使能捕獲TIM4->CCER |= (0x1<<0); //10.設置自動重載預加載使能TIM4->CR1 |= (0x1<<7);//11.設置邊沿對齊方式TIM4->CR1 &= (~(0x3<<5));//12.設置遞減計數TIM4->CR1 |= (0x1<<4);//13.設置計數器使能TIM4->CR1 |= (0x1<<0);}
//風扇
void hal_fan_init(){//rcc章節初始化//1.使能gpioe組控制器RCC->MP_AHB4ENSETR |= (0x1<<4);//2.使能tim1組控制器RCC->MP_APB2ENSETR |= (0x1<<0);//gpioe組控制器初始化//1.設置復用功能模式GPIOE->MODER &= (~(0x3<<18));GPIOE->MODER |= (0x2<<18);//2.設置復用功能為tim1_ch1GPIOE->AFRH &= (~(0xf<<4));GPIOE->AFRH |= (0x1<<4);//tim1章節初始化//產生方波 頻率1000hz//系統提供時鐘源位209mhz//1.設置預分頻器TIM1->PSC = 208; //因為時鐘頻率=fck_psc/(PSC[15:0]+1),所以這里傳輸208//2.設置自動重載值TIM1->ARR = 1000; //1000//3.設置比較寄存器,控制占空比TIM1->CCR1 = 500; //500//4.設置輸出比較模式TIM1->CCMR1 &= (~(0x7<<4));TIM1->CCMR1 &= (~(0x1<<16));TIM1->CCMR1 |= (0x6<<4);//5.輸出比較預加載使能TIM1->CCMR1 |= (0x1<<3);//6.設置通道1配置為輸出TIM1->CCMR1 &= (~(0x3<<0));//14.設置主輸出使能TIM1->BDTR |= (0x1<<15);//8.設置起始時低電平TIM1->CCER |= (0x1 << 3);TIM1->CCER |= (0x1<<1);//9.使能捕獲TIM1->CCER |= (0x1<<0); //10.設置自動重載預加載使能TIM1->CR1 |= (0x1<<7);//11.設置邊沿對齊方式TIM1->CR1 &= (~(0x3<<5));//12.設置遞減計數TIM1->CR1 |= (0x1<<4);//13.設置計數器使能TIM1->CR1 |= (0x1<<0);}//馬達
void hal_monitor_init(){//rcc章節初始化//1.使能gpiof組控制器RCC->MP_AHB4ENSETR |= (0x1<<5);//2.使能tim16組控制器RCC->MP_APB2ENSETR |= (0x1<<3);//gpiof組控制器初始化//1.設置復用功能模式GPIOF->MODER &= (~(0x3<<12));GPIOF->MODER |= (0x2<<12);//2.設置復用功能為tim1_ch1GPIOF->AFRL &= (~(0xf<<24));GPIOF->AFRL |= (0x1<<24);//tim16章節初始化//產生方波 頻率1000hz//系統提供時鐘源位209mhz//1.設置預分頻器TIM16->PSC = 208; //因為時鐘頻率=fck_psc/(PSC[15:0]+1),所以這里傳輸208//2.設置自動重載值TIM16->ARR = 1000; //1000//3.設置比較寄存器,控制占空比TIM16->CCR1 = 500; //500//4.設置輸出比較模式TIM16->CCMR1 &= (~(0x7<<4));TIM16->CCMR1 &= (~(0x1<<16));TIM16->CCMR1 |= (0x6<<4);//5.輸出比較預加載使能TIM16->CCMR1 |= (0x1<<3);//6.設置通道1配置為輸出TIM16->CCMR1 &= (~(0x3<<0));//7.設置主輸出使能TIM16->BDTR |= (0x1<<15);//8.設置起始時低電平TIM16->CCER |= (0x1 << 3);TIM16->CCER |= (0x1<<1);//9.使能捕獲TIM16->CCER |= (0x1<<0); //10.設置自動重載預加載使能TIM16->CR1 |= (0x1<<7);//11.設置計數器使能TIM16->CR1 |= (0x1<<0);
}
main.c
#include "pwm.h"int main()
{hal_beep_init();hal_fan_init();hal_monitor_init();while(1){}return 0;
}