你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM8S标准库TIM1编码器功能不计数,请大师帮我看看

[复制链接]
mchoi 提问时间:2024-8-11 22:04 / 已解决

网上根本找不到用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();

        // 此处可以根据新的音量值进行相应的操作
        // 比如,调整音频输出的实际音量
    }
}
收藏 评论8 发布时间:2024-8-11 22:04

举报

8个回答
butterflyspring 最优答案 回答时间:2024-8-12 17:23:47
mchoi 发表于 2024-8-12 17:10
[md]多谢,大师我是新手,按您的指引我重新看了手册,如下表,我是不是直接用下面语句写EEPROM就可以?

...

OPTION BYTE 是芯片的选项字节,配置芯片功能的。

通常需要通过烧录器烧录的。(生产时)

软件是可以更改的,按照特定的方式,在手册里描述。
但是软件更改注意逻辑,和生效时间。所以最好在烧录器端先烧录进去。

STM8S103 OPTIONBYTE PC5.PNG
mchoi 回答时间:2024-8-12 08:39:50

上面是AI给的示例代码,我用的是STM8S103F,

EC11的编码器AB脚已经连接到PC6 tim1 ch1和PC7 tim1 ch2了

xmshao 回答时间:2024-8-12 10:20:34
对于STM8S103来讲,PC6 PC7的确可以做TIM1的ch1 ch2,不过你必须特意针对


这两个脚做option的的配置或编程,否则默认功能就不是TIMER的通道脚。


在STM8S库函数里的tim.c里有现存的关于编码器的配置函数,你可以参照使用。
mchoi 回答时间:2024-8-12 11:30:31

xmshao 发表于 2024-8-12 10:20
对于STM8S103来讲,PC6 PC7的确可以做TIM1的ch1 ch2,不过你必须特意针对</p>
<p>

多谢回复,请教大师,上面代码中已经有如下配置函数做初始化了啊,请教还需要什么配置???

    // 3. 配置TIM1为编码器模式
    TIM1_EncoderInterfaceConfig(
        TIM1_ENCODERMODE_TI12,  // 选择编码器模式,使用TI1和TI2
        TIM1_ICPOLARITY_RISING, // TI1上升沿捕获
        TIM1_ICPOLARITY_RISING  // TI2上升沿捕获
    );
butterflyspring 回答时间:2024-8-12 11:41:58
mchoi 发表于 2024-8-12 11:30
[md]多谢回复,请教大师,上面代码中已经有如下配置函数做初始化了啊,请教还需要什么配置???

```

楼上说的是要额外的option byte 配置才能启用那两个引脚。

你可以参考一下数据手册上的引脚描述

STM8S103 OPTION BYTE FOR TIMER CH1.PNG
mchoi 回答时间:2024-8-12 17:10:41

butterflyspring 发表于 2024-8-12 11:41
楼上说的是要额外的option byte 配置才能启用那两个引脚。</p>
<p>你可以参考一下数据手册上的引脚描述

多谢,大师我是新手,按您的指引我重新看了手册,如下表,我是不是直接用下面语句写EEPROM就可以?

EEPROM_WriteByte(0x4803, 0x01); //函数另外定义

或者,我用IAR,有没有直接更改EEPROM寄存器的方法?

1.JPG

2.JPG

mchoi 回答时间:2024-8-12 20:10:16

butterflyspring 发表于 2024-8-12 17:23
OPTION BYTE 是芯片的选项字节,配置芯片功能的。</p>
<p>通常需要通过烧录器烧录的。(生产时)

多谢大师,终于搞定了~!👍 🎉️

xmshao 回答时间:2024-8-13 14:27:30

mchoi 发表于 2024-8-12 20:10
多谢大师,终于搞定了~!👍  🎉️

STM8芯片 管脚复用配置 对于初次使用这容易遇到。搞定就好~!👍 🚀️

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版