void OLED_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
// 启用 GPIOD 时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
// 配置 PD11~PD14 为推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOD, &GPIO_InitStructure);
// OLED 复位
OLED_RST_Clr();
delay_ms(100); // 延时 100ms
OLED_RST_Set();
// OLED 寄存器初始化
OLED_WR_Byte(0xAE, OLED_CMD); // 关闭显示
OLED_WR_Byte(0xD5, OLED_CMD); // 设置时钟分频
OLED_WR_Byte(80, OLED_CMD); // 推荐值:80
OLED_WR_Byte(0xA8, OLED_CMD); // 设置驱动路数
OLED_WR_Byte(0x3F, OLED_CMD); // 默认 1/64
OLED_WR_Byte(0xD3, OLED_CMD); // 设置显示偏移
OLED_WR_Byte(0x00, OLED_CMD); // 默认 0
OLED_WR_Byte(0x40, OLED_CMD); // 设置起始行
OLED_WR_Byte(0x8D, OLED_CMD); // 充电泵
OLED_WR_Byte(0x14, OLED_CMD); // 开启充电泵
OLED_WR_Byte(0x20, OLED_CMD); // 内存地址模式
OLED_WR_Byte(0x02, OLED_CMD); // 页地址模式
OLED_WR_Byte(0xA1, OLED_CMD); // 段重定义
OLED_WR_Byte(0xC0, OLED_CMD); // COM 扫描方向
OLED_WR_Byte(0xDA, OLED_CMD); // COM 硬件配置
OLED_WR_Byte(0x12, OLED_CMD); // 默认配置
OLED_WR_Byte(0x81, OLED_CMD); // 对比度设置
OLED_WR_Byte(0xEF, OLED_CMD); // 默认值(可调整)
OLED_WR_Byte(0xD9, OLED_CMD); // 预充电周期
OLED_WR_Byte(0xF1, OLED_CMD); // 默认值
OLED_WR_Byte(0xDB, OLED_CMD); // VCOMH 电压
OLED_WR_Byte(0x30, OLED_CMD); // 默认值
OLED_WR_Byte(0xA4, OLED_CMD); // 全局显示开启
OLED_WR_Byte(0xA6, OLED_CMD); // 正常显示模式
OLED_WR_Byte(0xAF, OLED_CMD); // 开启显示
OLED_Clear(); // 清屏
}void TIM6_Init(void) {
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
TIM_TimeBaseInitTypeDef timer = {0};
timer.TIM_Prescaler = SystemCoreClock / 1000000 - 1; // 1μs分辨率
timer.TIM_Period = 0xFFFFFFFF; // 最大计数值
timer.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM6, &timer);
TIM_Cmd(TIM6, ENABLE);
}
uint32_t Get_TIM6_Count(void) {
return TIM6->CNT;
}
float Get_Encoder_Speed(uint8_t timer_id) {
// 1. 获取当前计数和时间戳
int32_t current_count = Read_Encoder(timer_id);
uint32_t now = Get_System_Time_us();
uint8_t idx = timer_id - 2; // 转换为数组索引(TIM2→0, TIM3→1)
// 2. 计算时间差(秒)
uint32_t delta_time = now - last_time[idx];
float dt = delta_time / 1000000.0f; // 转换为秒
if (dt <= 0) dt = 1e-6f; // 避免除零
// 3. 计算速度(计数/秒)
float speed = (current_count - last_count[idx]) / dt;
// 4. 更新历史值
last_count[idx] = current_count;
last_time[idx] = now;
return speed;
}void TIM1_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); //TIM8ʱדʹŜ
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); //ʹŜPORTCʱד
GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_TIM1);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_TIM1);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_TIM1);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_TIM1);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_11|GPIO_Pin_13|GPIO_Pin_14; //GPIO
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //شԃ٦Ŝ
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //̙100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //ΆάشԃˤԶ
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //ʏ-
GPIO_Init(GPIOE,&GPIO_InitStructure); //ԵʼۯPCࠚ
//Sets the value of the auto-reload register cycle for the next update event load activity
//ʨ׃՚Ђһٶټт˂ݾװɫܮ֯քؔ֯טװ݄զǷלǚքֵ
TIM_TimeBaseStructure.TIM_Period = arr;
//Sets the pre-divider value used as the TIMX clock frequency divisor
//ʨ׃ԃ4طΪTIMxʱדƵÊԽ˽քԤؖƵֵ
TIM_TimeBaseStructure.TIM_Prescaler =psc;
//Set the clock split :TDTS = Tck_tim
//ʨ׃ʱדؖٮ:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_ClockDivision = 1;
//Up counting mode
//вʏ݆˽ģʽ
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//Initializes the timebase unit for TIMX based on the parameter specified in TIM_TIMEBASEINITSTRUCT
//ٹߝTIM_TimeBaseInitStructאָ֨քӎ˽ԵʼۯTIMxքʱݤܹ˽եλ
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
//Select Timer mode :TIM Pulse Width Modulation mode 1
//ѡձ֨ʱǷģʽ:TIMöԥַ࠭׆ģʽ1
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
//Compare output enablement
//҈ޏˤԶʹŜ
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//Output polarity :TIM output polarity is higher
//ˤԶܫє:TIMˤԶ҈ޏܫєٟ
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
//Initialize the peripheral TIMX based on the parameter specified in TIM_OCINITSTRUCT
//ٹߝTIM_OCInitStructאָ֨քӎ˽ԵʼۯʨTIMx
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_OC2Init(TIM1, &TIM_OCInitStructure);
TIM_OC3Init(TIM1, &TIM_OCInitStructure);
TIM_OC4Init(TIM1, &TIM_OCInitStructure);
// Advanced timer output must be enabled
//ٟܶ֨ʱǷˤԶҘѫʹŜ֢ߤ
TIM_CtrlPWMOutputs(TIM1,ENABLE);
//CH1 is pre-loaded and enabled
//CH1ԤװʹŜ
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);
// Enable the TIMX preloaded register on the ARR
//ʹŜTIMx՚ARRʏքԤװ݄զǷ
TIM_ARRPreloadConfig(TIM1, ENABLE);
//Enable TIM8
//ʹŜTIM8
TIM_Cmd(TIM1, ENABLE);
}
void TIM9_PWM_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM9,ENABLE);/*ʹŜ֨ʱǷ11ʱד*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);/*ʹŜGPIOFʱד*/
GPIO_PinAFConfig(GPIOE,GPIO_PinSource5,GPIO_AF_TIM9);/*شԃ*/
GPIO_PinAFConfig(GPIOE,GPIO_PinSource6,GPIO_AF_TIM9);/*شԃ*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6; //GPIOF9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //شԃ٦Ŝ
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //̙100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //ΆάشԃˤԶ
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //ʏ-
GPIO_Init(GPIOE,&GPIO_InitStructure); //ԵʼۯPF9
TIM_TimeBaseInitStructure.TIM_Period = arr;/*ؔ֯טװ*/
TIM_TimeBaseInitStructure.TIM_Prescaler = psc;/*ԤؖƵ*/
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;/*ʱדؖƵ*/
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;/*вʏ݆˽*/
TIM_TimeBaseInit(TIM9,&TIM_TimeBaseInitStructure);/*Եʼۯ*/
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;/*PWMģʽ*/
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;/*ˤԶ*/
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;/*҈ޏܫєٟ*/
TIM_OC1Init(TIM9,&TIM_OCInitStructure);
TIM_OC2Init(TIM9,&TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM9,TIM_OCPreload_Enable);/*ˤԶ҈ޏԤװʹŜ*/
TIM_OC2PreloadConfig(TIM9,TIM_OCPreload_Enable);/*ˤԶ҈ޏԤװʹŜ*/
TIM_ARRPreloadConfig(TIM9,ENABLE);/*ؔ֯טԤװʹŜ*/
TIM_Cmd(TIM9,ENABLE);/*݆˽ʹŜ*/
}
void TIM10_PWM_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);/*ʹŜGPIOFʱד*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM10,ENABLE);/*ʹŜ֨ʱǷ11ʱד*/
GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_TIM10);/*شԃ*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;/*شԃ*/
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;/*ΆάˤԶ*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;/*PF7*/
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;/*ʏ-*/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;/**/
GPIO_Init(GPIOB,&GPIO_InitStructure);/*ԵʼۯIO*/
TIM_TimeBaseInitStructure.TIM_Period = arr;/*ؔ֯טװ*/
TIM_TimeBaseInitStructure.TIM_Prescaler = psc;/*ԤؖƵ*/
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;/*ʱדؖƵ*/
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;/*вʏ݆˽*/
TIM_TimeBaseInit(TIM10,&TIM_TimeBaseInitStructure);/*Եʼۯ*/
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;/*PWMģʽ*/
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;/*ˤԶ*/
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;/*҈ޏܫєٟ*/
TIM_OC1Init(TIM10,&TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM10,TIM_OCPreload_Enable);/*ˤԶ҈ޏԤװʹŜ*/
//TIM_CtrlPWMOutputs(TIM10,ENABLE);
TIM_ARRPreloadConfig(TIM10,ENABLE);/*ؔ֯טԤװʹŜ*/
TIM_Cmd(TIM10,ENABLE);/*݆˽ʹŜ*/
}
void TIM11_PWM_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);/*ʹŜGPIOFʱד*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM11,ENABLE);/*ʹŜ֨ʱǷ11ʱד*/
GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_TIM11);/*شԃ*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;/*شԃ*/
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;/*ΆάˤԶ*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;/*PF7*/
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;/*ʏ-*/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;/**/
GPIO_Init(GPIOB,&GPIO_InitStructure);/*ԵʼۯIO*/
TIM_TimeBaseInitStructure.TIM_Period = arr;/*ؔ֯טװ*/
TIM_TimeBaseInitStructure.TIM_Prescaler = psc;/*ԤؖƵ*/
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;/*ʱדؖƵ*/
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;/*вʏ݆˽*/
TIM_TimeBaseInit(TIM11,&TIM_TimeBaseInitStructure);/*Եʼۯ*/
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;/*PWMģʽ*/
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;/*ˤԶ*/
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;/*҈ޏܫєٟ*/
TIM_OC1Init(TIM11,&TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM11,TIM_OCPreload_Enable);/*ˤԶ҈ޏԤװʹŜ*/
TIM_CtrlPWMOutputs(TIM11,ENABLE);
TIM_ARRPreloadConfig(TIM11,ENABLE);/*ؔ֯טԤװʹŜ*/
TIM_Cmd(TIM11,ENABLE);/*݆˽ʹŜ*/
}
void TIM2_IRQHandler(void);
void TIM3_IRQHandler(void);
void TIM4_IRQHandler(void);
void TIM5_IRQHandler(void);这些代码的初始化有冲突吗