打印
[应用相关]

STM8单片机开发时常见问题解决

[复制链接]
1109|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
feiqi1|  楼主 | 2016-11-27 18:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM8S103系列没有bootloader引导程序,别的系列都有bootloader了
为什么新的STM8 单片机在串口口下载时只能下载一次?

出场的STM8 单片机内部并不是绝对的空白,内部有bootloader 存
在,在我们进行串口下载的时候,下载软件需要先和STM8 的
bootloader 进行通信在得到bootloader 的回答的时候才可以进行下载,
也就是此时的bootloader 的状态必须是ENABLE 的,但是在单片机
内部是空的时候,单片机的bootloader 处在disable 状态,但是可以
进行一次烧写,第一次下载的程序必须要修改option byte,使得
Bootloader enable,这样以后可以一直用串口下载了。否则,就在也
没有办法进行串口下载程序了,这时需要使用ST link 对bootloader,
进行ENABLE,方可继续进行ISP 的下载。
在STVD 新建工程的时候工程的名字不要有空格有空格的话啊会有
警告

如何生成HEX 文件
、STVD 如何输出hex 文件
菜单栏 Project -> Setting 打开“Post_Build”标签,命令框原默认定义:
chex -o $(OutputPath)$(TargetSName).s19 $(OutputPath)$(TargetSName).sm8
输出S19 格式的目标文件。
在其中增加或修改为:
chex -fi -o $(OutputPath)$(TargetSName).hex $(OutputPath)$(TargetSName).sm8
即可输出hex 格式目标文件。
生成hex 文件被输出到目录 项目“\Debug”目录下。

怎样对STM8 单片机进行位操作
_Bool 在程序中使用的位名称 @ 寄存器:位数;
_Bool FLAGB0 @FLAG:0;

_Bool  led @PD_ODR:0;     //定义led是接在PD端口的0位



STM8 单片机寄存器操作时的中断函数写法如下定时器1
@far @interrupt void TIM1_OVER_Int(void)
{
TIM1_SR1 = 0x00;
}



上面的是用CXSTM8 + STVD开发时的常见问题。



下面介绍的是STM8在用IAR for STM8开发时的问题:

位定义  如: PD_ODR_ODR3 = 1 ;  //让PD端口的3位输出高电平

输出HEX方法:


中断函数写的方法:
#pragma   vector = TIM1_OVR_UIF_vector
__interrupt void TIM1_OVR_UIF(void)
{
    TIM1_SR1_UIF = 0;
   //写的代码放这里
   }
}

芯片选择:




如果项目内包含多个文件包就放入连接路径,如下图:



调试时一般用的是ST-LINK:




综上所说后,关与STM8单片机加密的问题,可以在写程序时加入指令,可以直接用STVP软件实现代码加密下图:
如果开,则就是加密启作用,如果选择OFF则就是代码不保护,就能用ST-LINK读出芯片里面的代码HEX



最后关于端口方向设定:

关于STM8的I/O结构及相关介绍详见Datasheet,这里仅对作部分简单介绍,下面是STM8的I/O引脚配置表:
STM8 I/O 口引脚配置表

Px_DDR

Px_CR1

Px_CR2

I/O 方式

引脚状态说明



0

0

0

输入

悬浮输入



0

0

1

输入

上拉输入



0

1

0

输入

中断悬浮输入



0

1

1

输入

中断上拉输入



1

0

0

输出

开漏输出



1

1

0

输出

推挽输出



1

X

1

输出

输出(最快速度为10MHZ)

沙发
androidbus| | 2016-11-27 19:42 | 只看该作者
有的时候进行编译打不开头文件,因此而出现的错误了

使用特权

评论回复
板凳
litengg| | 2016-11-27 19:44 | 只看该作者
怎样书写中断函数并且在主函数文件 main.c 中调用函数的中断
服务程序呢?

使用特权

评论回复
地板
qiangweii| | 2016-11-27 19:51 | 只看该作者
androidbus 发表于 2016-11-27 19:42
有的时候进行编译打不开头文件,因此而出现的错误了

对于这个问题,将相应的包含文件复制到COSMIC 安装文件夹下面的Hstm8 文
件夹下面即可啦

使用特权

评论回复
5
shashaa| | 2016-11-27 19:52 | 只看该作者
litengg 发表于 2016-11-27 19:44
怎样书写中断函数并且在主函数文件 main.c 中调用函数的中断
服务程序呢?

在stm8_interrupt_vector.c 文件里面的中断向量的映射
{0x82, NonHandledInterrupt} 的字符 “NonHandledInterrupt”改为所
要书写的中断函数的函数名

使用特权

评论回复
6
xia00| | 2016-11-27 20:00 | 只看该作者
例 TIME4 的 溢出中断改写为{0x82, TIM4_UPD_OVF_IRQHandler}
然后在文件中进行函数终端服务程序的声明

使用特权

评论回复
7
hfdy01| | 2016-11-27 20:01 | 只看该作者
@far @interrupt void TIM4_UPD_OVF_IRQHandler (void)

函数体

使用特权

评论回复
8
CallReceiver| | 2016-11-27 20:11 | 只看该作者
hfdy01 发表于 2016-11-27 20:01
@far @interrupt void TIM4_UPD_OVF_IRQHandler (void)

函数体

这个是在主函数中进行函数服务程序的书写形式。。

使用特权

评论回复
9
598330983| | 2016-11-27 23:29 | 只看该作者
如果用Keil做,你还要在工程配置信息里填上路径呢,不然一样无法识别。

使用特权

评论回复
10
Snow7| | 2016-11-28 16:49 | 只看该作者
stlink和jlink是什么区别?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

424

主题

1616

帖子

1

粉丝