10105|3

62

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

stm32串口printf中断发送实现方法 [复制链接]

我手上有一个stm32的例程是关于printf中断发送的,我看里面的程序没看明白是怎么触发中断的。
例程中printf发送是需要这两个定义的
#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */


/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  * @by     WWW.ARMJISHU.COM
  */
PUTCHAR_PROTOTYPE
{
  /* ARMJISHU 零等待的Printf串口打印函数将数据
            写入Buffer后立即返回(Buffer未满时) */
  USART_StoreBufferData((uint8_t) ch);

  return ch;
}

使用printf会调用上面的函数,接着调用USART_StoreBufferData((uint8_t) ch) ;

/**
  * @brief  put char to the Tx Buffer
            将来自printf的数据写入Buffer,
  * @param  None
  * @retval None
  * @by     WWW.ARMJISHU.COM
  */
void USART_StoreBufferData(uint8_t ch)
{
    while(TxCounter == USART_TX_DATA_SIZE);
    if(TxCounter < USART_TX_DATA_SIZE)
    {
        /* Write one byte to the transmit data register */
        USART_Tx_Buffer[USART_Tx_ptr_Store++] = ch;
        USART_Tx_ptr_Store = USART_Tx_ptr_Store & 0xFF;
        TxCounter++;
    }
    USART_ITConfig(EVAL_COMx, USART_IT_TXE, ENABLE);
}

在这个函数里只是把变量ch传到了USART_TX_Buffer中并在下面使能了串口发送中断并没有触发。
void USARTx_IRQHandler(void)
{
  if (USART_GetITStatus(USARTx, USART_IT_RXNE) != RESET)
  {
    /* received data */
    USART_GetInputString();
  }

  /* If overrun condition occurs, clear the ORE flag
                              and recover communication */
  if (USART_GetFlagStatus(USARTx, USART_FLAG_ORE) != RESET)
  {
    (void)USART_ReceiveData(USARTx);
  }

  if(USART_GetITStatus(USARTx, USART_IT_TXE) != RESET)
  {   
    /* Write one byte to the transmit data register */

  }

这是串口中断处理函数里面调用了一个发送函数 USART_SendBufferData();

void USART_SendBufferData(void)
{
    if(TxCounter > 0)
    {
        /* Write one byte to the transmit data register */
        USART_SendData(EVAL_COMx, USART_Tx_Buffer[USART_Tx_ptr_Out++]);
        TxCounter--;
        USART_Tx_ptr_Out = USART_Tx_ptr_Out & 0xFF;
    }
    else
    {
      /* Disable the EVAL_COM1 Transmit interrupt */
      USART_ITConfig(EVAL_COMx, USART_IT_TXE, DISABLE);
    }
}

其它与发送有关的函数就没有了,程序中并没有看到怎么触发中断的,有知道的吗能给解释一下吗,谢谢了。使用的是神舟王开发板,例程是神舟IV的例程。
此帖出自stm32/stm8论坛

最新回复

你的这个工程能给我一份吗? 40259574@qq.com  详情 回复 发表于 2015-10-21 13:48
点赞 关注
 

回复
举报

134

帖子

0

TA的资源

一粒金砂(高级)

沙发
 
来学习一下程序开发!
此帖出自stm32/stm8论坛
 
个人签名深圳LED显示屏厂家www.gtek.hk全彩LED显示屏
 

回复

62

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
这个问题解决了,只要改变一下中断事件就行了,改成这个USART_IT_TXE就可以在开始打开中断的时候就能进入中断。直接就可以在串口中断函数里发送数据了
此帖出自stm32/stm8论坛
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
你的这个工程能给我一份吗? 40259574@qq.com
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表