主函数
#include "BSP_TIM2.h"
#include "BSP_GPIO.h"
int main(void)
{
TIM2_Init();
KEY_GPIO_Config();
while(1)
{
// ON
if(KEY_Scan(KEY_PORT, KEY_ON_PIN) == 1)
{
TIM2->CCR2 = CCR_Val;
Delay_ms(2000); //2s
// TIM2->CCR2 = 0;
}
// OFF
if(KEY_Scan(KEY_PORT, KEY_OFF_PIN) == 1)
{
// TIM2->CCR2 = 0;
// TIM2->CCR4 = 0;
TIM2->CCR3 = CCR_Val;
Delay_ms(2000); //1s
// TIM2->CCR3 = 0;
}
// RESET
if(KEY_Scan(KEY_PORT, KEY_RESET_PIN) == 1)
{
// TIM2->CCR2 = 0;
// TIM2->CCR3 = 0;
TIM2->CCR4 = CCR_Val;
Delay_ms(2000); //1s
// TIM2->CCR4 = 0;
}
}
}
GPIO.C
#include "BSP_GPIO.h"
void KEY_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(KEY_CLK,ENABLE);
GPIO_InitStructure.GPIO_Pin = KEY_ON_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(KEY_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = KEY_OFF_PIN;
GPIO_Init(KEY_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = KEY_RESET_PIN;
GPIO_Init(KEY_PORT,&GPIO_InitStructure);
}
uint8_t KEY_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == 1)
{
// while(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == 1);
return 1;
}
else
return 0;
}
GPIO.H
#ifndef __BSP_GPIO_H
#define __BSP_GPIO_H
#include "stm32f10x.h"
#define KEY_CLK RCC_APB2Periph_GPIOB
#define KEY_PORT GPIOB
#define KEY_ON_PIN GPIO_Pin_11
#define KEY_OFF_PIN GPIO_Pin_12
#define KEY_RESET_PIN GPIO_Pin_13
void KEY_GPIO_Config(void);
uint8_t KEY_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
#endif
TIM2.C
#include "BSP_TIM2.h"
void Delay_us(uint32_t Tim)
{
uint32_t i=0;
for(i=0;i<Tim;i++)
{
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
}
}
void Delay_ms(uint32_t Tim)
{
uint32_t i;
for(i=0;i<Tim;i++)
Delay_us(1000);
}
static void TIM2_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(TIM2_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = TIM2_GPIO_PIN1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(TIM2_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = TIM2_GPIO_PIN2;
GPIO_Init(TIM2_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = TIM2_GPIO_PIN3;
GPIO_Init(TIM2_GPIO_PORT, &GPIO_InitStructure);
}
static void TIM2_MODE_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(TIM2_CLK, ENABLE);
TIM_TimBaseStructure.TIM_Period = TIM2_Period;
TIM_TimBaseStructure.TIM_Prescaler = TIM2_Prescaler;
TIM_TimBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_OC3Init(TIM2, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_OC4Init(TIM2, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM2, ENABLE);
}
static void TIM2_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void TIM2_Init(void)
{
TIM2_NVIC_Config();
TIM2_GPIO_Config();
TIM2_MODE_Config();
}
TIM2.H
#ifndef __BSP_TIM2_H
#define __BSP_TIM2_H
#include "stm32f10x.h"
#define TIM2_Period 399 // 200ms(399)
#define TIM2_Prescaler 35999 // 2KHz
#define CCR_Val 320 //
#define TIM2_CLK RCC_APB1Periph_TIM2
#define TIM2_GPIO_PORT GPIOA
#define TIM2_GPIO_CLK RCC_APB2Periph_GPIOA
#define TIM2_GPIO_PIN1 GPIO_Pin_1
#define TIM2_GPIO_PIN2 GPIO_Pin_2
#define TIM2_GPIO_PIN3 GPIO_Pin_3
void Delay_us(uint32_t Tim);
void Delay_ms(uint32_t Tim);
void TIM2_Init(void);
#endif
中断函数
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM2->CCR2 = 0;
TIM2->CCR3 = 0;
TIM2->CCR4 = 0;
TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update);
}
// TIM_Cmd(TIM2, DISABLE);
// Delay_ms(1000);
}
该程序实现的是按键控制TIM2通道2,3,4输出PWM波,每按一次,输出一个脉冲。把与中断相关的去掉,可实现按键按的时候一直输出脉冲。
现在遗留的问题是,没办法检测到按键弹开。