找回密码
 立即注册
搜索
查看: 1108|回复: 0

STM8S 使用笔记

[复制链接]

267

主题

0

回帖

1164

积分

管理员

积分
1164
发表于 2024-1-22 13:21:01 | 显示全部楼层 |阅读模式

1、GPIO

  • 关于 SWIM 用作普通 GPIO 脚

即使 CFG_GCR 的 SWD 脚不置为 1,事实上 PD1 脚也可正常执行输入输出功能,只不过在同时使用 SWIM 调试时,即使设置 DDR 为输出,ODR 总保持为 1。关开 SWIM 连线,复位 MCU 后输出功能可正常执行。SWD 位看似没有什么作用,不过还是按手册所说的方式来做吧。另外也不必担心 SWIM 功能因为该配置而被禁用。

  • 关于开漏输出脚

手册上打 T 标记的是真正的开漏脚,不具备推挽输出的功能,也没有内部上拉功能。使用时需要特别注意。

2、读 TIMx_CNTR 要分别读 TIMx_CNTRH 和 TIMx_CNTRL(分别读 TIMx_CNTRL 和 TIMx_CNTRH 也没错),因为发现直接读 16 位的 TIMx_CNTR 可能出现错误:

明明 TIMx_CNTR 的值是 829,偏偏赋值给一个变量后变量的值是 789。但也不总是有问题,运行几次就好了,复位后现象依旧,但分别读 TIMx_CNTRH 和 TIMx_CNTRL 并赋值给变量就正常,连续读两次 TIMx_CNTR 也是正常的。

3、关于 COSMIC 编译器

编译器有三个自用的变量 c_x、c_y、c_lreg,当与中断函数关联时:

(1)当中断函数直接使用(编译器自动产生汇编代码)他们时,会被自动保存和恢复;

(2)当终端函数调用使用了 c_x、c_y 的函数时,c_x、c_y 会被自动保存和恢复,但是 c_lreg 不会被这样自动保存和恢复;

这就要特别注意:如果中断中调用了使用 longs 或者 floats 的函数时就要在中断函数的定义中加修饰词 @svlreg!

不太好判断是否使用了 c_lreg(需要反汇编才能看),例如 c_lgadc(长整数加无符号单字节)就没有用到这三个变量,所以在不影响性能的是否加上无妨,除非你的应用很在意那几个 pushw、popw。

4、一个配置字初始化引起的问题

同样的软件延时程序在不同的板子上一个验时是 4ms,一个是 3ms,如果用硬件定时器来实现验时则一致。

读出配置字为 000000F0F000FFFE00,而正常情况下应该读出的是全 0。置 1 的那些位是保留位,具体作用不清除,将其都清零以后延时都是 3ms 了。

可能保留的配置字影响了指令执行等待时间等参数。通过这个问题来看,如果烧写程序时(尤其是 debug 程序时)不烧写正常的配置字进去,可能会造成程序的异常执行。

5、stm8 cosmic 用 sp 索引变量,如果用 push cc 保存寄存器至栈会造成由于编译器不能识别嵌入式汇编而造成的后续代码的变量使用的错误,所以要用 push cc  然后 pop a 的方式获取 cc 的值并返回,不能保存在栈里:

uint8 EnterCritical(void)
{
    #asm
    push cc
    sim
    pop a
    #endasm
}

6、关于 STVD 开发环境

如果出现编辑界面或仿真界面布局变乱,可以删除 .wed 文件(存储开发界面信息)或 .wdb 文件(存储仿真界面信息),以初始化界面。

7、关于 memcpy

cosmic 的 memcpy 是从后往前拷贝,这样当 src 与 dst 重叠时,比如 memcpy(buf, buf + 5, 10) 结果就不是我们预想的,可以使用 memmove 来代替,它会检查是否重叠。当 dst 大于等于 src 时,从前往后拷贝(常规顺序)。

8、stm8 终端向量表

由操作码 0x82(INT)与三字节的地址组成,执行过程是将三字节地址赋给 PC,程序将跳转到该地址处执行。


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|棱讯科技 ( 粤ICP备2024228160号-2|粤公网安备44030002003510号 )

GMT+8, 2024-12-22 00:41 , Processed in 0.015307 second(s), 3 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表