OpenEdv-开源电子网

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

求指导:关于printf的重映射与串口中断

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2012-6-4
在线时间
0 小时
发表于 2012-8-5 14:26:36 | 显示全部楼层 |阅读模式

今天利用库函数写rtc日历的程序,写到时间设定的时候遇到了问题,设置的时间要好发送好几次才能设定成功,查了下原因,原来是我开了串口的发送和接收中断,而且单片机一直在向串口发送信息,因此会经常进入中断服务程序,导致发送的时间值都被中断接收了而没有被下面的程序接收到:
    while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)  {}//等待
    tmp[index++] = (USART_ReceiveData(USART1));//接收即时数据
于是我对这段程序进行了修改,如下
    USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
    USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);//为完成接收,关闭usart接收和发送中断
    /* Loop until RXNE = 1 */
    while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET) {}//等待
    tmp[index++] = (USART_ReceiveData(USART1));//接收即时数据

    USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//完成接收,开启usart接收和发送中断

这样就可以保证顺利接收设置的时间数据

但是,看到这里我又想起了printf的重映射,重写的putchar函数:
    while((USART1->SR&0X40)==0);//按说检测到发送寄存器空会进入中断的,但是为什么没有呢???   
    USART1->DR = (u8) ch;   

为什么这个的发送不会进入串口的中断服务程序,而可以一直发送到结束呢,难道内部有什么特殊的机制?

成为一名优秀的电子工程师,致力于电子产品的智能化和人性化!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-8-5 15:58:22 | 显示全部楼层
楼主的问题:
发送-->进入中断-->导致时间设置不成功.

楼主解决办法:
发送-->不进入中断-->设置成功.

楼主的郁闷:
为什么发送又不进入中断了?

答案:直接用修改前的代码即可.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2012-6-4
在线时间
0 小时
 楼主| 发表于 2012-8-5 19:17:39 | 显示全部楼层
回复【2楼】正点原子:
-------------------------------
那原子哥,为什么printf使用串口发送数据发送寄存器空以后不进入发送中断呢?
成为一名优秀的电子工程师,致力于电子产品的智能化和人性化!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-8-5 19:34:44 | 显示全部楼层
你要开启中断才能进入啊.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2012-6-4
在线时间
0 小时
 楼主| 发表于 2012-8-6 01:02:44 | 显示全部楼层
哦,我想起来了,我在在发送完成后,在终端里面把发送的中断使能位清除了,嘿嘿,谢谢指点啊~~~
成为一名优秀的电子工程师,致力于电子产品的智能化和人性化!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-22 01:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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