网上根本找不到用STM8S标准库写的TIM1编码器计数功能示例,,很是郁闷,没办法用chatgpt搞出如下代码,
但是TIM1_GetCounter()根本读不出计数,请教差在哪里??
硬件电路肯定没问题,用外部中断可以正常实现ec11选择功能
#include "stm8s.h"
#define MAX_VOLUME 100 // 定义最大音量值
#define MIN_VOLUME 0 // 定义最小音量值
volatile int16_t volume = 50; // 初始音量设为50
// 初始化TIM1作为编码器接口
void TIM1_Encoder_Init(void) {
// 1. 使能TIM1时钟
CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, ENABLE);
// 2. 配置GPIO引脚作为编码器输入
// 假设编码器的A、B信号连接到TIM1_CH1(PA7)和TIM1_CH2(PA6)
GPIO_Init(GPIOA, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT); // 配置PA6为浮空输入
GPIO_Init(GPIOA, GPIO_PIN_7, GPIO_MODE_IN_FL_NO_IT); // 配置PA7为浮空输入
// 3. 配置TIM1为编码器模式
TIM1_EncoderInterfaceConfig(
TIM1_ENCODERMODE_TI12, // 选择编码器模式,使用TI1和TI2
TIM1_ICPOLARITY_RISING, // TI1上升沿捕获
TIM1_ICPOLARITY_RISING // TI2上升沿捕获
);
// 4. 配置计数器方向为自动重载(上下计数模式)
TIM1_CounterModeConfig(TIM1_COUNTERMODE_UP);
TIM1_SetCounter(0); // 初始化计数器值为0
// 5. 启动定时器
TIM1_Cmd(ENABLE);
}
// 更新音量值,根据编码器的增量变化
void UpdateVolume(void) {
int16_t encoderValue = TIM1_GetCounter();
// 根据编码器的计数变化调整音量
if (encoderValue > 0) {
// 增加音量
volume += encoderValue;
if (volume > MAX_VOLUME) {
volume = MAX_VOLUME; // 限制音量在最大值
}
} else if (encoderValue < 0) {
// 减少音量
volume += encoderValue; // encoderValue为负数
if (volume < MIN_VOLUME) {
volume = MIN_VOLUME; // 限制音量在最小值
}
}
TIM1_SetCounter(0); // 重置计数器以便下次计算增量
}
int main(void) {
// 初始化系统时钟
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
// 初始化TIM1编码器
TIM1_Encoder_Init();
while (1) {
// 更新音量值
UpdateVolume();
// 此处可以根据新的音量值进行相应的操作
// 比如,调整音频输出的实际音量
}
} |