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

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

[复制链接]
wjandsq 发布时间: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, 下载次数: 6567)
收藏 9 评论17 发布时间:2014-4-16 14:38

举报

17个回答
Aegiss 回答时间:2016-7-27 13:29:58
caizhiwei 发表于 2015-1-19 16:58
请问楼主D+的1.5K电阻能直接上拉到V3.3吗?不用IO口控制。。。

可以,上拉D+为全速设备,上拉D-为低速设备,要作为高速设备使用时,才需要使用三极管控制上拉
fafa1 回答时间:2017-3-3 10:54:12
在研究一个使用STM32F101接收扫描枪输入的东西,学习一下,谢谢分享!
caizhiwei 回答时间:2015-1-19 16:58:12
请问楼主D+的1.5K电阻能直接上拉到V3.3吗?不用IO口控制。。。
tianyu22 回答时间:2014-9-17 23:34:01

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

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

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

将USB通讯数据包64字节大小的定义改为63字节,
可以解决64字节不响应的bug,以上所有例程都有这个bug
zhangkun2609 回答时间:2015-7-7 18:06:13
good
风之谷-2040681 回答时间:2016-1-28 09:31:02
谢谢楼主分享
alft 回答时间:2016-5-23 09:25:19
大爱楼主!!!!!!
一叶清风 回答时间:2017-9-9 15:33:27
谢谢
ToDo 回答时间:2017-12-20 21:14:33
謝謝樓主!最近也想嘗試STM的HID
路平 回答时间:2018-4-27 10:53:17
学习中
xheng 回答时间:2018-4-28 10:10:30
非常感谢了。
静水-394928 回答时间:2018-5-22 17:27:31
学习一下,不错的资源
a914002128 回答时间:2018-7-16 13:44:02
mask!!!!
12下一页

所属标签

相似分享

官网相关资源

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