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

【MCU实战经验】+ 利用ST官方STM32_USB-FS-Device_Lib_V4.0.0例程实现USB-TO-TTL232的数据包添加智能换行的功能。  

[复制链接]
王建 发布时间:2014-4-16 14:38
STM32的USB中断是1ms执行一次,ST官方的代码并不立即将收到的数据发往USB主机,而是定义了一个接收缓冲,接收缓冲的存在就是避免漏接字符,在回调函数中5ms发送一次数据到USB主机,这个时间间隔使得STM32有足够的时间USB主机传输数据。RS485的情况需另行考虑。注意这是在STM32中实现超时自动添加换行字符,由于Windows并非实时系统,想要在Windows上位机中实现这个功能,那将是几乎是不可能完成的任务。

在ST官方例程Virtual_COM_Port中增加的函数如下
/*******************************************************************************
* Function Name  : TIMx_Base_Configration
* Description    : 定时器基础应用配置
* Input          : TIMx,Period,TIM_Prescaler
* Output         : None.
* Return         : None.
*******************************************************************************/
void TIMx_Base_Configration(TIM_TypeDef* TIMx, uint16_t Period, uint16_t TIM_Prescaler)
{
    // TIM_Prescaler  72 分频则为1M, 计数加1为1us, 7200分频则为10K, 计数加1为100us
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 
    TIM_TimeBaseStructure.TIM_Period = Period - 1;                 // 定时器计时总数,最大65535
    TIM_TimeBaseStructure.TIM_Prescaler = TIM_Prescaler - 1;       // 定时器预分频
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;        // 定时器时钟输入分频
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;    // 向上计数模式
    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructure);                // 初始化定时器
 
    TIM_ClearFlag(TIMx, TIM_FLAG_Update);                          // 清除中断标志
    TIM_ITConfig(TIMx, TIM_IT_Update, ENABLE);                   // 使能定时器中断
 
    TIM_SetCounter(TIMx, 0);  // 设置定时器初始值
    TIM_Cmd(TIMx, ENABLE); 

 
 
  /* Enable TIM2 clocks */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 使能定时器2
  TIMx_Base_Configration(TIM2, 10, 7200);  // 设定周期为1ms
 
 
/*******************************************************************************
* Function Name  : EVAL_COM1_IRQHandler
* Description    : This function handles EVAL_COM1 global interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void EVAL_COM1_IRQHandler(void)
{
  if (USART_GetITStatus(EVAL_COM1, USART_IT_RXNE) != RESET)
  {
    /* Send the received data to the PC Host*/
    USART_To_USB_Send_Data();
 
    /*
    最后两个字节为0x0d,0x0a, 这是一个符合微软标准的换行字符
    如果最后两个字节不为0x0d,0x0a, 超时1毫秒则自动添加0x0d,0x0a
    */
    last_char[0] = last_char[1];
    last_char[1] =  USART_Rx_Buffer[USART_Rx_ptr_in-1];
    if((last_char[0] == 0x0d)&&(last_char[1] == 0x0a)){
        Flag_CR_CN = 0;
        TIM_Cmd(TIM2, DISABLE);
    }else{
        TIM_SetCounter(TIM2, 0);
        TIM_Cmd(TIM2, ENABLE);
        Flag_CR_CN = 1;
    }
  }
 
  /* If overrun condition occurs, clear the ORE flag and recover communication */
  if (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_ORE) != RESET)
  {
    (void)USART_ReceiveData(EVAL_COM1);
  }
}
/*******************************************************************************
* Function Name  : TIM2_IRQHandler 
* Description    : This function handles TIM2 global interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
 
 
void TIM2_IRQHandler(void)
{
    TIM_Cmd(TIM2, DISABLE);
    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    if(Flag_CR_CN){
        Flag_CR_CN = 0;
 
        USART_Rx_Buffer[USART_Rx_ptr_in] = 0x0d;
        USART_Rx_ptr_in++;
        if(USART_Rx_ptr_in == USART_RX_DATA_SIZE)
        {
            USART_Rx_ptr_in = 0;
        }
        USART_Rx_Buffer[USART_Rx_ptr_in] = 0x0a;
        USART_Rx_ptr_in++;
        if(USART_Rx_ptr_in == USART_RX_DATA_SIZE)
        {
            USART_Rx_ptr_in = 0;
        }
    }
}

 
基于ST官方原版例程Virtual_COM_Port修改,添加智能换行功能
下载地址  STM32_USB-FS-Device_Lib_V4.0.0(智能换行).rar (5.65 MB, 下载次数: 6531)
收藏 9 评论17 发布时间:2014-4-16 14:38

举报

17个回答
tianyu22 回答时间:2014-9-17 23:34:01

回复:【MCU实战经验】+ 利用ST官方STM32_USB-FS-Device_Lib_V4.0.0例程实现USB-TO-TTL232的数据包添加智能换行的功能

我也在搞虚拟串口。。。老出问题。。。想找个新点的库
王建 回答时间:2014-9-18 18:08:10

将64字节的定义改为63字节,可以解决64字节不响应的bug,以上所有例程都有这个bug

将USB通讯数据包64字节大小的定义改为63字节,
可以解决64字节不响应的bug,以上所有例程都有这个bug
caizhiwei 回答时间:2015-1-19 16:58:12
请问楼主D+的1.5K电阻能直接上拉到V3.3吗?不用IO口控制。。。
zhangkun2609 回答时间:2015-7-7 18:06:13
good
风之谷-2040681 回答时间:2016-1-28 09:31:02
谢谢楼主分享
alft 回答时间:2016-5-23 09:25:19
大爱楼主!!!!!!
Aegiss 回答时间:2016-7-27 13:29:58
caizhiwei 发表于 2015-1-19 16:58
请问楼主D+的1.5K电阻能直接上拉到V3.3吗?不用IO口控制。。。

可以,上拉D+为全速设备,上拉D-为低速设备,要作为高速设备使用时,才需要使用三极管控制上拉
sfd123-302670 回答时间:2017-3-3 10:54:12
在研究一个使用STM32F101接收扫描枪输入的东西,学习一下,谢谢分享!
一叶清风 回答时间:2017-9-9 15:33:27
谢谢
12下一页

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版