STM32F103C8T6驱动舵机SG90 配置定时器TIM2,TIM3,TIM4的多种重映射模式下的不同IO口

1.使用到的工具介绍
2.整个简单介绍
3.程序的介绍
1.使用到的工具介绍:
keil5,烧写软件FlyMcu.exe,硬件为STM32F103C8T6板,SG90舵机还有按键。

2.整个简单介绍:
通过对舵机的了解我这里使用的是sg90舵机可旋转180度,使用的芯片是stm32f103c8t6。在配置2个按键来进行舵机角度加减,通过加减来改变舵机的角度变化;

SG90舵机红线 VCC线(接5v)
SG90舵机棕线 GND线
SG90舵机黄线 控制信号线

需要通过PWM来配置出各种角度的占空比,STM32F103的PWM可配置的IO口如下图,对TIM2,TIM3,TIM4都进行了配置也对各种重映射情况下的IO口配置。
简单方便使用时调用即可。再配置2个按键来改变TIM_SetCompare4(TIM3, i);中的i变量,就可以改变舵机的角度;i变量的取值范围在175-195之间变化对应0-180角度的范围。

TIM_SetCompare4(TIM3, i);//改变i的变量就可以改变舵机角度


(1)根据STM32F103C8T6型号对TIM2的配置
①没有重映射 可以配置的IO口有CH1 PA0,CH2 PA1,CH3 PA2,CH4 PA3;
②部分重映射1 可以配置的IO口有CH1 PA15,CH2 PB3,CH3 PA2,CH4 PA3;
TIM2的部分重映射1使用到了PA15和PB3所以需要禁用掉JTAG功能,代码里加入

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,
ENABLE);//这条是关闭PB3,PB4,PA15做普通IO

③部分重映射2 可以配置的IO口有CH1 PA0,CH2 PA1,CH3 PB10,CH4 PB11;
④完全重映射 可以配置的IO口有CH1 PA15,CH2 PB3,CH3 PB10,CH4 PB11;
TIM2的完全重映射使用到了PA15和PB3所以需要禁用掉JTAG功能,代码里加入

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,
ENABLE);//这条是关闭PB3,PB4,PA15做普通IO

(2)根据STM32F103C8T6型号对TIM3的配置
①没有重映射 可以配置的IO口有CH1 PA6,CH2 PA7,CH3 PB0,CH4 PB1;
②部分重映射 可以配置的IO口有CH1 PB4,CH2 PB5,CH3 PB0,CH4 PB1;
TIM3的部分重映射使用到了PB4所以需要禁用掉JTAG功能,代码里加入

GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);//单独关闭PB4的JTAG功能

(3)根据STM32F103C8T6型号对TIM4的配置
①TIM4_REMAP = 0 没有重映射 可以配置的IO口有CH1 PB6,CH2 PB7,CH3 PB8,CH4 PB9;

3.程序的介绍
SG90.H中的代码

#ifndef __SG90_H
#define __SG90_H
#include "sys.h"
//这里使用到的是stm32f103c8t6  有些io口配置不到
//这里只配置了普通定时器 TIM2 TIM3 TIM4//SG90舵机驱动 0-180 角度
//通过变量来改变i这个数值就能改变舵机的角度
//这里的i的变量为175-195之中间就是0-180度的角度了
//  TIM_SetCompare1(TIM3, i);
//  TIM_SetCompare2(TIM3, i);
//  TIM_SetCompare3(TIM3, i);
//  TIM_SetCompare4(TIM3, i);
//  在key.h中有使用到
//  通过两按键实现加和键这个变量,进行角度的变化//mode 0 1 2 3 有这4中模式
//0 没有重映射   可以配置的IO口有CH1 PA0,CH2 PA1,CH3 PA2,CH4 PA3;
//1 部分重映射1  可以配置的IO口有CH1 PA15,CH2 PB3,CH3 PA2,CH4 PA3;
//2 部分重映射2  可以配置的IO口有CH1 PA0,CH2 PA1,CH3 PB10,CH4 PB11;
//3 完全重映射   可以配置的IO口有CH1 PA15,CH2 PB3,CH3 PB10,CH4 PB11;
void TIM2_PwmSG90_Init(u8 mode);
//mode 0 1 2 有这3中模式模式
//0 没有重映射  可以配置的IO口有CH1 PA6,CH2 PA7,CH3 PB0,CH4 PB1;
//1 部分重映射  可以配置的IO口有CH1 PB4,CH2 PB5,CH3 PB0,CH4 PB1;
//2 完全重映射  在stm32f103c8t6上没有这些pin口所以这里没有配置 可以配置的IO口有CH1 PC6,CH2 PC7,CH3 PC8 ,CH4 PC9;
void TIM3_PwmSG90_Init(u8 mode);//mode 0 1 有这2中模式模式
//0 TIM4_REMAP = 0 没有重映射  可以配置的IO口有CH1 PB6,CH2 PB7,CH3 PB8,CH4 PB9;
//1 TIM4_REMAP = 1 部分重映射  在stm32f103c8t6上没有这些pin口所以这里没有配置 可以配置的IO口有CH1 PD12,CH2 PD13,CH3 PD14,CH4 PD15;
void TIM4_PwmSG90_Init(u8 mode);#endif

SG90.c中的代码

#include "SG90.H"
//这里我使用的是stm32f103c8t6//mode 0 1 2 3 有这4中模式
//0 没有重映射   可以配置的IO口有CH1 PA0,CH2 PA1,CH3 PA2,CH4 PA3;
//1 部分重映射1  可以配置的IO口有CH1 PA15,CH2 PB3,CH3 PA2,CH4 PA3;
//2 部分重映射2  可以配置的IO口有CH1 PA0,CH2 PA1,CH3 PB10,CH4 PB11;
//3 完全重映射   可以配置的IO口有CH1 PA15,CH2 PB3,CH3 PB10,CH4 PB11;
void TIM2_PwmSG90_Init(u8 mode)
{GPIO_InitTypeDef PWM_Initstructure;  //定义GPIO端口结构体TIM_TimeBaseInitTypeDef TIM_Initstructure;   //定义TIM结构体TIM_OCInitTypeDef OC_Initstructure;   //定义输出比较结构体if(mode==0){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); //打开端口和复用时钟  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);    //打开定时器的时钟//这里设置的是没有重映射的设置所以可以配置的IO口有CH1 PA0,CH2 PA1,CH3 PA2,CH4 PA3;           PWM_Initstructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;PWM_Initstructure.GPIO_Mode = GPIO_Mode_AF_PP;PWM_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &PWM_Initstructure);     }if(mode==1){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOA| RCC_APB2Periph_AFIO, ENABLE); //打开端口和复用时钟    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);    //打开定时器的时钟GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);//设置端口重映射://这里设置的是部分重映射1 可以配置的IO口有CH1 PA15,CH2 PB3,CH3 PA2,CH4 PA3;//  // GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);; //使用PA15,PB3所需要关掉的下载口需要禁用JTAG才能使用 这条是关闭5个IO口GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//这条是关闭PB3,PB4,PA15做普通IO//GPIO_Remap_SWJ_Disable 关闭所有跟JTAG有关的引脚PWM_Initstructure.GPIO_Pin = GPIO_Pin_15|GPIO_Pin_2|GPIO_Pin_3;PWM_Initstructure.GPIO_Mode = GPIO_Mode_AF_PP;PWM_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &PWM_Initstructure);PWM_Initstructure.GPIO_Pin = GPIO_Pin_3;PWM_Initstructure.GPIO_Mode = GPIO_Mode_AF_PP;PWM_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &PWM_Initstructure);}if(mode==2){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOA| RCC_APB2Periph_AFIO, ENABLE); //打开端口和复用时钟   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);    //打开定时器的时钟GPIO_PinRemapConfig(GPIO_PartialRemap2_TIM2, ENABLE);//设置端口重映射://这里设置的是部分重映射2 可以配置的IO口有CH1 PA0,CH2 PA1,CH3 PB10,CH4 PB11;PWM_Initstructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;PWM_Initstructure.GPIO_Mode = GPIO_Mode_AF_PP;PWM_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &PWM_Initstructure);PWM_Initstructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;PWM_Initstructure.GPIO_Mode = GPIO_Mode_AF_PP;PWM_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &PWM_Initstructure);  }if(mode==3){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOA| RCC_APB2Periph_AFIO, ENABLE); //打开端口和复用时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);    //打开定时器的时钟GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE);//设置端口重映射://这里设置的是部分重映射2 可以配置的IO口有CH1 PA15,CH2 PB3,CH3 PB10,CH4 PB11//  //    GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);; //使用PA15,PB3所需要关掉的下载口需要禁用JTAG才能使用 这条是关闭5个IO口GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//这条是关闭PB3,PB4,PA15做普通IO//GPIO_Remap_SWJ_Disable 关闭所有跟JTAG有关的引脚PWM_Initstructure.GPIO_Pin = GPIO_Pin_15;PWM_Initstructure.GPIO_Mode = GPIO_Mode_AF_PP;PWM_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &PWM_Initstructure);PWM_Initstructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_10|GPIO_Pin_11;PWM_Initstructure.GPIO_Mode = GPIO_Mode_AF_PP;PWM_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &PWM_Initstructure);        }   //下面的配置都一样TIM_Initstructure.TIM_ClockDivision = TIM_CKD_DIV1;   //不分频TIM_Initstructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数TIM_Initstructure.TIM_Period = 200-1;TIM_Initstructure.TIM_Prescaler = 7200-1;TIM_TimeBaseInit(TIM2, &TIM_Initstructure);TIM_Cmd(TIM2, ENABLE); //使能时钟OC_Initstructure.TIM_OCMode = TIM_OCMode_PWM1;   //采用PWM1模式OC_Initstructure.TIM_OutputState = TIM_OutputState_Enable;  //配置输出使能OR使能OC_Initstructure.TIM_OCPolarity = TIM_OCPolarity_Low; //比较输出极性TIM_OC1Init(TIM2, &OC_Initstructure);     //输出比较初始化TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);      //启用CCR2上的TIM3外围预加载寄存器。OC_Initstructure.TIM_OCMode = TIM_OCMode_PWM1;  //采用PWM1模式OC_Initstructure.TIM_OutputState = TIM_OutputState_Enable;  //配置输出使能OR使能OC_Initstructure.TIM_OCPolarity = TIM_OCPolarity_Low; //比较输出极性TIM_OC2Init(TIM2, &OC_Initstructure);     //输出比较初始化TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);      //启用CCR2上的TIM3外围预加载寄存器。OC_Initstructure.TIM_OCMode = TIM_OCMode_PWM1;  //采用PWM1模式OC_Initstructure.TIM_OutputState = TIM_OutputState_Enable;  //配置输出使能OR使能OC_Initstructure.TIM_OCPolarity = TIM_OCPolarity_Low; //比较输出极性TIM_OC3Init(TIM2, &OC_Initstructure);     //输出比较初始化TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);      //启用CCR2上的TIM3外围预加载寄存器。OC_Initstructure.TIM_OCMode = TIM_OCMode_PWM1;  //采用PWM1模式OC_Initstructure.TIM_OutputState = TIM_OutputState_Enable;  //配置输出使能OR使能OC_Initstructure.TIM_OCPolarity = TIM_OCPolarity_Low; //比较输出极性TIM_OC4Init(TIM2, &OC_Initstructure);     //输出比较初始化TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);      //启用CCR2上的TIM3外围预加载寄存器。
}//mode 0 1 2 有这3中模式
//0 没有重映射  可以配置的IO口有CH1 PA6,CH2 PA7,CH3 PB0,CH4 PB1;
//1 部分重映射  可以配置的IO口有CH1 PB4,CH2 PB5,CH3 PB0,CH4 PB1;
//2 完全重映射  在stm32f103c8t6上没有这些pin口所以这里没有配置 可以配置的IO口有CH1 PC6,CH2 PC7,CH3 PC8 ,CH4 PC9;
void TIM3_PwmSG90_Init(u8 mode)
{GPIO_InitTypeDef PWM_Initstructure;  //定义GPIO端口结构体TIM_TimeBaseInitTypeDef TIM_Initstructure;   //定义TIM结构体TIM_OCInitTypeDef OC_Initstructure;   //定义输出比较结构体if(mode==0){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA| RCC_APB2Periph_AFIO, ENABLE); //打开端口和复用时钟    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);    //打开定时器的时钟//这里设置的是没有重映射的设置所以可以配置的IO口有CH1 PA6,CH2 PA7,CH3 PB0,CH4 PB1;           PWM_Initstructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;PWM_Initstructure.GPIO_Mode = GPIO_Mode_AF_PP;PWM_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &PWM_Initstructure);       PWM_Initstructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;PWM_Initstructure.GPIO_Mode = GPIO_Mode_AF_PP;PWM_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &PWM_Initstructure);}if(mode==1){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //打开端口和复用时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);    //打开定时器的时钟GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);//设置端口重映射://这里设置的是部分重映射可以配置的IO口有CH1 PB4,CH2 PB5,CH3 PB0 ,CH4 PB1; //GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);//使用PB4所需要关掉的下载口需要禁用JTAG才能使用//GPIO_Remap_SWJ_Disable 关闭所有跟JTAG有关的引脚GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);//单独关闭PB4的JTAG功能 PWM_Initstructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5;PWM_Initstructure.GPIO_Mode = GPIO_Mode_AF_PP;PWM_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &PWM_Initstructure);}//下面的配置都一样TIM_Initstructure.TIM_ClockDivision = TIM_CKD_DIV1;   //不分频TIM_Initstructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数TIM_Initstructure.TIM_Period = 200-1;TIM_Initstructure.TIM_Prescaler = 7200-1;TIM_TimeBaseInit(TIM3, &TIM_Initstructure);TIM_Cmd(TIM3, ENABLE); //使能时钟OC_Initstructure.TIM_OCMode = TIM_OCMode_PWM1;   //采用PWM1模式OC_Initstructure.TIM_OutputState = TIM_OutputState_Enable;  //配置输出使能OR使能OC_Initstructure.TIM_OCPolarity = TIM_OCPolarity_Low; //比较输出极性TIM_OC1Init(TIM3, &OC_Initstructure);     //输出比较初始化TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);      //启用CCR2上的TIM3外围预加载寄存器。OC_Initstructure.TIM_OCMode = TIM_OCMode_PWM1;  //采用PWM1模式OC_Initstructure.TIM_OutputState = TIM_OutputState_Enable;  //配置输出使能OR使能OC_Initstructure.TIM_OCPolarity = TIM_OCPolarity_Low; //比较输出极性TIM_OC2Init(TIM3, &OC_Initstructure);     //输出比较初始化TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);      //启用CCR2上的TIM3外围预加载寄存器。OC_Initstructure.TIM_OCMode = TIM_OCMode_PWM1;  //采用PWM1模式OC_Initstructure.TIM_OutputState = TIM_OutputState_Enable;  //配置输出使能OR使能OC_Initstructure.TIM_OCPolarity = TIM_OCPolarity_Low; //比较输出极性TIM_OC3Init(TIM3, &OC_Initstructure);     //输出比较初始化TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);      //启用CCR2上的TIM3外围预加载寄存器。OC_Initstructure.TIM_OCMode = TIM_OCMode_PWM1;  //采用PWM1模式OC_Initstructure.TIM_OutputState = TIM_OutputState_Enable;  //配置输出使能OR使能OC_Initstructure.TIM_OCPolarity = TIM_OCPolarity_Low; //比较输出极性TIM_OC4Init(TIM3, &OC_Initstructure);     //输出比较初始化TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);      //启用CCR2上的TIM3外围预加载寄存器。
}//mode 0 1 有这2中模式
//0 TIM4_REMAP = 0 没有重映射  可以配置的IO口有CH1 PB6,CH2 PB7,CH3 PB8,CH4 PB9;
//1 TIM4_REMAP = 1 部分重映射  在stm32f103c8t6上没有这些pin口所以这里没有配置 可以配置的IO口有CH1 PD12,CH2 PD13,CH3 PD14,CH4 PD15;
void TIM4_PwmSG90_Init(u8 mode)
{GPIO_InitTypeDef PWM_Initstructure;  //定义GPIO端口结构体TIM_TimeBaseInitTypeDef TIM_Initstructure;   //定义TIM结构体TIM_OCInitTypeDef OC_Initstructure;   //定义输出比较结构体if(mode==0){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE); //打开端口和复用时钟  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);    //打开定时器的时钟//这里设置的是没有重映射的设置所以可以配置的IO口有CH1 PB6,CH2 PB7,CH3 PB8,CH4 PB9;           PWM_Initstructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;PWM_Initstructure.GPIO_Mode = GPIO_Mode_AF_PP;PWM_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &PWM_Initstructure);     }//下面的配置都一样TIM_Initstructure.TIM_ClockDivision = TIM_CKD_DIV1;   //不分频TIM_Initstructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数TIM_Initstructure.TIM_Period = 200-1;TIM_Initstructure.TIM_Prescaler = 7200-1;TIM_TimeBaseInit(TIM4, &TIM_Initstructure);TIM_Cmd(TIM4, ENABLE);    //使能时钟OC_Initstructure.TIM_OCMode = TIM_OCMode_PWM1;   //采用PWM1模式OC_Initstructure.TIM_OutputState = TIM_OutputState_Enable;  //配置输出使能OR使能OC_Initstructure.TIM_OCPolarity = TIM_OCPolarity_Low; //比较输出极性TIM_OC1Init(TIM4, &OC_Initstructure);     //输出比较初始化TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);      //启用CCR2上的TIM3外围预加载寄存器。OC_Initstructure.TIM_OCMode = TIM_OCMode_PWM1;  //采用PWM1模式OC_Initstructure.TIM_OutputState = TIM_OutputState_Enable;  //配置输出使能OR使能OC_Initstructure.TIM_OCPolarity = TIM_OCPolarity_Low; //比较输出极性TIM_OC2Init(TIM4, &OC_Initstructure);     //输出比较初始化TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);      //启用CCR2上的TIM3外围预加载寄存器。OC_Initstructure.TIM_OCMode = TIM_OCMode_PWM1;  //采用PWM1模式OC_Initstructure.TIM_OutputState = TIM_OutputState_Enable;  //配置输出使能OR使能OC_Initstructure.TIM_OCPolarity = TIM_OCPolarity_Low; //比较输出极性TIM_OC3Init(TIM4, &OC_Initstructure);     //输出比较初始化TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);      //启用CCR2上的TIM3外围预加载寄存器。OC_Initstructure.TIM_OCMode = TIM_OCMode_PWM1;  //采用PWM1模式OC_Initstructure.TIM_OutputState = TIM_OutputState_Enable;  //配置输出使能OR使能OC_Initstructure.TIM_OCPolarity = TIM_OCPolarity_Low; //比较输出极性TIM_OC4Init(TIM4, &OC_Initstructure);     //输出比较初始化TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);      //启用CCR2上的TIM3外围预加载寄存器。
}

key.h中的代码

#ifndef __KEY_H
#define __KEY_H
#include "sys.h"#define KEY0 PAin(0)
#define KEY1 PAin(7)
void KEY_Init(void);//IO初始
u8 KEY_OUT(void);
void TIM3_PWMSG90_RUN(void);
void TIM4_PWMSG90_RUN(void);
void TIM2_PWMSG90_RUN(void);#endif

key.c中的代码

#include "stm32f10x.h"
#include "key.h"
#include "sys.h"
#include "delay.h"u8 KEY_jia_jian=195;//按键初始化函数
void KEY_Init(void) //IO初始化
{ GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA,PORTE时钟GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0|GPIO_Pin_7;//KEY0-KEY2GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOE2,3,4}//返回KEY_jia_jian按键加减数据u8 KEY_OUT(void)//
{if(KEY0==0){if(KEY_jia_jian<196){KEY_jia_jian++;return KEY_jia_jian;}if(KEY_jia_jian==196){KEY_jia_jian=175;return KEY_jia_jian;}}if(KEY1==0){if(KEY_jia_jian==174){KEY_jia_jian=195;return KEY_jia_jian;}if(KEY_jia_jian>174){KEY_jia_jian--;return KEY_jia_jian;}}return KEY_jia_jian;
}void TIM3_PWMSG90_RUN(void)
{u8 i;i=KEY_OUT();//设置一个变量来带提他TIM_SetCompare1(TIM3, i);TIM_SetCompare2(TIM3, i);   TIM_SetCompare3(TIM3, i);TIM_SetCompare4(TIM3, i);}void TIM4_PWMSG90_RUN(void)
{u8 i;i=KEY_OUT();//设置一个变量来带提他TIM_SetCompare1(TIM4, i);TIM_SetCompare2(TIM4, i);   TIM_SetCompare3(TIM4, i);TIM_SetCompare4(TIM4, i);}void TIM2_PWMSG90_RUN(void)
{u8 i;i=KEY_OUT();//设置一个变量来带提他TIM_SetCompare1(TIM2, i);TIM_SetCompare2(TIM2, i);   TIM_SetCompare3(TIM2, i);TIM_SetCompare4(TIM2, i);}

mian.c中的代码

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "SG90.H"
#include "key.h" int main(void){  delay_init();       //延时函数初始化     TIM3_PwmSG90_Init(1);//pwm函数初始化     //TIM4_PwmSG90_Init(0);//TIM2_PwmSG90_Init(1);KEY_Init();//按键初始化while(1){     TIM3_PWMSG90_RUN();// TIM3_PWMSG90_RUN();//TIM2_PWMSG90_RUN();delay_ms(500);}}

以后就是全部的代码了

源码下载地址

STM32F103C8T6驱动舵机SG90 配置定时器TIM2,TIM3,TIM4的多种重映射模式下的不同IO口相关推荐

  1. STM32F103C8T6驱动舵机SG90(5V)

    前言 本文是以STM32F103C8T6作为主控芯片,通过PA6端口输出PWM,实现控制0-90舵机控制. 引脚连接 主控 舵机 5V +5V GND GND PA6 PWM 提示 若是5V的舵机SG ...

  2. STM32f103,TIM1,TIM2,TIM3,TIM4,TIM5,TIM8,4路PWM输出配置(保姆级)

    没什么可说的,想说的都写在注释里了,重要的事情说三遍:看注释,看注释,看注释 定时器的.c文件: /************************************************** ...

  3. 驱动开发:配置Visual Studio驱动开发环境

    在正式开始驱动开发之前,需要自行搭建驱动开发的必要环境,首先我们需要安装Visual Studio 2013这款功能强大的程序开发工具,在课件内请双击ISO文件并运行内部的vs_ultimate.ex ...

  4. for根据ID去重_汽车ECU参数标定之配置Overlay RAM实现Qorivva MPC57xx系列MCU参数在线标定和代码重映射原理和方法详解...

    内容提要 引言 1. MPC5744P的Overlay RAM工作原理介绍 2 MPC5744P的Flash Overlay配置详解 2.1 平台Flash标定区域描述字寄存器配置字0--PFLASH ...

  5. STM32定时器配置(TIM1、TIM2、TIM3、TIM4、TIM5、TIM8)高级定时器+普通定时器,定时计数模式下总结

    STM32定时器配置(TIM1.TIM2.TIM3.TIM4.TIM5.TIM8)高级定时器+普通定时器,定时计数模式下总结 文章结构: --> 一.定时器基本介绍 --> 二.普通定时器 ...

  6. 利用定时器的输出比较功能产生PWM驱动舵机

    一.定时器基本原理 首先我们来看一下ST官方给出的关于定时器的相关介绍:(以STM32F103C8T6为例) STM32F103C8T6 含有 4 个 16 位定时器,分别是一个高级定时器 TIM1 ...

  7. STM32F103C8T6制作舵机测试仪详细图文教程 | 定时器触发ADC | DMA传输 | PWM输出 | RTC实时时钟 | USART串口输出 | OLED IIC显示

    自主学习STM32已有一周,先实现一个小demo,算是给自己一个动力叭,有目标的学习收获会更多.虽然本科也修了嵌入式课程,但那种走马观花式的学习,最后真正得到的知识实在寥寥无几.个人理解,学习STM3 ...

  8. STM32CubeMX配置PWM驱动舵机

    STM32CUBEMX配置PWM,控制舵机 舵机 简介 舵机(Servo),由直流电机.减速齿轮组.传感器和控制电路组成的一套自动控制系统.其控制方式为PWM控制,通过调节控制信号的占空比来实现舵机转 ...

  9. 从头开始写STM32F103C8T6驱动库(二)——编写系统初始化程序,配置时钟树

    系列文章目录 Github开源地址 从头开始写STM32F103C8T6驱动库(一)--STM32CubeMX创建并调整工程结构 从头开始写STM32F103C8T6驱动库(二)--编写系统初始化程序 ...

最新文章

  1. 用Piranha来实现WEB的负载均衡
  2. MySQL基础篇:SELECT几种子句
  3. 电脑编程python老是出现错误_python常见的编程错误
  4. JavaScript基础09-day11【原型对象、toString()、垃圾回收、数组、数组字面量、数组方法】
  5. MySQL时间戳(毫秒/秒)与日期格式的相互转换
  6. 应该怎么学python_什么样的人适合学Python,应该怎么学?
  7. js 正则是否包含某些字符串_我从Vue源码中学到的一些JS编程技巧
  8. nginx重新安装 引起的问题
  9. android界面的滑动切换功能
  10. Oracle回退不小心drop掉得表
  11. 51单片机c语言教程温度计,单片机课程设计-数字温度计.doc
  12. Bailian2810 完美立方【暴力】(POJ NOI0201-1812)
  13. python:for循环修改list的值,应使用range
  14. 【算法学习笔记】18:树与图的DFS与BFS
  15. 1324. Print Words Vertically**
  16. win10 小娜搜索失灵
  17. 树突状细胞(DC细胞)特征及应用进展综述
  18. vnc报错 PID file /home/root/.vnc/localhost.pid not readable after start.
  19. 百分点大数据技术团队:Cesium技术在智慧应急行业的应用
  20. Java的Scanner对象

热门文章

  1. Gerber 文件的生成
  2. 单片机实验报告太原理工大学_2011级应用物理专业单片机原理及应用课程设计答辩会...
  3. css 自定义长度间距虚线
  4. 齐枭飞 vue--vuex详解
  5. Java将多个文件打成一个压缩包
  6. Android merge
  7. wkhtmltopdf分页带来的问题
  8. 阿里巴巴2018校园招聘运筹优化算法工程师编程题
  9. perl数组以及qw
  10. 在教育培训行业如何获得精准名单?大数据精准获客