如何用STM8输出最高频率200HZ最低3HZ的方波

如何用STM8输出最高频率200HZ最低3HZ的方波,第1张

兄弟,你的命题没表达得很清楚啊,难怪没人能帮你。(一个高电平输出2000个脉冲再一个高电平?)

其实STM8里的计数器就可以实现PWM输出,不过你可能要设置分频系数。不过用PWM的方式来输出3Hz~200Hz的方波可能有点牵强,你可以用计数器计数,当输出脉冲的个数达到要求时再改变输出引脚的电平。
3Hz,1000/3≈333ms,也就是说,大约每333ms就要改变一次引脚电平。

一点个人建议,希望对你有帮助。

1选项字节的概念(参考stm8s中文数据手册):

         选项字节包括芯片硬件特性的配置和存储器的保护信息,这些字节保存在存储器中一个专用的
块内。除了ROP(读出保护)字节,每个选项字节必须被保存两次,一个是通常的格式(OPTx)和
一个用来备份的互补格式(NOPTx)。可以在ICP模式(通过SWIM)下访问下表中EEPROM的地址来修改选项字节。
选项字节也可以通过应用程序在IAP模式下修改,但是ROP选项只能在ICP模式(通过SWIM)下被
修改。

2ISP IAP ICP的概念(有待学习):

ISP:In System Programing,      在系统编程   程序完全下载

IAP:In applicating Programing,在应用编程   我的理解是用应用程序去修改芯片里边固定的一些数据(与应用编程无关的数据)

ICP:In Circuit Programing,        在电路编程

3stm8s芯片的备用功能重映射:

     stm8s芯片上带有很多备用的功能,这些功能必须使用重映射功能才能实现,

     重映射其实就是配置某个flash地址的某一位,使某个引脚具备备用功能或者默认功能的其中一个

     而且一旦功能改,想恢复原来的功能必须重新写入。

   

     比如stm8s的PD4端口具有TIM2_CH1 功能和BEEP功能,默认的情况下是TIM2_CH1功能,

     当我们要用到BEEP功能时必须写选项字,将这个引脚重映射为BEEP功能。

4库函数实现重映射

//对于stm8s的选项字地址为0x4803
#define Beep_OptionAdd  0x4803
   void Set_Beep_OptionByte(void)
   {
    uint16_t Beep_Option_status;/记录激活备选功能Beep/TIM2_CH1的状态/
    Beep_Option_status=FLASH_ReadOptionByte(Beep_OptionAdd);
    /Beep_Option_status的最高位为1激活了Beep,否则不激活,为TIM2_CH1/
     if((Beep_Option_status&0x8000))
     {
      FLASH_ProgramOptionByte(Beep_OptionAdd, (uint8_t)(Beep_Option_status&0x7fff));
    /向Beep_OptionAdd  0x4803 置0,不激活激活了Beep,恢复TIM2_CH1通道/
     }
  }

1如果是通过串口、SPI或I2C升级的话,STM8L出厂时已经有简单的bootloader能解决,之需要设定optionbyte(选项字节),STM8S我不确定,详细你可以看看ST的文档。
2APP的话,用ST的工具,在官网可以下载。
3如果要自己做bootloader,你必须懂汇编,PC的APP也需要化很多时间去弄。当然,网上也有教材很容易搜得到。如果没什么特别要求,只是想脱离Swim升级的话,用原本的bootloader最方便。

读取寄存器TIMx_CNTRH和TIMx_CNTRL,其中x用数字代替。
注意:读取定时器1的时候,一定要先读高8位再读低8位,因为读取高8位的同时,低8位会自动拍快照,这时读取的低8位不会出现重大误差。
读取其他定时器时,先读高位,然后读低位,然后再次读高位。如果两次高位不一样(且谁高谁低遵循计数方向),低位不足128时高位用后一次读的,否则用前一次读的。

你好,我这边有关XT1511/SK6812灯珠的程序,可以了解一下。
/RGB灯珠,灯带/
#include "IOSTM8S103F3h"
#include "LEDInputDatah"
int main( void )
{
CLK_CKDIVR&= (unsigned char)(~0x18);
CLK_CKDIVR|= (unsigned char)0x00;/设置时钟为内部16M高速时钟/
PC_DDR|=0x20;
PC_CR1|=0x20;
PC_CR2|=0x20;
PC_ODR|=0x20;
reset(); //灯带复位
send_24bits(0xff,0x00,0x00); //第一颗灯亮绿
send_24bits(0x00,0xff,0x00); //第二颗灯亮红
send_24bits(0x00,0x00,0xff); //第三颗灯亮蓝
send_24bits(0xff,0xff,0xff); //第四颗灯亮白
while (1);
}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/yw/13216663.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-06-21
下一篇 2023-06-21

发表评论

登录后才能评论

评论列表(0条)

保存