你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

求助-STM8S-如何在STVD环境下重定向printf函数实现UART简化输出

[复制链接]
Jolin乐百事 提问时间:2018-2-6 16:40 /
1. AS the title, who can share your code in STVD?NOT in IAR,,,thanks a lot.
2. 目前困在STVD环境下,不能重定向printf(),网上IAR环境的重定向调通了,求STVD环境下的code。
3. 用STM8的官方例程UART1_Printf在STVD环境下编译OK,但是debug时候报错下载不了程序,报错信息如下图:

4. 针对3中问题,用STVP彻底清空片子里的代码后还是不能烧进去,请问高手有什么解决办法?

备注: 开发环境STVD
           MCU: STM8S208MB

谢谢关注

Error info

Error info

STVD Code

STVD Code
收藏 1 评论10 发布时间:2018-2-6 16:40

举报

10个回答
时光虫子 回答时间:2018-2-6 17:41:40
STM8我都是用IAR,没有用过STVD

评分

参与人数 1蝴蝶豆 +1 收起 理由
zero99 + 1

查看全部评分

wenyangzeng 回答时间:2018-2-6 21:37:02
本帖最后由 wenyangzeng 于 2018-2-6 21:42 编辑

提示错误的信息表示楼主的Flash写保护了。STM8S208好像没有写保护功能,下图试看看:
无标题.png

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

Johnson Cao 回答时间:2018-2-7 09:20:13
STVD可以重定向printf的,我一直这么用的.
// 函数功能:初始化UART
// 输入参数:无
// 输出参数:无
// 返 回 值:无
// 备    注:无
void UartInit(void)
{  
        UART1_CR2 = 0;         // 禁止UART发送和接收
        UART1_CR1 = 0;         // b5 = 0,允许UART
                                                                        // b2 = 0,禁止校验
       
        UART1_CR3 = 0;         // b5,b4 = 00,1个停止位
       
        // 设置波特率,必须注意以下几点:
        //        (1) 必须先写BRR2
        //        (2) BRR1存放的是分频系数的第11位到第4位,
        //        (3) BRR2存放的是分频系数的第15位到第12位,和第3位到第0位
        // 例如对于波特率位9600时,分频系数=2000000/9600=208
        // 对应的十六进制数为00D0,BBR1=0D,BBR2=00
        UART1_BRR2 = 0x00;
        UART1_BRR1 = 0x0D;
// 实际的波特率分频系数为0682(1666)
// 对应的波特率为16000000/1666=9600
//UART1_BRR2 = 0x02;
//UART1_BRR1 = 0x68;       
                       
        UART1_CR2 = 0x2C;         // b3 = 1,允许发送
                                                                                        // b2 = 1,允许接收
                                                                                        // b5 = 1,允许产生接收中断
}
// 函数功能:从UART1发送一个字符
// 输入参数:ch -- 要发送的字符
// 输出参数:无
// 返 回 值:无
// 备    注:无
char putchar(char c)
{
        while ((UART1_SR & 0x80) == 0x00);         // 若发送寄存器不空,则等待
        UART1_DR = c;                                                                                         // 将要发送的字符送到数据寄存器
        while ((UART1_SR & 0x80) == 0x00);         // 若发送寄存器不空,则等待
        return c;
}

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

Johnson Cao 回答时间:2018-2-7 09:20:48
        UartInit();

        printf("System Running!");
Jolin乐百事 回答时间:2018-2-26 16:08:58
wenyangzeng 发表于 2018-2-6 21:37
提示错误的信息表示楼主的Flash写保护了。STM8S208好像没有写保护功能,下图试看看:

...

谢谢您的回复,新年快乐
您的做法我之前做过,在STVP中关掉写保护并下载到片子里,但是仍然遇到上述问题。估计是代码的问题不是硬件。还需进一步研究。。。。
Jolin乐百事 回答时间:2018-2-26 17:06:15
Johnson Cao 发表于 2018-2-7 09:20
STVD可以重定向printf的,我一直这么用的.
// 函数功能:初始化UART
// 输入参数:无

谢谢亲回复,新年快乐!
但是按照亲的代码,编译通过,下到片子里仍然报错,换用简单的点灯程序可以正确下载,正常显示,1.是不是因为写了putchar函数所以报错?STVP中已经将写保护关闭;期待你的回复。
2-关写保护-STVP.JPG
2-网友贡献-Build-STVD.JPG

仍然报错

仍然报错
Johnson Cao 回答时间:2018-2-27 08:39:28
Jolin乐百事 发表于 2018-2-26 17:06
谢谢亲回复,新年快乐!
但是按照亲的代码,编译通过,下到片子里仍然报错,换用简单的点灯程序可以正确 ...

简单的点灯程序可以,那你现在的程序和简单的点灯程序对比有什么差别呢?
Jolin乐百事 回答时间:2018-2-27 10:31:30
Johnson Cao 发表于 2018-2-27 08:39
简单的点灯程序可以,那你现在的程序和简单的点灯程序对比有什么差别呢?

差别在于重定义了putchar()函数啊
Johnson Cao 回答时间:2018-2-27 10:39:16
Jolin乐百事 发表于 2018-2-27 10:31
差别在于重定义了putchar()函数啊

就增加一个putchar就不能下载了?
Jolin乐百事 回答时间:2018-3-1 08:30:18
Johnson Cao 发表于 2018-2-27 10:39
就增加一个putchar就不能下载了?

是这样的,捣鼓了好久都是这问题
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版