前言
##最近接触了STM32的F0系列,感觉042这个芯片性价比还可以,但是在使用过程中发现M0的内核配置与M3、M4的配置还是有一定差别的,在这里将我使用定时器的经验作为大家的参考,希望能够帮助大家,同时也给自己做一下笔记。
##本文采用STM32F042F6P6芯片,我将定时器3(TIM3)配置为输入捕获模式:
1.使用PA6作为输入I/O;
2.设定计数器自动重装值0xFFFF(1us);
3.预分频值48-1;
4.初始上升沿捕获;
5.PA6为通道1,所以映射通道1(TIM_Channel_1);
代码部分
下面代码就一起列出来了,都有注释的:
/*
定时器3输入捕获初始化
*/
void TIM3_Cap_Init(u16 arr,u16 psc)
{
TIM_ICInitTypeDef TIM3_ICInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //GPIOA开启时钟,使用的是RCC_AHBPeriphClockCmd
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //开启TIM3时钟,使用RCC_APB1PeriphClockCmd
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //PA6
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用模式,这是个坑
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_6); //PA6 初始置位
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_1); //使用复位模式1,就是TIM3的输入I/O了
TIM_TimeBaseStructure.TIM_Period = arr; //自动重装值0xFFFF(1us)
TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频值48-1
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //
TIM3_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01通道1
TIM3_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿
TIM3_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //
TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //
TIM3_ICInitStructure.TIM_ICFilter = 0x00;//
TIM_ICInit(TIM3, &TIM3_ICInitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_ITConfig(TIM3,TIM_IT_CC1,ENABLE);//开启中断,我只开了捕获中断
TIM_Cmd(TIM3,ENABLE ); //使能
}
##结束