最近项目用到了STM8S103K3T6的beep功能,调试时遇到了无法更改寄存器BEEP_CSR的值的问题,造成无法开启beep功能;网上一搜全是提到OPTION BYTE的设置问题,不管用IAR或者stvp烧写前设置,还是在程序中操作FLASH通过软件方式改变OPTION BYTE,都没有作用,自己翻看最新版的手册,里面讲的也是前后冲突,英文版的也是
言归正传,项目中就是在PD4脚接的无源蜂鸣器,没什么问题;手册中也可能为了兼容多个型号说的不够详细,前后冲突

jnlp文件 无法验证证书 无法验证文件beep.sys_BEEP


在手册DocID15441 Rev 13的第4.9章说要设置op(option data简写)的ARF7位,打开复用

jnlp文件 无法验证证书 无法验证文件beep.sys_BEEP_02


但是在第8.1章又说AFR7是保留位,无作用,在第八章中也没找到关于beep的设置位

jnlp文件 无法验证证书 无法验证文件beep.sys_jnlp文件 无法验证证书_03


在RM0016 rev14的beep介绍也很简单,只有一个寄存器,时钟树上提到了CKAWUSEL OPTION bit,实际测试打开也没作用

jnlp文件 无法验证证书 无法验证文件beep.sys_STM8S103K3T6_04


这里提到如果开启beep功能硬件会自动使能LSI,所以OP应该不用管,而且设置流程中也没提到设置OP的要求

jnlp文件 无法验证证书 无法验证文件beep.sys_STM8S103K3T6_05


实际调试中遇到的问题是,不管用库函数还是直接操作寄存器都不能更改BEEP_CSR的值,始终是0x1F;这样相当于没有配置beep功能,肯定不会响的,后来在仿真过程中看到,LSI始终是禁用的状态,设置了OP还是没有启用,后面仔细查找,看到程序中在初始化CLK的时候,为了降低功耗把未用的外围时钟关掉了,其中有AWU的,和LSI有关系,屏蔽掉就可以操作BEEP_CSR寄存器了

jnlp文件 无法验证证书 无法验证文件beep.sys_BEEP_06


问题是解决了,但是不明白为什么AWU会影响BEEP,从主时钟树上也没看出来,也没有beep的时钟走向描述

jnlp文件 无法验证证书 无法验证文件beep.sys_AWU_07


两个AWU的时钟,其中一路来自Fmaster,按说初始化程序中关的是这一路,不应该影响啊

jnlp文件 无法验证证书 无法验证文件beep.sys_BEEP_CSR_08


不明白

正确设置开启BEEP并使用LSI的条件是:

1)OPTION字节设置保持默认,即CKAWUSEL为0,选择LSI

2)程序里面CLK_PCKENR2寄存器的PCKEN22设为1,即保持与Fmaster的连接

后续测试发现如果要使用HSE驱动BEEP,第1条OPTION里的CKAWUSEL要置1,且第2条也要同时置1