STM32 F1 高级定时器TIM8 脉冲计数 计数器1模式 CH1通道

#include "led.h"

#include "delay.h"

#include "sys.h"

#include "pwm.h"

TIM_ICInitTypeDef TIM8_ICInitStructure;

void TIM8_Cap_Init(u16 arr,u16 psc)

{

GPIO_InitTypeDef GPIO_InitStructuer;

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8,ENABLE); ///使能TIM8时钟

GPIO_InitStructuer.GPIO_Pin = GPIO_Pin_6;

GPIO_InitStructuer.GPIO_Mode = GPIO_Mode_IPD;//下拉输入

GPIO_InitStructuer.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOC, &GPIO_InitStructuer);

GPIO_InitStructuer.GPIO_Pin = GPIO_Pin_1;

GPIO_InitStructuer.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructuer.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructuer);

GPIO_ResetBits(GPIOA,GPIO_Pin_1); //PA.8 输出DI

//timer1 NVIC 配置 uint16_t TIM_Prescaler;

TIM_DeInit(TIM8);

TIM_TimeBaseInitStructure.TIM_Period = arr;//自动重装载值 uint16_t TIM_CounterMode;

TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //定时器分频

TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;

TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式 uint16_t TIM_Period;

TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//溢出多少次后进入中断

TIM_TimeBaseInit(TIM8,&TIM_TimeBaseInitStructure);//初始化TIM8

NVIC_InitStructure.NVIC_IRQChannel = TIM8_UP_IRQn; //uint16_t TIM_ClockDivision;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级2

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//子优先级2

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能 uint8_t TIM_RepetitionCounter;

NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

//TIM_ETRClockMode1Config(TIM8, TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted, 5);//5次采样滤波 外部时钟模式2

//TIM_SelectMasterSlaveMode(TIM8,TIM_MasterSlaveMode_Enable); //启动定时器的被动触发

TIM_ClearITPendingBit(TIM8,TIM_IT_Update); //清除中断标志位,避免第一次自动进入中断一次

TIM_TIxExternalClockConfig( TIM8, TIM_TIxExternalCLK1Source_TI1,TIM_ICPolarity_Rising, 0xF );

TIM8->CCMR1|=1;//CC1S[1:0]:捕获/比较1 选择。(Capture/Compare 1 selection) 位1:0 这2位定义通道的方向(输入/输出),及输入脚的选择: 00:CC1通道被配置为输出; 01:CC1通道被配置为输入,IC1映射在TI1上;

TIM8->SMCR|=0x07;//寄存器的SMS='111',选择定时器外部时钟模式1

TIM8->SMCR|=0x50;//置TIMx_SMCR寄存器中TS=101,选择TI1作为输入源。

TIM8->CCER|=1<<4;//中文资料坑人系列 捕获使能。

TIM8->CCER&=~(1<<5);//第6位置一0:不反相:捕获发生在IC1的上升沿;当用作外部触发器时,IC1不反相。

//TIM8->CR1|=1;

//TIM_ETRClockMode1Config

TIM_SetCounter(TIM8,0);//设置计数初值

TIM_ITConfig(TIM8,TIM_IT_Update,ENABLE);

TIM_Cmd(TIM8,ENABLE); //使能定时器1

}

u16 COUN1=0;

u16 COUN2=0;

u8 n,m=0,y=0;

int main(void)

{

delay_init(); //延时函数初始化

TIM8_Cap_Init(10-1,0); //10次一溢出 、外部计数(减一应该是重要的影响到数据准确度)

delay_ms(1000);//

while(1)

{

for(n=0;n<22;n++)//共有11次上升沿出现

{

delay_ms(1);

PAout(1)=~PAout(1);//端口翻转

}

while(1)//总数

{

COUN2=(COUN1*10)+(TIM8->CNT);

}

//COUN1=TIM8->CNT;

}

}

void TIM8_UP_IRQHandler(void)

{

if (TIM_GetITStatus(TIM8, TIM_IT_Update) != RESET)

{

COUN1++;

TIM_SetCounter(TIM8,0);//清除计数器

}

TIM_ClearITPendingBit(TIM8,TIM_IT_Update); //清除中断标志位

}

void TIM8_CC_IRQHandler(void)

{

if (TIM_GetITStatus(TIM8, TIM_IT_CC1) != RESET)//捕获1发生捕获事件捕获中断 是指定期捕获到你设定的边沿信号(上升沿/下降沿) 时产生的中断

{

COUN1=100;

COUN2=200;

while(1);

}

TIM_ClearITPendingBit(TIM8, TIM_IT_CC1);

}

相关推荐
LCMICRO-133108477462 小时前
长芯微LD9689完全P2P替代AD9689,是一款双通道、14位、2.0 GSPS/2.6 GSPS模数转换器(ADC)
网络·单片机·嵌入式硬件·网络协议·fpga开发·硬件工程·高速adc
逐步前行9 小时前
STM32_TIM_寄存器操作
stm32·单片机·嵌入式硬件
0南城逆流010 小时前
【STM32】知识点介绍七:PWM功能
stm32·单片机·嵌入式硬件
智者知已应修善业10 小时前
【51单片机独立按键控制数码管移动反向,2片74CH573/74CH273段和位,按键按下保持原状态】2023-3-25
经验分享·笔记·单片机·嵌入式硬件·算法·51单片机
dashizhi201510 小时前
服务器共享禁止保存到本地磁盘、共享文件禁止另存为本地磁盘、移动硬盘等
运维·网络·stm32·安全·电脑
我是一棵无人问荆的小草11 小时前
单片机通电后延迟启动策略
单片机·嵌入式硬件
坏柠11 小时前
ESP32-S3 蓝牙 BLE 从零到一:广播、服务、特征,用一个智能灯的例子全讲透
嵌入式硬件
日更嵌入式的打工仔11 小时前
UART RX为什么要上拉
单片机
三佛科技-1873661339714 小时前
FT32F030F6AP7高性能32位RISC内核MCU解析(兼容STM32F030K6TP7)
stm32·单片机·嵌入式硬件
LCMICRO-1331084774615 小时前
长芯微LDC90810完全P2P替代ADC128D818,是一款八通道系统监控器,专为监控复杂系统状态而设计。
stm32·单片机·嵌入式硬件·fpga开发·硬件工程·模数转换芯片adc