主函数
#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波,每按一次,输出一个脉冲。把与中断相关的去掉,可实现按键按的时候一直输出脉冲。
现在遗留的问题是,没办法检测到按键弹开。