STM32按键控制不了电机
主函数:
#include "stm32f10x.h"
#include "exti.h"
#include "pwm.h"
#include "Motor.h"
uint8_t mode = 0;
int main(void)
{
uint8_t a = 0;
delay_init(); //延时函数初始化
TIME_Init(); //初始化定时器
PWM_Init();
motor_configuration();
EXTI_KEY_Init();
while (1)
{
if (mode == 1)
{
for (int i = 0 ; i <= 10; i++ )
{
motor_Reverse(100);
}
Servo_SetAngle1(0);
}
}
}
// EXTI0 中断服务函数
void EXTI0_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line0))
{ // 按键按下
mode++;
if (mode > 1)
{
mode = 0;
}
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
exti.c
#include "exti.h"
// 将 GPIO A0 A1 配置为外部中断
// 按键按下时,触发外部中断
// 外部中断触发条件为 上升沿中断
void EXTI_KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //选择对应的引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOA, &GPIO_InitStructure);
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
Motor.c
#include "stm32f10x.h"
#include "delay.h"
#include "Motor.h"
#include <stm32f10x_conf.h>
void motor_configuration(void)//PB12,PB13,PB14,PB15
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
GPIO_ResetBits(GPIOB, GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
}
// 正转
void motor_Forward(int n)
{
IN1_H;
delay_ms(n);
IN4_L;
delay_ms(n);
IN2_H;
delay_ms(n);
IN1_L;
delay_ms(n);
IN3_H;
delay_ms(n);
IN2_L;
delay_ms(n);
IN4_H;
delay_ms(n);
IN3_L;
delay_ms(n);
}
// 倒转
void motor_Reverse(int n)
{
IN3_L;
delay_ms(n);
IN4_H;
delay_ms(n);
IN2_L;
delay_ms(n);
IN3_H;
delay_ms(n);
IN1_L;
delay_ms(n);
IN2_H;
delay_ms(n);
IN4_L;
delay_ms(n);
IN1_H;
delay_ms(n);
}
void Motor_Ctrl_Off(void)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
}