第一个STM8项目的记录

C语言小知识---数据类型   看到这个题目好多人肯定会迷惑,数据类型有什么可说的,这不是编程的基础吗?凡是会写代码的肯定都熟悉数据类型,不就是char,int,float,double这些每天都用成百上千次的的类型吗?各位看官切莫着急,且听我慢慢道来。   对于上位机开发来说,数据类型基本没有什么特别注意的,无非就是32位系统和64位系统的数据长度不一样。正是这个数据长度的问题,对于单片机开发来说,却是至关重要的。因为单片机有8位、16位、32位。如果不注意数据类型,不注意数据长度,那么在编写代码的时候,很容易就会造成数据溢出,导致 阅读详情

说明

我的第一个项目是stm8。
显示部分是点阵加数码管,通过串口控制下位机变频器的运行。虽然看起来很简单,但是项目复杂度超过我以前开发板上的所有项目,因此碰到了很多前所未有的问题。在此记录一笔。
注,这是本人第一个项目的记录,不保证科学与正确


1,misplaced local declaration错误

变量必须在函数的最开始处一口气全部声明或者定义掉
这其实是说明cosmic不支持c99的原因。


2,stm8中,各数据类型长度

类型长度
char1字节8bit
int2字节16bit
short int2字节16bit
float4字节32bit
double4字节32bit
long int4字节32bit
long long int4字节32bit

为了以后移植方便,我决定采用C99的扩展类型uint8_t uint16_t这种。


3,STVD的中断中不能使用long类型

小标题只是该bug的表现之一。确切的bug描述是
在stm8_interrupt_vector.c使用超过2byte的类型。就会产生类似段重合之类的错误。
这里写图片描述
下面是bug的详细描述。

3.1。

在stm8_interrupt_vector.c中,函数定义里的变量不能超过2个byte。这个函数不仅仅是中断处理函数,还包括放在这个文件中的普通函数,这个变量限制对全局变量局部变量同样有效。

3.2。

同样,在这个文件中的变量默认是signed类型,就算在使用前声明为extern unsiged也不行,但是在使用中进行强制类型转换(unsigned int )或者数字后面加u是可行的。
这句话的意思是比如声明变量的时候为unsiged int,那么理论上的变量范围是0~65535。而stm8的int类型是2byte,理论上是不会报错的。
但是实际上,如果变量使用的时候超过了32768。那么就会报错。即变量在使用过程中如果超过了有符号类型的最大值,那么编译器就会进行扩展成4byte。
这种bug,即使在使用文件前extern一下也是不行的。
但是,如果在使用中,再进行一次强制类型转换(unsigned int)或者数字后面加个u,却是的可行。

3.3。

不可以用long类型。即不可以让变量超过2个byte。

3.4。

但是,如果函数定义在其他地方,而该文件只是声明引用的话,没有问题。因此很多人没发现问题是,他们把中断函数定义放在了其他地方,而stm8_interrupt_vector.c只是声明。
此外我查看lxf文件,发现stm8_interrupt_vector.cs是链接在const区的,也许问题出在这里。但是我水平不够,暂时无法发现真正的原因。


4,IAR的一些初始化操作

iar for stm烧录程序,开始新建工程时候选择芯片是无效的,一定要在打开工程后右击工程-option-general option-选择芯片。不然能编译,但是下载无效。
此外,若是使用标准库,还需要在C/C++Compiler中的preprcessor选择工程头文件路径和预定义符号
当前工程文件目录代码是PROJDIR
预定义符号选择芯片就可以了。
需要在工程里添加标准库的C源码文件,h文件不用添加,上面包含了。
对不需要的C文件,要么不添加进去,要么右击option-exclude from build排除编译之外。


5,stm8的一些问题

stm不能同时初始化多个同功能的定时器,我初始化了2个时间不同的溢出定时器结果出现问题。且这个不是时间重合带来的问题,因为我只要一开第二个定时器的功能就会出问题。至今未能找到原因。因为我后来只用了一个定时器。
stm的定时中断处理程序的时间是微秒级。
曾经,我定时处理程序是10us一次,然后处理了很多东西,结果发现定时不准时。最后发现,是10us处理一次太快了。导致处理中多次被中断,进而影响时间。
后来,我用了个定时器1ms的中断,但是实际运行中发现,40行的代码,全部只进行取余判断从来递增递减取反置一相关全局变量。抓波形测出一次中断运行时间居然要170us以上。换句话说,1ms中断时候,在中断中运行的时间就接近五分之一。
后来我用了10ms的中断,结果同样的代码,运行时间缩短到了50us以下。看来中断的进入转出需要比较长的时间。
用stm的蜂鸣器必须配置选项字节中的AFR7为BEEP。
LSI的时钟校准是通过AWU测定的。如果把这个外设时钟关了,会进入忙循环导致没有任何反应。
不能关,蜂鸣器外设是通过这个使能的,关了就开不了了


6,串口发送速度

在用定时器控制串口发送频率时,有点特殊。
串口本身的发送时间是20~30ms,按照下位机的要求,我的定时器规定100ms中断一次,然后发送数据,那么出现的情况是如下这样。
0ms定时器中断写1—-30ms串口发送数据完毕,对定时器flag写0—-100ms定时器中断写1—-30ms后串口发送数据完毕。
在这里上一串串口数据发送结束到下一串数据发送开始,中间间隔是70ms。而我想要的是上一串串口数据结束到下一串数据开始,中间间隔100ms。
解决方法,有两种。
1是将定时器中断弄长一点,比如130ms,那么就能使100ms间隔了,不过这个方法的问题时,串口本身发送数据的时间是不定的。也即是串口数据之间的间隔是不定的。
2是定时器中断时间短一点,比如1ms一次,那么当数据大于100ms时发送数据,发送完写0,等下一次大于100ms再次发送数据。这种方法间隔比较准确。
3最后敲定最终方案,10ms一次加1,15次后开始发送。


7,一些C错误

Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement
运算符两边都是volatile变量的警告。一般来说volatile不应该参与计算。
神奇的缺少)错误,是因为#define的时候多加了个分号。
神奇的缺少;错误,是在预处理文件中发生的,原因是前一个预处理文件的最后一个语句忘了加分号。
在使用标准库可变参数时候。va相关函数,总是发现数据不对。
最后发现是va_arg在计算步长是用的是int(2个字节),而我是却将其设为uint8_t一个字节。将u8改成int就对了。
在测试串口的时候,发现串口怎么也不发送数据。最后检测发现,没有清除发送完成中断的flag。同样的问题,我在定时器处理的时候也发生过。
所以下次注意,不用忘记在中断处理程序中清除中断相关flag,当然如果不用(我用不到发送完成中断),最好不要随便开中断。尤其是那种不是自动处理的中断。
同样的,我还不小心开了校验中断,因此会莫名其妙的不发送数据。
这里总结下,stm的中断flag必须手动清除!!如果找不到,那么能不用就不用。
外部中断这个我没找到如何手动清除,如果出问题要注意。查资料得出,8s没有,8l有。
expected an identifier,使用enum类型报错。是因为重复定义,前面#define了。
要小心执行一次和执行多次的区别,有些函数我们只需要在一定时间内执行一次就好了。
在stm的程序容量超过32k(地址超过64k),会出现奇怪的定义错误。
在iar设置里面降代码改成large就可以了。这个其实就是stvd长指针的意思。


8,其他

原本我是TIM4 8位中断,后来10ms不够了,所以用了TIM3,但是发现不能中断。反复检查初始化没有问题。
后来发现,利用库函数校准LSI的时候,需要用到TIM3的捕获功能,这个函数一定要放在主函数时钟初始化之后,定时溢出初始化之前。
我在进行LED半秒闪烁的时候,先开始是等于一个时间值(比如50)然后开,等于另一个时间值(比如100)关,但是发现总是闪烁几下,卡1-2秒,再正常。
后来我改成了范围判断,正常了。
原因是程序速度跟不上,正好跳过了这个定时值,时间值是根据定时器定期变化的,变化的频率是10ms的时间。但是程序运行中这个函数的运行频率不一定正好10ms内一定能运行一次。实际情况可能是,函数正好在49的时候运行了下,51的时候又运行了,恰恰是跳过了50。
所有的取余运算都会有这个,很可能会跳过需要的数值。个人认为改成范围判断会好很多。
在进行同一个点阵,但是同时显示两个不相关内容时,发现会有闪屏现象
因为其中一个内容需要定时闪烁一个点,我为了使两种显示不冲突,用的是或运算填充数据,即读出数据,或运算,输入数据。因此,闪烁功能的实现必须要清空屏幕才能搞定。
后来我改了下,在跑圈内部等到闪烁的时候请空屏幕。然后把中间的数字显示放到了跑圈下面。改了下两个函数的调用次数,总算搞定。
后来采用了更好的显存显示方案。再也没有这种问题。因为对显存的各种操作,只要最后没有显示出来,那是可以任意更改不用考虑次序的。
因此这里总结显示的输出模式是
1,填充显存数据
2,根据不同的情况略微修改显存数据
3,输出。然后123循环。
这样的好处是,修改的时候不涉及输出,因为1,和2的数据可以不同也不会闪屏。


9,优化

容量居然不够用。
标准库的初始化函数占据空间比寄存器大,是大很多很多,我测试了两个函数的寄存器实现和库实现。编译出来的容量库比寄存器大了一个8倍,一个20倍
查看发现,所有的只读变量,包含只读常量数据,代码全部在flash里面。
所有的可写全局变量,静态全局变量还有堆栈全部在RAM中。

查看iar汇编代码。
在定时中有两种判断定时方法,首先定义一个全局的节拍,每次定时器中断加1,记录开机到现在的所有节拍数。因此,一种是取余置相关全局flag为0。外部函数判断这个flag是否为0
另一种是设置外部flag不断递减,只到0。外部判断是否为0.
两种方法比较后发现,取余的方法一般是30个字节,而递减到0的方法有15个字节。
其中,第一种方法,取余有22+字节,剩下8字节赋值
第二种,自增自减是4字节,剩下是判断是否为0

STM8入门以及程序编译、烧录、IAR使用方法(扫盲篇) 使用环境(蓝色粗体字为特别注意内容) 1、硬件环境:STM8S003F3P6、ST-LINK stlink V2 2、软件环境:Embedded Workbench 6.5(IarIdePm)、ST Visual Programmer(STVP) STM8以其超高的性价比,在低端单片机领域占领了很大的市场,市面上很多单片机产品都能够看到STM8的身影,下面对STM8和89C51来做简单的对比: ... 阅读详情

相关推荐

如何用Keil5创建STM32项目

用Keil5创建STM32项目,添加.c和.h文件,配置环境,成功编译烧录

weixin_53561545的博客 8795

STVD ERROR:misplaced local declaration

STVD ERROR:misplaced local declaration 问题解决: 在使用STVD的时候报如上错误,发现是STVD的编译器COSMIC的编译语法标准和C99的不一样,C99中,函数内的局部变量可以即用即声明,而COSMIC编译器支持的模式是在函数一开始,就将所有的局部变量全部声明完成。 我在开发中使用的是STM8系列MCU,个人觉得编译器这么设计的原因是: STM8采用变长指...

qq_36749906的博客 1448

STM8L开发环境配置

stm8l101f3p6配环境记录 最近因为需要使用一个低成本、低功耗、小体积的mcu制作一套简单的spi-iic-uart转换板,综合比较了stc8(51架构)、stm8(st自研8位CISC架构)、atmel8(51架构)等单片机,最后选择了stm8l10x系列,因为 成本可以接受(好贵啊,但是至少比msp那种诡异的东西便宜) 体积最小(封装ssop20) 外部电路最少(唯二不需要外部晶振的单片机) 功耗相对低(虽然比不上TI的,但是它更便宜) 外设最丰富(有硬件spi、iic、uart,完全满足需求

qq_40500005的博客 4228

STM8S项目创建(STVD创建)---使用 COSMIC 创建 C 语言项目

在NewWorkspace窗口中,点击Createworkspaceandproject图标,然后点击OK。main.c和stm8_interrupt_vector.c是自动添加的.用户只需要根据不同的MCU的中。首先要设置好调试工具,可通过菜单“Debuginstrument>TargetSettings”来设置,如。”,可以对当前的工程进行设置,包括C编译器、连接器等选择。在弹出的对话框中,列表中列出了此开发环境支持的所有工具。一般常用工具是Swim。......

weixin_46323814的博客 2675

从STM32最小系统入门嵌入式的学习记录(项目创建)

keil5-stm32项目的创建

2403_89225610的博客 1324

IAR for STM8的安装与在使用上遇到的问题

前言 因一些原因,需要学习STM8的使用,然后发现自己又入坑了。在IAR for STM8的使用上磕磕绊绊了一天,写这篇文章来记录一下辛酸史。 一、STM8的IDE安装 用于STM8开发的IDE通常有这两种,IAR和STVD,但主流还是IAR。STVD是ST公司专门用来开发STM8的,功能相对于IAR来说少一点,但胜在其是免费的。 我选择使用IAR,关于IAR的介绍、下载、安装与注册可以参考这篇博客[点它进去]很详细,还有IAR超级细致的使用介绍。(https://strongerhuang.blog.cs

weixin_45985341的博客 4775

开发中遇到的错误

今天调试程序遇到这么一个警告! Local declaration of 'XXX' hides instance variable 遇到这种原因,是因为本地变量跟函数参数变量同名。开来,还是要注意变量的命名啊!

Cola 404

STM8 问题记录以及解决方案

问题一:安装STVP和STVD时出现

qq_34118600的博客 1388

学习STM8 关于数据类型的定义心得(更新)

最近一直在学STM8  代码里面一直出现u8 * / u16等等  类似 #include"stm8s.h" /*芯片唯一的ID地址 96位*/ define UNIQUE_ID_START_ADDR 0x48CD u8 i; s16 temp; s8 t; u8 * pUniqueId; int main( void ) { return 0; }一直不理解什么是u8 今天

R_Rick 7764

关于STM8S001J学习过程记录

关于STM8学习记录过程 第一 编译环境的安装 我选择的IAR软件,这个软件需要破解,所以需要注册机激活,过程的话百度上百度IAR破解安装,第一个就是百度知道就是。步骤还是比较简单易懂的,我唯一的碰到的问题是,注册机激活的时候,类型没有选择对,所以导致ActivationInfo这个文件激活失败,没有一个回应文件。 这个问题的原因是它默认的是ARM,后面选项里面有STM8的,我们需要选择这个后,它才能激活成功。 第二 工程的建立 工程的建立:1.要建立一个workspace。选择菜单File->New

weixin_46146080的博客 1061

给新考上北大软件与微电子学院的同学——利用北大资源

利用北大资源 首先,恭喜大家考入北京大学!希望软院成为各位人生旅途中快乐的一站! 说明:限于本人搜集能力有限,本文只列出本人常利用的资源(上课老师会告知的资源也不在此列),本文所述的资源只是北大可利用资源的一个子集。 一、 图书馆资源:北京大学图书馆的资源数量,我就不多废话了,这里主要说一样怎样利用这些资源。 a) 传统资源分布及查找:这种资源主要包括纸质书箱、杂志、光盘等内...

Felomeng的技术博客 1万+

STM8新建IAR工程

2016年的时候开发过stm8s003,当时用的是STVD开发的;时过两年,2018.12再次需要开发stm8,已经忘的差不多了,费尽周折,电脑的原因一直装不上STVD,只能选择IAR了,记流水账一篇,记录一下开发过程,防止下次又忘记。 欢迎加入stm32/LoRa物联网:304350312 1、准备标准库函数文件,官方的标准库函数为stsw-stm8069,解压后如...

freemote的博客 7293

工厂自动化布线实战:从功率计算到线槽布局的完整避坑指南

本文详细介绍了工厂自动化布线的实战经验,从功率计算到线槽布局的完整避坑指南。通过三步计算法确定线径需求,强调电压降控制的重要性,并分享线槽布局的50%法则和强弱电分离技巧。特别针对移动设备和多芯信号线提供专业解决方案,帮助工程师避免常见错误,提升布线效率和质量。

weixin_29266007的博客 352

STM8入门之IAR创建项目及编译下载(STM8S103F3P6)

刚开始时,本人是以一个workspace下建多个project的方式管理所有项目。但是后来发现,要基于之前某个项目做些新的尝试,但又想保留之前的项目,在复制项目时,感觉很不方便, 于是改为一个workspace下只建一个project,多个project则建多个workspace,要想复制项目时则复制整个workspace即可。 下面是建立一个模板workspace/project的过程记录:

feiniaoflyer的专栏 5455

CRMEB小程序订阅消息实战指南:PHP配置与疑难排查

本文提供CRMEB小程序订阅消息的完整实战指南,重点解析PHP环境下的配置流程与常见错误解决方法。文章从订阅消息的核心规则讲起,详细拆解了从微信后台获取模板到CRMEB后台完成字段映射的关键步骤,并提供了从用户授权、缓存清除到服务器日志检查的逐层排查方案,帮助开发者高效打通消息通道,避免常见配置陷阱。

weixin_29022115的博客 318

调节桌面图标大小的方法(编程)

如果你对其他操作系统或编程语言有类似的需求,可以根据具体的情况进行相应的调整和搜索相关的库和方法。在编程中,我们可以使用各种桌面应用程序来调节桌面图标的大小。库提供的函数,我们获取了桌面图标的窗口句柄,并使用Windows消息发送方式设置图标的大小。你可以根据自己的需求修改代码中的图标大小值,并在运行代码后观察桌面图标的变化。函数并传入所需的图标大小,这里设置为48x48像素。首先,我们需要使用Python的第三现的方法。首先,我们需要使用Python的第三方库。首先,我们需要使用实现的方法。

CyberFlare的博客 439

STM8S全解析之系列文章1---STM8S芯片项目需求与解决方案

STM8S全解析—系列文章1.STM8S芯片项目需求与解决方案 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:STM8S全解析—系列文章1.STM8S芯片与项目需求 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录STM8S全解析---系列文章1.STM8S芯片项目需求与解决方案前言一、STM8S是什么?二、STM8S芯片模块,项目需求,解决方案1.芯片模块(常用模块)2.项目需求3.解决方案总结 前言 这篇文章作为系列文章的第一篇,主要讲解STM8

weixin_39853312的博客 2276

ros入门(八)---TF坐标转换

TF(TransForm),就是坐标转换,包括了位置和姿态两个方面的变换。

weixin_51157015的博客 3388

STM8S串口中断卡死调试记录

项目使用STM8S003单片机,数据发送速率比较慢时,一切正常。当速率快的时候,系统卡死,具体表现为一直运行中断服务程序,无法执行while(1)里面的内容了。 调试记录 开始怀疑是一直在响应某个中断,断点调试后发现是一直在响应UART1接收中断。调试步骤如下: 怀疑是串口中断里做了数据解析工作,导致在解析途中又收到了第二个串口接收中断,然后发生异常。解决办法是在串口接收中断中关闭串口接收中断,数...

静静流淌的柯溪的博客 3316

MATLAB代码转到FPGA代码

添加完文件之后,需要设置输入的数据类型,设置完之后点击Workflow Advisor。MATLAB文件包含一个功能实现文件和测试文件。对应FPGA中的功能文件和测试文件。然后,将功能文件和测试文件添加到相应位置。然后选择APP中的HDL Coder代码。首先需要编写好MATLAB文件。点击链接,就可以查看你看到的代码。可以自己生成代码的语言类型。

小柚子的博客 3062

多agv系统调度的MATLAB仿真

从起点出发,到货物点领取货物最后到卸货点,以完成任务总时间最短为目标进行单目标优化,约束条件为,任务不冲突,路径不冲突,要能实现路径规避 ,4-6台agv一起工作。左右货架间隔可通过1个agv,上下货架间隔可通过两个agv,通道为双向行驶通道。一台agv只能带一个货物,优化目标为完成任务总的时间最短,agv的速度是匀速,转弯也不会减速,取货物时间为固定值。上面的图里面货物看为正方形跟agv一样的长度大小,agv试做是跟货物一样大小的正方形agv的速度是每秒1个车身。多台agv一起完成...

FPGA/MATLAB学习教程/源码/项目合作开发 7563

关于STM8S的UART2串口的学习记录以及使用经验

关于STM8S的UART2串口的学习记录以及使用经验前言正文初始化功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 前言...

qq_42592132的博客 4007

GFPS技术原理(一)-简介

GFPS(谷歌快速配对服务)利用BLE技术简化设备配对流程,相比传统方式大幅提升用户体验。首次配对时,设备广播包含型号ID和安全密钥的BLE信号,手机检测后弹出配对通知,用户点击即可完成安全连接并将设备与Google账户绑定。该技术支持跨设备同步、电量显示、找回设备等功能,后续配对更加便捷。GFPS通过BLE实现快速发现、一键配对和安全连接,结合Google后端服务提供元数据支持,已成为出海设备的认证标准。其核心优势在于简化操作步骤并增强功能性,特别适合非技术用户群体。

十多年蓝牙协议软件开发,擅长蓝牙协议分析 2062

基于STM32及Proteus8实现智能家居系统(记录项目经历)

随着科技的不断进步,智能家居系统已成为提升生活品质的重要手段。本项目旨在利用STM32微控制器开发一款功能完善的智能家居系统,实现温湿度监测、自动换气、数码管时钟显示以及电机控制等功能,从而打造一个舒适、智能的生活环境。

qq_58982202的博客 2670

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

项目记录1——基于STM32和Zigbee的电力表数据采集

读博警告: 本人纯属小白一枚,刚开始接触学习STM32。本篇微博只是想记录自己在做项目中过程中遇到的问题以及最后的解决办法。第一次更博,语言表达能力不好还很乱,望见谅,欢迎大家一起学习交流! 项目描述 要求: 1、监测设备一天的用电量。 2、统计开机、关机时间,计算使用率。 3、有可能的话实现手机端实时监控 预计方案: STM32单片机通过RS-485串口驱动电力表模块采集数据,然后再通过TTL串口将数据发送给ZigBee终端。ZigBee终端在接收到数据后通过无线传输将数据发送给协调器,ZigBee协调器

ShineSmile29的博客 5758

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

STM8开发记录

记录下STM8S0013M3这款单片机的使用,供自己复盘,和有需要的人参考。

m0_37678229的博客 641

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

上一篇: [蜂鸣器不简单]单片机中蜂鸣器的多种运用(长响,短响,多次响)
ZeroSkyrim
博客等级 码龄16年 34粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值