网上根本找不到用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();
// 此处可以根据新的音量值进行相应的操作
// 比如,调整音频输出的实际音量
}
}
|
OPTION BYTE 是芯片的选项字节,配置芯片功能的。
通常需要通过烧录器烧录的。(生产时)
软件是可以更改的,按照特定的方式,在手册里描述。
但是软件更改注意逻辑,和生效时间。所以最好在烧录器端先烧录进去。
上面是AI给的示例代码,我用的是STM8S103F,
EC11的编码器AB脚已经连接到PC6 tim1 ch1和PC7 tim1 ch2了
这两个脚做option的的配置或编程,否则默认功能就不是TIMER的通道脚。
在STM8S库函数里的tim.c里有现存的关于编码器的配置函数,你可以参照使用。
多谢回复,请教大师,上面代码中已经有如下配置函数做初始化了啊,请教还需要什么配置???
楼上说的是要额外的option byte 配置才能启用那两个引脚。
你可以参考一下数据手册上的引脚描述
多谢,大师我是新手,按您的指引我重新看了手册,如下表,我是不是直接用下面语句写EEPROM就可以?
EEPROM_WriteByte(0x4803, 0x01); //函数另外定义
或者,我用IAR,有没有直接更改EEPROM寄存器的方法?
多谢大师,终于搞定了~!👍 🎉️
STM8芯片 管脚复用配置 对于初次使用这容易遇到。搞定就好~!👍 🚀️