OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4536|回复: 10

请教一下关于usart.c的移植问题,谢谢。

[复制链接]

7

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2016-8-18
在线时间
28 小时
发表于 2017-3-13 15:54:16 | 显示全部楼层 |阅读模式
1金钱
请教一下关于usart.c的移植问题,谢谢。
感谢原子哥的开源,想尝试把F1的usart.c移植到F0系列的CPU上使用,但是发现如下报错,是因为F0系列的CPU没有定义SR和DR吗?那么可以自己定义并添加吗?谢谢。


//重定义fputc函数
int fputc(int ch, FILE *f)
{      
        while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
    USART1->DR = (u8) ch;           
        return ch;        
}
#endif



QQ图片20170313155256.png


最佳答案

查看完整内容[请看2#楼]

看F0的data sheet,找到跟这个寄存器bit功能相同的bit~
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1183
金钱
1183
注册时间
2015-5-28
在线时间
149 小时
发表于 2017-3-13 15:54:17 | 显示全部楼层
看F0的data sheet,找到跟这个寄存器bit功能相同的bit~
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2017-3-13 17:30:26 | 显示全部楼层
查看F0的数据手册,看有没有SR这个寄存器!如果没有的话就查看同等功能的寄存器叫什么名字
回复

使用道具 举报

7

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2016-8-18
在线时间
28 小时
 楼主| 发表于 2017-3-14 09:53:31 | 显示全部楼层
本帖最后由 Alvanbai 于 2017-3-14 09:55 编辑
[/mw_shl_code]小陀螺爱炒蛋 发表于 2017-3-13 15:54
看F0的data sheet,找到跟这个寄存器bit功能相同的bit~

感谢炒蛋前辈的指点,按你说的方法我查找到了定义这两个寄存器功能,但是F1的官方库文件没有描述备注,F0的库文件里有,还得请教一下,F1中的SR和DR对应F0中的哪两个寄存器呢,再次感谢!我个人的理解是F1中SR是命名成为RESERVED0,DR命名成为RESERVED1。F0中没有RESERVED0,能推断是RESERVED1和RESERVED2吗?
F1的:
f1.png


F0的:
f2.png
回复

使用道具 举报

7

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2016-8-18
在线时间
28 小时
 楼主| 发表于 2017-3-14 11:23:46 | 显示全部楼层
int fputc(int ch, FILE *f)
{      
        while((USART1->ISR&0X40)==0);//循环发送,直到发送完毕   
    USART1->TDR = (u8) ch;          
        return ch;       
}

仔细看了这个程序,感觉是判断发送状态的,按照注释看是不是SR应该对应ISR,但是F0的ISR是定义成U32了呢,F1的SR是u16。DR的话应该是数据寄存器,可是F0里面分成了发送数据寄存器TDR和接受寄存器TDR,应该怎么对应呢
回复

使用道具 举报

1

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1183
金钱
1183
注册时间
2015-5-28
在线时间
149 小时
发表于 2017-3-14 13:33:08 | 显示全部楼层
Alvanbai 发表于 2017-3-14 11:23
int fputc(int ch, FILE *f)
{      
        while((USART1->ISR&0X40)==0);//循环发送,直到发送完毕   

首先,源代码中这个bit就是检查是否发送完成的标志,在STM32F1中,我们可以通过查询SR(状态寄存器)polling到这个标志位~根据代码注释我觉得这个bit可能是在F0的ISR中,我个人没用过F0,具体信息去Data sheet里面找就好了,跟那些reserved的位段没关系,这个应该是地址填充而已~
回复

使用道具 举报

7

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2016-8-18
在线时间
28 小时
 楼主| 发表于 2017-3-14 16:30:02 | 显示全部楼层
小陀螺爱炒蛋 发表于 2017-3-14 13:33
首先,源代码中这个bit就是检查是否发送完成的标志,在STM32F1中,我们可以通过查询SR(状态寄存器)polli ...

感谢指教!
另外请教原子哥的代码中
    USART1->DR = (u8) ch;     
这个是做什么用的,在F0上也报错,F0中没有DR寄存器。这个DR寄存器是指数据寄存器吗?      
回复

使用道具 举报

1

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1183
金钱
1183
注册时间
2015-5-28
在线时间
149 小时
发表于 2017-3-14 16:50:32 | 显示全部楼层
Alvanbai 发表于 2017-3-14 16:30
感谢指教!
另外请教原子哥的代码中
    USART1->DR = (u8) ch;     

对,数据寄存器
回复

使用道具 举报

7

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2016-8-18
在线时间
28 小时
 楼主| 发表于 2017-3-14 17:12:45 | 显示全部楼层

那这个数据寄存器是发送的还是接收的呢?我看F0是分开的,分成了发送数据寄存器TDR和接受寄存器TDR,应该怎么对应呢。F1的官方文档里面没有说,谢谢前辈。
回复

使用道具 举报

1

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1183
金钱
1183
注册时间
2015-5-28
在线时间
149 小时
发表于 2017-3-14 17:46:41 | 显示全部楼层
Alvanbai 发表于 2017-3-14 17:12
那这个数据寄存器是发送的还是接收的呢?我看F0是分开的,分成了发送数据寄存器TDR和接受寄存器TDR,应该 ...

分开了就分开用,外设寄存器design不同也是很正常的事情,你最好找个官方的demo来看ST是怎么做的
回复

使用道具 举报

7

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2016-8-18
在线时间
28 小时
 楼主| 发表于 2017-3-15 10:11:12 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-18 08:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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