一、GPIO相关
1、GPIO初始化结构体
结构体的声明
GPIO_InitTypeDef GPIO_InitStructure;
(1) GPIO_Pin
初始化IO口的编号
(2) GPIO_Mode
typedef enum
{
GPIO_Mode_IN = 0x00, /*!< GPIO Input Mode ;输入模式 */
GPIO_Mode_OUT = 0x01, /*!< GPIO Output Mode;输出模式 */
GPIO_Mode_AF = 0x02, /*!< GPIO Alternate function Mode;复用功能模式 */
GPIO_Mode_AN = 0x03 /*!< GPIO Analog Mode;模拟输入模式 */
}GPIOMode_TypeDef;
(3) GPIO_PuPd
IO口上下拉设置
typedef enum
{
GPIO_PuPd_NOPULL = 0x00,//不使用上下拉
GPIO_PuPd_UP = 0x01,//上拉
GPIO_PuPd_DOWN = 0x02//下拉
}GPIOPuPd_TypeDef;
(4) GPIO_OType
IO输出类型设置
typedef enum
{
GPIO_OType_PP = 0x00,//推挽输出
GPIO_OType_OD = 0x01//开漏输出
}GPIOOType_TypeDef;
(5) GPIO_Speed
typedef enum
{
GPIO_Low_Speed = 0x00, /*!< Low speed */
GPIO_Medium_Speed = 0x01, /*!< Medium speed */
GPIO_Fast_Speed = 0x02, /*!< Fast speed */
GPIO_High_Speed = 0x03 /*!< High speed */
}GPIOSpeed_TypeDef;
/* Add legacy definition */
#define GPIO_Speed_2MHz GPIO_Low_Speed
#define GPIO_Speed_25MHz GPIO_Medium_Speed
#define GPIO_Speed_50MHz GPIO_Fast_Speed
#define GPIO_Speed_100MHz GPIO_High_Speed
2. 相关函数
(1) GPIO_SetBits&GPIO_ResetBits
//eg:
GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);//置1
GPIO_ResetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);//置0,可同时指定多个IO口
(2) 读取IO端口输入状态
可使用以下两种任意一种等同
GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)
(GPIOA->IDR & GPIO_Pin_1)
二、定时器及PWM输出
1.定时器配置步骤
以TIM13为例
(1)TIM13时钟使能
定时器时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM13,ENABLE); //TIM13时钟使能
此外进行IO口时钟使能
(2)IO口映射复用为定时器
GPIO_PinAFConfig(GPIOF,GPIO_PinSource8,GPIO_AF_TIM13); //GPIOF8复用为定时器13
(3)初始化定时器参数
定义定时器初始化参数结构体指针
typedef struct
{
uint16_t TIM_Prescaler;//分频系数
uint16_t TIM_CounterMode; //设置计数方式,向上计数TIM_CounterMode_Up和向下TIM_CounterMode_Down
uint32_t TIM_Period; //设置自动重载计数周期值
uint16_t TIM_ClockDivision; //设置时钟分频因子
uint8_t TIM_RepetitionCounter;
} TIM_TimeBaseInitTypeDef;
初始化函数
TIM_TimeBaseInit(TIM13,&TIM_TimeBaseStructure);//初始化定时器13
定时器的频率计算公式
f
=
f
c
l
k
(
a
r
r
+
1
)
∗
(
p
s
c
+
1
)
f=\frac{f_{clk}}{(arr+1)*(psc+1)}
f=(arr+1)∗(psc+1)fclk
其中
T
c
l
k
T_{clk}
Tclk为TIM13的输入时钟频率(MHz),
a
r
r
arr
arr为TIM_Period对应值,
p
s
c
psc
psc为TIM_Prescaler对应值。APB1的时钟分频数为1时,TIM2 ~ TIM7、TIM12 ~ TIM14的时钟频率等于APB1的时钟频率;不为1时,则为APB1的两倍,即84MHz。
此外进行IO口的初始化。
(4)设置PWM模式,使能输出
typedef struct
{
uint16_t TIM_OCMode;//
uint16_t TIM_OutputState;//设置比较输出使能
uint16_t TIM_OutputNState; /*TIM_OCMode_PWM1:向上计数时,CNT<CCRX时为有效电平,
否则为无效电平;向下计数时,CNT>CCRX时为有效电平,否则
为无效电平。
TIM_OCMode_PWM2:与上面相反*/
uint16_t TIM_Pulse;
uint16_t TIM_OCPolarity;/*TIM_OCPolarity_High:高电平为有效电平
TIM_OCPolarity_Low:低电平为有效电平*/
uint16_t TIM_OCNPolarity;
uint16_t TIM_OCIdleState;
uint16_t TIM_OCNIdleState;
} TIM_OCInitTypeDef;
初始化函数
TIM_OC1Init(TIM13, &TIM_OCInitStructure);
CCRX和ARR预装载的使能和失能。
使能和失能的区别就是:使能的时候这两个局存期的读写需要等待有更新事件发生时才能被改变(比如计数溢出就是更新时间)。失能的时候可以直接进行读写而没有延迟。
TIM_OC1PreloadConfig(TIM13, TIM_OCPreload_Enable); //使能TIM13在CCR1上的预装载寄存器
TIM_ARRPreloadConfig(TIM13,ENABLE);//ARPE使能
(5)使能TIM
TIM_Cmd(TIM13, ENABLE);
(6)修改CCR控制占空比
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint32_t Compare2);
2.完整代码
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM13,ENABLE); //TIM13时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //使能PORTF时钟
GPIO_PinAFConfig(GPIOF,GPIO_PinSource8,GPIO_AF_TIM13); //GPIOF8复用为定时器13
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //GPIOF8
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化PB6
TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM13,&TIM_TimeBaseStructure);//初始化定时器13
//初始化TIM4 Channel1 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC1Init(TIM13, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM13OC1
TIM_OC1PreloadConfig(TIM13, TIM_OCPreload_Enable); //使能TIM13在CCR1上的预装载寄存器
TIM_ARRPreloadConfig(TIM13,ENABLE);//ARPE使能
TIM_Cmd(TIM13, ENABLE); //使能TIM13
3. 其他
查看TIMX通道1当前CCR值
uint32_t TIM_GetCapture1(TIM_TypeDef* TIMx);