STM32F103C8外部中断加定时器测频率全部代码
时间: 2024-10-23 07:12:40 浏览: 29
STM32F103C8T6 Timer定时器用例
STM32F103C8单片机常常用于外设信号频率测量,通过结合外部中断和定时器可以实现高精度的计数。下面是一个基本的示例代码片段,它演示了如何配置EXTI(外部中断)和TIM2定时器来测量外部脉冲的频率。注意,这只是一个简化版本,实际应用中可能需要额外的错误处理和初始化步骤。
```c
#include "stm32f10x.h"
// EXTI 初始化
void EXTI_Init(void) {
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // 高电平触发
EXTI_InitStructure.EXTI_Line = EXTI_Pin_0; // 这里假设我们要测量的是PA0的信号
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_Init(&EXTI_InitStructure);
}
// TIM2 初始化
void TIM2_Init(void) {
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 启动TIM2时钟
TIM_TimeBaseInitTypeDef.TIM_InitStruct;
TIM_InitStruct.TIM_Prescaler = (SystemCoreClock / 4000) - 1; // 根据你的系统频率设置预分频
TIM_InitStruct.TIM_Period = 0xffff; // 设置定时器最大周期
TIM_InitStruct.TIM_ClockDivision = 0;
TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_InitStruct);
TIM_Cmd(TIM2, ENABLE); // 启动定时器
}
// EXTI 中断服务函数
void EXTI0_IRQHandler(void) {
if (EXTI_GetITStatus(EXTI_Line0) != RESET) { // 检查是否检测到外部事件
EXTI_ClearITPendingBit(EXTI_Line0); // 清除中断标志
TIM2->CNT++; // 当外部事件发生时,更新计数器
}
}
int main(void) {
// 省略主程序的其他初始化部分...
EXTI_Init();
TIM2_Init();
NVIC_EnableIRQ(EXTI0_IRQn); // 开启EXTI0中断
NVIC_EnableIRQ(TIM2_IRQn); // 开启TIM2中断
while (1) {
// 主循环... 如果有需要,可以在此检查TIM2计数器值以计算频率
}
}
```
阅读全文