历史上的今天
返回首页

历史上的今天

今天是:2025年01月13日(星期一)

正在发生

2020年01月13日 | STM8S003F3使用总结——定时器

2020-01-13 来源:eefocus

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,这里总结三种方法。


基于IAR

点击顶部菜单栏ST-LINK–>Option Bytes…

在这里插入图片描述

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

在这里插入图片描述

基于STVP

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

在这里插入图片描述

基于程序代码

选项字节在片内地址如下:

在这里插入图片描述在这里插入图片描述

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


#define OPTION_BYTES_ADDR  0x4803


void 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);

}

}


推荐阅读

史海拾趣

China Semiconductor Corp公司的发展小趣事

技术创新的同时,CSC也注重市场拓展和品牌建设。公司积极参与国际交流与合作,与多家国际知名企业建立了战略合作关系。同时,CSC加强了对国内市场的开拓,通过提供优质的产品和服务,赢得了客户的信赖和好评。随着品牌知名度的提升,CSC的产品逐渐在国内外市场上占据了一席之地。

High Energy Corp公司的发展小趣事

为了进一步提升竞争力,CSC开始着手进行产业链整合。公司通过与上下游企业的深度合作,形成了紧密的产业链协同关系。这不仅降低了生产成本,提高了生产效率,还使得CSC能够更好地把握市场动态和技术趋势,为公司的持续发展提供了有力保障。

A/D Electronics Inc公司的发展小趣事

A/D Electronics Inc在创立初期,以其卓越的技术研发团队在模拟到数字转换器(ADC)领域取得了重大突破。公司研发出一款高精度、低噪声的ADC芯片,这一创新产品迅速在市场中获得认可,为公司的初步发展奠定了坚实基础。随着技术的不断迭代,A/D Electronics Inc陆续推出了一系列高性能的电子产品,满足了市场对于高效、稳定电子元件的日益增长需求。

Boyd Corporation公司的发展小趣事

Boyd Corporation自创立之初,便致力于研发创新的热管理和环境密封解决方案。公司不断投入研发资源,推出了一系列高效、可靠的产品,这些产品在电子行业中迅速获得了广泛应用。通过持续创新,Boyd Corporation逐渐在市场中树立了技术领先的形象,吸引了众多合作伙伴和客户的关注。

敦泰(FOCALTECH)公司的发展小趣事
这可能是显示屏的电路故障,如显示屏损坏、显示屏与主板连接线松动或主板上控制显示屏的电路出现问题。可以尝试重新插拔连接线,如果问题依旧,可能需要更换显示屏或检修主板。
ADTech公司的发展小趣事

AdTech公司在成立之初,以其完整的传统半导体器件工艺在通信、激光医疗和激光防卫领域获得了广泛认可。然而,随着技术的不断进步和市场的变化,公司管理层意识到需要转型以维持竞争优势。2008年,经过三年的技术储备,AdTech决定将原有的光电探测器业务剥离,转而专注于量子级联激光器(QCL)的研发和生产。这一决策使公司能够专注于前沿技术,逐渐在QCL领域建立了领先地位,成为美国各大QCL激光设备的核心供应商。

问答坊 | AI 解惑

EVC读取串口的简单问题

本人现在有一个“英创EM9260”套件,想在上面做一个简单的串口程序,实现给一个电度表发送字符串并接收其返回的字符串,然后通过一个lcd屏幕显示返回的字符串。我把套件提供的一个串口通信的示例程序做了简单的修改,但是只能实现发送数据,回收的 ...…

查看全部问答>

关于uboot地址重定位

新手学习uboot,对于地址重定位的问题始终没有搞明白,请高手指点 Q1:start.s最初是在0x0000开始的地址处开始执行,中间有个过程是把自己以及uboot的其他代码搬移到0x3ff8 0000的位置,可是程序是怎么跳转到0x3ff8000处(或者所在的ram中)运行 ...…

查看全部问答>

cw7805资料一直没找到

找到的都是LM7805什么的,请提供…

查看全部问答>

st啥时候出带usbhost接口的哦

                                  …

查看全部问答>

【晒经典】ISD4004语言录放模块

本帖最后由 dontium 于 2015-1-23 13:10 编辑 模块的核心是ISD4004语音芯片,其引脚如图5所示。ISD4004语音芯片采用CMOS技术,内含晶体振荡器、防混叠滤波器、平滑滤波器、自动静噪、音频功率放大器及高密度多电平闪烁存储阵列等,因此只需很 ...…

查看全部问答>

和用户一起品尝“梨子”滋味

—体验式销售与LED智能灯具推广 《实践论》在论及亲身实践对认识真理的重要性时说道:你要知道梨子的滋味,就得亲口尝一尝。LED智能灯具的推广实践,充分证明了这条至理名言。 这是因为,LED光源作为新一代节能高效光源的代表,智能灯具作为“ ...…

查看全部问答>

Ccs5在调试官方ADC12的例程的时候报错

//******************************************************************************//  MSP-FET430P140 Demo - ADC12, Sample A0, Set P1.0 if A0 > 0.5*AVcc////  Description: A single sample is made on A0 with reference to AV ...…

查看全部问答>

msp430f169 定时器不准,求解决啊!

我想用定时器A实现 :当串口发送了配置参数后对定时器A,B进行初始化,配置参数包含定时器定时的值 ,初始化程序如下//*******************************************************/ //******************定时器A初始化************************/ // ...…

查看全部问答>

Getting Started with the Stellaris LaunchPad- Chapter 2

$(\'flv_bWH\').innerHTML=(AC_FL_RunContent(\'width\', \'600\', \'height\', \'475\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', \'http://www.tudou.com/v/u_Cpj2_hoYk/&rpid=106547959&resourceId=1065 ...…

查看全部问答>