不用hal库 stm32定时器代码
时间: 2024-08-14 20:00:20 浏览: 51
STM32-LED-呼吸灯-HAL库-定时器实现
在STM32微控制器上,如果你不想使用 HAL 库来操作定时器,你可以直接通过 C 语言的库函数来编写定时器驱动程序。这里是一个基本的例子,展示如何初始化 TIM1 定时器并设置计数模式:
```c
#include "stm32f10x.h" // 使用STM32官方库
// 定义定时器寄存器地址
#define GPIOA_PCR1 0x40021800
#define TIM1_CR1 0x40010C0C
#define TIM1_ARR 0x40010C14
#define TIM1_CCR1 0x40010C08
voidTIM1_Config(uint16_t prescaler, uint8_t timerMode) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB1Periph_TIM1, ENABLE); // 启动GPIOA和TIM1时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // 设置GPIOA的PA5为TIM1的时钟输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_TIM1); // 将PA5映射到TIM1通道1
TIM_TimeBaseInitTypeDef.TIM_TimeBaseStructure; // 初始化定时器结构体
TIM_TimeBaseInitTypeDef.TIM_Period = (uint16_t)(SystemCoreClock / 1000 - 1) * prescaler; // 计算定时周期
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); // 初始化定时器时间基
TIM_SelectOutputTrigger(TIM1, TIM_TRGO_Update); // 设置触发事件为溢出更新
TIM_Cmd(TIM1, ENABLE); // 开启定时器
if(timerMode == TIM管理模式单拍){
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); // 开启溢出中断
} else if(timerMode == TIM管理模式连续计数){
TIM_TimeBaseInit(TIM1, NULL); // 清空时间基配置
TIM_ClockDivisionConfig(TIM1, TIM_CKD_DIV1); // 分频系数设为1
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); // 预装载使能
TIM_ARRPreloadConfig(TIM1, TIM_ARRPreload_Enable); // 定时器预装载使能
}
}
阅读全文