STM8S003F3U6 请求各位大佬支援,但是遇到如下问题。。。这样就一定是这颗芯片的问题吗?
STVD如何生成库文件
STM8 flash 库函数 startaddress = startaddress + ((uint32_t)BlockNum * FLASH_BLOCK_S
STM 有能替代MCHC912B32CFUE8 / NXP的型号吗?
STM8S的CAN总线使用
STM8L151在使用DAC功能后严重发热
STM8 IIC SLAVE 400K
STM8S 定时器1互补输出pwm
STM8S003F3 NRST电压低,无法开机
求:(深入浅出学习STM8系列单片机)下载地址
小于32k 的16位地址即可,32-128K的24位地址即可
我怀疑是库函数问题,希望官方指导一下,把地址内存改为16位就不会出现告警
IN_RAM 已经宏定义_ramfunc 了,但是运行到 Startaddress = startaddress + ((uint32_t)BlockNum * FLASH_BLOCK_SIZE)里显示有非_ramfunc 的函数 这里 Startaddress 定义的 32位,尝试把他改为16位不会出现告警,这里定义的32位是不是针对STM8_HD的产品型号?我用的MD的改为16位是否可以
感谢回答,是不是库函数这一块有bug,用的stm8L151k6 flash最大32K,不明白为什么转成32位运算,能直接修改吗,
函数前面有说明,对于IAR的一些警告是没影响的。
所以不用纠结这警告
不知你所说的告警具体是什么。有些时候警告只是提醒未必是错误。
首先,这个地方的变量startaddress定义为32位是合理的也是必要的,STM8的最大寻址空间为18MB.
作为库代码,它要兼顾整个系列。
STM8支持3种寻址模式,即短寻址、长寻址和扩展寻址模式,分别对应8位地址空间、16位地址空间和整个
18MB地址空间。而且,对于8位地址寻址模式和16位寻址模式还需遵循256B和16KB地址对齐,即8位寻址模式
不是任意的8位地址空间,16位寻址模式也非任意的16位地址空间。
既然这样,具体到你提到的当前计算结果startaddress,在基于它寻址时我们需要给它指定合适的指针类型,
或说指针属性,到底是16位长模式访问 还是24位扩展模式访问,亦即代码里提到的near 还是 far属性。
不过,强烈不建议你研究这个STM8芯片了。看看STM32 M0或M0+内核的芯片吧** ,比方STM32C0,
STM32F0,STM32G0啊,低功耗还有STM32L0啊这些。
非常感谢你的细心回答,具体告警是
Library call(?sll32_IO_IO_a)from within a _ramfunc function以及
Library call(?add32_IO_IO_l1)from within a_ramfunc function是出现在 startaddress = staraddress + ((uint32_t)BlockNum * FLASH_BLOCK_SIZE 语句里。 尝试只有把staraddress定义为uint16_t 告警才会消除,现在是不知道这个告警对功能有没有影响,因为有时发现存到模拟EEPROM的数据会丢失,所以怀疑这个告警说明程序本身还是有问题。 另外我的意思是针对不同的型号可以用宏定义隔开,不是说不让支持大容量型
如同上面那么小伙伴所说,STM8的寻址空间分为16 位和24 位。
而 STM8 是没有32位寄存器,这就让编译器很难办,实际执行也不好说。
之前对寻址范围是靠关键字定义来区分的,通过 @near or @ far 来告诉编译器并提高效率的。
编译器还有给默认配置的寻址模式
不过对于内部EEPROM来说,就是16位寻址范围,可以参考手册对于地址范围的描述。
好的,谢谢