STM8S003F3有三个定时器,分别为16位高级定时器TIM1、16位通用定时器TIM2和8位基础定时器TIM4。其中,TIM1和TIM2支持PWM输出,本项目中用到了TIM1-CH1和TIM2-CH1两个通道作为PWM输出,以及TIM4作为时基,下面进入正文。

编译环境:IAR for STM8 3.10.2
库版本:V2.2.0

1.定时器

关于定时器没什么好说的,直接看下配置代码

void TIM1_Init(u16 psc, u16 arr, u16 duty)
{TIM1_TimeBaseInit(psc, TIM1_COUNTERMODE_UP,  arr, 0); TIM1_OC1Init(TIM1_OCMODE_PWM1,        \ TIM1_OUTPUTSTATE_ENABLE, \TIM1_OUTPUTNSTATE_ENABLE,\duty,                      \                 TIM1_OCPOLARITY_LOW,     \TIM1_OCNPOLARITY_HIGH,   \TIM1_OCIDLESTATE_SET,    \TIM1_OCNIDLESTATE_RESET); TIM1_CCxCmd(TIM1_CHANNEL_1, ENABLE); TIM1_OC1PreloadConfig(ENABLE);TIM1_CtrlPWMOutputs(ENABLE);TIM1_Cmd(ENABLE);
}
void TIM2_Init(TIM2_Prescaler_TypeDef TIM2_Prescaler, u16 arr, u16 duty)
{TIM2_TimeBaseInit(TIM2_Prescaler, arr); TIM2_OC1Init(TIM2_OCMODE_PWM1,       \TIM2_OUTPUTSTATE_ENABLE,\duty,                    \TIM2_OCPOLARITY_HIGH);  \TIM2_OC1PreloadConfig(ENABLE);TIM2_Cmd(ENABLE);
}
其中TIM2_Prescaler_TypeDef定义为:
typedef enum
{TIM2_PRESCALER_1     = ((uint8_t)0x00),TIM2_PRESCALER_2     = ((uint8_t)0x01),TIM2_PRESCALER_4     = ((uint8_t)0x02),TIM2_PRESCALER_8     = ((uint8_t)0x03),TIM2_PRESCALER_16    = ((uint8_t)0x04),TIM2_PRESCALER_32    = ((uint8_t)0x05),TIM2_PRESCALER_64    = ((uint8_t)0x06),TIM2_PRESCALER_128   = ((uint8_t)0x07),TIM2_PRESCALER_256   = ((uint8_t)0x08),TIM2_PRESCALER_512   = ((uint8_t)0x09),TIM2_PRESCALER_1024  = ((uint8_t)0x0A),TIM2_PRESCALER_2048  = ((uint8_t)0x0B),TIM2_PRESCALER_4096  = ((uint8_t)0x0C),TIM2_PRESCALER_8192  = ((uint8_t)0x0D),TIM2_PRESCALER_16384 = ((uint8_t)0x0E),TIM2_PRESCALER_32768 = ((uint8_t)0x0F)
}TIM2_Prescaler_TypeDef;
void TIM4_Init(TIM4_Prescaler_TypeDef TIM4_Prescaler, u8 arr)
{TIM4_DeInit();TIM4_TimeBaseInit(TIM4_Prescaler, arr);TIM4_ClearFlag(TIM4_FLAG_UPDATE);TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);TIM4_Cmd(ENABLE);
}
其中TIM4_Prescaler_TypeDef定义为:
typedef enum
{TIM4_PRESCALER_1     = ((uint8_t)0x00),TIM4_PRESCALER_2     = ((uint8_t)0x01),TIM4_PRESCALER_4     = ((uint8_t)0x02),TIM4_PRESCALER_8     = ((uint8_t)0x03),TIM4_PRESCALER_16    = ((uint8_t)0x04),TIM4_PRESCALER_32    = ((uint8_t)0x05),TIM4_PRESCALER_64    = ((uint8_t)0x06),TIM4_PRESCALER_128   = ((uint8_t)0x07)
} TIM4_Prescaler_TypeDef;

高级定时器之所以高级是有原因的,更多的参数使功能更强大,当然这也不是绝对的,在项目开发中,有时候逻辑简化能使参数归一,但是并不影响实际功能。这里的参数一个是开放给开发者,一个是用户,并没有太大可比性,只是说明一种观点。

PWM1和PWM2两种模式的区别
TIM_OCMode_PWM1:

  • 当计时器值小于比较器设定值时则TIMX输出脚此时输出有效高电位。
  • 当计时器值大于或等于比较器设定值时则TIMX输出脚此时输出低电位。

TIM_OCMode_PWM2:

  • 当计时器值小于比较器设定值时则TIMX输出脚此时输出有效低电位。
  • 当计时器值大于或等于比较器设定值时则TIMX输出脚此时输出高电位。

------------------------------------------------------------我是分隔线-----------------------------------------------------------------

下面划重点
下面划重点
下面划重点

当一切准备就绪后,却发现PWM怎么都无法输出,折腾了好久,后来只好回归手册,在引脚说明表中对引脚说明如下:

很明显,这两个IO要作为PWM输出需要复用,但是复用方法很特殊,需要修改对应option bit,这里需要修改AFR0位才能输出PWM。那么现在的问题就是如何配置AFR0这个位了。

2.Option-Bytes配置

网上查找了相关问题后,这里做一下总结。
AFR0等选项组成Option-Bytes,那么如何配置Option-Bytes,这里总结三种方法。

  1. 基于IAR
    点击顶部菜单栏ST-LINK–>Option Bytes…

    打开Option Bytes选项框,右键置位Alternate Active

  2. 基于STVP
    如图所示,点击底部切换到OPTION BYTE界面,选择对应配置字即可。

  3. 基于程序代码
    选项字节在片内地址如下:

    从表中可见,需要将OPT2的最低位AFR0置1,代码如下:

#define OPTION_BYTES_ADDR  0x4803void Set_OptionByte(void)
{u16 Option_Bytes;Option_Bytes = FLASH_ReadOptionByte(OPTION_BYTES_ADDR);if(Option_Bytes & 0x01 == 0){FLASH_ProgramOptionByte(OPTION_BYTES_ADDR, (u8)Option_Bytes | 0x01);}
}

STM8S003F3使用总结——定时器相关推荐

  1. STM8S003F3 使用定时器来计算方波周期的方法

    我们的需求是stm8做从机,然后使用一根线接收方波,来实现不同的功能,比如亮红灯,亮黄灯,打开蜂鸣器等等等等. 那么问题来了,之前我尝试着通过一次发送多少个方波来实现不同的功能,但是到最后我发现这个方 ...

  2. 基于STM8S003f3的单键触摸开关制作

    提示:设计资料在文章末尾有链接下载 功能需求: 1. 单按触摸按键关闭/开启连接的用电器电源 2. 双击触摸按键延时5分钟关闭连接的用电器电源 需求分析: 控制部分:单片机--要求引脚少,因为需要使用 ...

  3. STM8S003F3通过PWM波实现三基色呼吸灯

    前段时间使用STM8S003F3实现了一个三基色灯的各种效果,故写一篇文章作为一个记录. 1 综述 我们知道,要是的LED灯亮直接通电即可.而要改变灯的亮度,我们有两种方法:改变电流和PWM调光. 我 ...

  4. 一文吃透JAVA定时器格式

    JAVA 定时器时间格式 ​ 基本格式: [秒]  [分]  [小时]  [日]  [月]  [周]   [年] 序号 说明 是否必填 允许填写的值 允许使用的通配符 1 秒 是 0-59 ,   - ...

  5. Timer定时器开发

    Timer定时器开发 定时器的作用是不占线程的等待一个确定时间,同样通过callback来通知定时器到期. 参考:https://github.com/sogou/workflow 定时器的创建 同样 ...

  6. linux定时器(crontab)实例

    linux实验示例----实现每2分钟将"/etc"下面的文件打包存储到"/usr/lobal"目录下 ·Step1:编辑当前用户的crontab并保存 终端输 ...

  7. c语言程序设计分段定时器,单片机C语言编程定时器的几种表达方式

    原标题:单片机C语言编程定时器的几种表达方式 吴鉴鹰单片机开发板地址 店铺:[吴鉴鹰的小铺] 地址:[https://item.taobao.com/item.htm?_u=ukgdp5a7629&a ...

  8. linux 内核按键抖动,Tiny4412 Linux驱动之按键(定时器防抖动) | 技术部落

    按键抖动示意图 我们平常所用的按键为机械弹性开关,由于触点的弹性作用,按键在闭合时不会马上稳定的接通,而是有一段时间的抖动,在断开时也不会立即断开.抖动时间由按键的机械特性所决定,一般为5ms~10m ...

  9. mysql 定时器不能持续循环执行_定时器,不循环执行指定方法?如何解决?

    ⁽⁽ଘ你管我管你疯啊ଓ⁾⁾ 01-22 加粗 标红 插入代码 插入链接 插入图片 上传视频 请 登录 后发表内容 关闭 新增或编辑超链接 链接地址 关闭 插入视频 视频链接 messageScroll ...

  10. oracle定时器怎么开启,Oracle的定时器使用示例

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. --Oracle定时job --数据库执行此脚本时时,请确保只执行一次,否则会引发错误! ...

最新文章

  1. 独家 | 初学者的问题:在神经网络中应使用多少隐藏层/神经元?(附实例)
  2. MongoDB GridFS——本质上是将一个文件分割为大小为256KB的chunks 每个chunk里会放md5标识 取文件的时候会将这些chunks合并为一个整体返回...
  3. Backlog和冲刺结果以及产品Demo市场调研
  4. suffix tree
  5. 云舒网络译:Rancher1.0正式版公布
  6. java swing http请求_JavaWeb核心编程之(三.5)HTTP请求和接受表单数据
  7. 剖析亿级请求下的多级缓存
  8. Perl 6 真的太烦人了?
  9. Linux虚拟机连不上网克隆虚拟机网卡无法启动
  10. 哎呀!可能有弹出式窗口拦截器生成Gmail无法打开该网页。如果您使用弹出式窗口拦截器,请将其关闭以便打开窗口。...
  11. 通过共享文件夹来进行前后端独立开发
  12. 交通流理论学习(Introduciton)
  13. Nginx+Tomcat负载均衡--win7配置详解
  14. Arduino使用人体红外传感器
  15. android 窗口切换花屏,分享Android4平台二级页面滚动花屏问题的解决方案v1.0.0
  16. uniapp打包后高德地图定位失败解决
  17. Camera | 4.瑞芯微平台MIPI摄像头应用程序编写
  18. 大学生新生报到管理系统
  19. sql优化+索引优化+详解(存储过程+函数 创建千万的测试数据)
  20. 有用的博客整理(Android系统编译相关)

热门文章

  1. ssoj 2279 磁力阵
  2. 01.Mirth Connect源码编译
  3. 32G内存服务器如何设置虚拟内存,大内存服务器设置虚拟内存
  4. js 正则去前后空格且长度不大于20_js去除空格的正则用法
  5. Redis -- 数据库常用命令大全
  6. Inpaint破解版 - 图片去水印神器
  7. 视频翻译字幕的软件哪个好?看完你就知道了
  8. 千月最新影视APICLOUD完整安卓程序源码+UI非常不错
  9. 华为悦盒EC6018V9E线刷linux教程
  10. android 第三方键盘,6款Android平台第三方输入法横评