STM32F103C8T6 脉冲输出
官方例程的升级版,用板载LED引脚外的其他引脚输出递增的PWM脉冲。
本来是用407ZGT6做的,但ADC一时疏忽接到了6.6V然后烧了(心疼死了)踩了一些坑,给大家分享一下。
前言
三个步骤,
- 在手册中查找那些定时器支持PWM输出。
- 找到原理图引脚支持的复用功能有没有类似
TIMx_CHx
的字眼。 - 参照官方例程初始化定时器和引脚。
- 在主函数中进行初始化,设置预分频和重装载值。
- 在主函数中编写代码通过调节占空比实现引脚输出不同脉宽的PWM信号。
一、TIME_TEST_H.c
#include "Time_test.h"
///* TIM3中断优先级配置 */
void TIM3_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*中断周期为1ms*/
//void TIM2_Configuration(void)
//{
// TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
// TIM_DeInit(TIM2);
// TIM_TimeBaseStructure.TIM_Period=1000; //自动重装载寄存器周期的值(计数值)
// /* 累计 TIM_Period个频率后产生一个更新或者中断 */
// TIM_TimeBaseStructure.TIM_Prescaler= (72 - 1); //时钟预分频数 72M/72
// TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
// TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// TIM_ClearFlag(TIM2, TIM_FLAG_Update); // 清除溢出中断标志
// TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
// TIM_Cmd(TIM2, ENABLE); // 开启时钟
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , DISABLE); //先关闭等待使用
//}
//TIM3 PWM部分初始化
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM3_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射 TIM3_CH2->PB5
//设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形 GPIOB.5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_0| GPIO_Pin_1; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
//初始化TIM3
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TI