电设第二次作业

作业内容

  • 使用定时器输出PWM波控制灯的亮度
  • 设置四个按键
  • 按键1控制模式(占空比或频率)
  • 按键2,3控制升高和降低
  • 按键3实现按下后出现呼吸灯
  • 定时器实现每隔一秒打印一次频率和占空比

全集变量

1
2
3
int mode=0;int x=0;
int hz=1000;
int zhankongbi=50;

使用定时器输出PWM波

原理图:

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void PWM_Init(){
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//配置GPIO
GPIO_InitTypeDef GPIO;
GPIO.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO.GPIO_Pin=GPIO_Pin_0;
GPIO.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO);
//配置时基单元
TIM_InternalClockConfig(TIM2);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInit_structuct;
TIM_TimeBaseInit_structuct.TIM_ClockDivision=TIM_CKD_DIV1 ;
TIM_TimeBaseInit_structuct.TIM_CounterMode=TIM_CounterMode_Up ;
TIM_TimeBaseInit_structuct.TIM_Period= 100-1;
TIM_TimeBaseInit_structuct.TIM_Prescaler= 720-1;
TIM_TimeBaseInit_structuct.TIM_RepetitionCounter= 0;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInit_structuct);
//配置输入比较单元
TIM_OCInitTypeDef TIM_OCInit_Structure;
TIM_OCStructInit(&TIM_OCInit_Structure);
TIM_OCInit_Structure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInit_Structure.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OCInit_Structure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInit_Structure.TIM_Pulse=0x31;
TIM_OC1Init(TIM2,&TIM_OCInit_Structure);

TIM_Cmd(TIM2,ENABLE);
}
  • 配置完后,调用函数会在A0输出PWM波(频率1000hz,占空比百分之五十)

按键初始化以及按键设置

代码部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
void speedup_Init(){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitTypeDef GPIOb1;
GPIOb1.GPIO_Mode=GPIO_Mode_IPU;
GPIOb1.GPIO_Pin=GPIO_Pin_15;
GPIOb1.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIOb1);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource15);
EXTI_InitTypeDef EXTI_Init_Structure;
EXTI_Init_Structure.EXTI_Line=EXTI_Line15;
EXTI_Init_Structure.EXTI_LineCmd=ENABLE;
EXTI_Init_Structure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_Init_Structure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_Init(&EXTI_Init_Structure);

}
void speeddown_Init(){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitTypeDef GPIOb1;
GPIOb1.GPIO_Mode=GPIO_Mode_IPU;
GPIOb1.GPIO_Pin=GPIO_Pin_12;
GPIOb1.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIOb1);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource12);
EXTI_InitTypeDef EXTI_Init_Structure;
EXTI_Init_Structure.EXTI_Line=EXTI_Line12;
EXTI_Init_Structure.EXTI_LineCmd=ENABLE;
EXTI_Init_Structure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_Init_Structure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_Init(&EXTI_Init_Structure);

}
void change_Init(){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitTypeDef GPIOb1;
GPIOb1.GPIO_Mode=GPIO_Mode_IPU;
GPIOb1.GPIO_Pin=GPIO_Pin_1;
GPIOb1.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIOb1);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);
EXTI_InitTypeDef EXTI_Init_Structure;
EXTI_Init_Structure.EXTI_Line=EXTI_Line1;
EXTI_Init_Structure.EXTI_LineCmd=ENABLE;
EXTI_Init_Structure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_Init_Structure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_Init(&EXTI_Init_Structure);
NVIC_InitTypeDef NVIC_Init_Structure;
NVIC_Init_Structure.NVIC_IRQChannel=EXTI1_IRQn;
NVIC_Init_Structure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init_Structure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_Init_Structure.NVIC_IRQChannelSubPriority=0;
NVIC_Init(&NVIC_Init_Structure);

}
void Exit_init(){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitTypeDef GPIOb1;
GPIOb1.GPIO_Mode=GPIO_Mode_IPU;
GPIOb1.GPIO_Pin=GPIO_Pin_11;
GPIOb1.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIOb1);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource11);
EXTI_InitTypeDef EXTI_Init_Structure;
EXTI_Init_Structure.EXTI_Line=EXTI_Line11;
EXTI_Init_Structure.EXTI_LineCmd=ENABLE;
EXTI_Init_Structure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_Init_Structure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_Init(&EXTI_Init_Structure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_Init_Structure;
NVIC_Init_Structure.NVIC_IRQChannel=EXTI15_10_IRQn;
NVIC_Init_Structure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init_Structure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_Init_Structure.NVIC_IRQChannelSubPriority=0;
NVIC_Init(&NVIC_Init_Structure);

}
void EXTI15_10_IRQHandler(){
if(EXTI_GetITStatus(EXTI_Line11)==SET){
Easy_Delay_ms(15);
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==0);
Easy_Delay_ms(15);
mode=1-mode;
EXTI_ClearITPendingBit(EXTI_Line11);
}else if(EXTI_GetITStatus(EXTI_Line15)==SET){
Easy_Delay_ms(15);
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)==0);
Easy_Delay_ms(15);
if(mode==0&&hz<5000){
hz+=1000;
TIM_PrescalerConfig(TIM2,7200000/hz-1,TIM_PSCReloadMode_Immediate);
}
if(mode==1&&zhankongbi<100){
zhankongbi+=10;
TIM_SetCompare1(TIM2,zhankongbi);
}
EXTI_ClearITPendingBit(EXTI_Line15);
}else if(EXTI_GetITStatus(EXTI_Line12)==SET){
Easy_Delay_ms(15);
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12)==0);
Easy_Delay_ms(15);
if(mode==0&&hz>1000){
hz-=1000;
TIM_PrescalerConfig(TIM2,7200000/hz-1,TIM_PSCReloadMode_Immediate);
}
if(mode==1&&zhankongbi>0){
zhankongbi-=10;
TIM_SetCompare1(TIM2,zhankongbi);}
EXTI_ClearITPendingBit(EXTI_Line12);
}


}
void EXTI1_IRQHandler(){
if(EXTI_GetITStatus(EXTI_Line1)==SET){
Easy_Delay_ms(15);
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0);
Easy_Delay_ms(15);
x=1-x;

}
EXTI_ClearITPendingBit(EXTI_Line1);
}


定时器打印

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void  Timer_init(){
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TIM_InternalClockConfig(TIM3);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInit_structuct;
TIM_TimeBaseInit_structuct.TIM_ClockDivision=TIM_CKD_DIV1 ;
TIM_TimeBaseInit_structuct.TIM_CounterMode=TIM_CounterMode_Up ;
TIM_TimeBaseInit_structuct.TIM_Period= 10000-1;
TIM_TimeBaseInit_structuct.TIM_Prescaler= 7200-1;
TIM_TimeBaseInit_structuct.TIM_RepetitionCounter= 0;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInit_structuct);
TIM_ClearFlag(TIM3,TIM_FLAG_Update);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_Init1;
NVIC_Init1.NVIC_IRQChannel=TIM3_IRQn;
NVIC_Init1.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init1.NVIC_IRQChannelPreemptionPriority=0;
NVIC_Init1.NVIC_IRQChannelSubPriority=0;
NVIC_Init(&NVIC_Init1);
TIM_Cmd(TIM3,ENABLE);
void TIM3_IRQHandler(){
if(mode==0)
printf("模式:频率 ");
else
printf("模式:占空比 ");

printf("频率是%d ",hz);
printf("占空比是%d%%\r\n",zhankongbi);
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}

主函数部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int main(){
int i;
Exit_init();
Timer_init();
speedup_Init();
speeddown_Init();
change_Init();
PWM_Init();
Serial_Init();
while(1){
if(x==1){
for(zhankongbi=0;zhankongbi<=100;zhankongbi++)
{
TIM_SetCompare1(TIM2,zhankongbi);
Delay_ms(3);
}
for(zhankongbi=100;zhankongbi>=0;zhankongbi--)
{
TIM_SetCompare1(TIM2,zhankongbi);
Delay_ms(3);
}if(x==0){
zhankongbi=0;
TIM_SetCompare1(TIM2,zhankongbi);
}
}

}
}