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

F4不能在TIMER中断时做USB传送吗?

[复制链接]
潇潇雨歇pku 提问时间:2015-10-30 16:41 /
我在用STM32F401CB,使用TIMER2中断,中断时读取传感器数据,并通过USB传送回PC,以方便调试。但是我发现在中断内USB传送总是出错,传送的数据字节数是正确的,但是每一字节的内容都不对。在main中中测试过USB没有问题的。 进入USBD_CDC_TransmitPacket的数据是没有问题的,最后也return USB_OK了,单步调试也没找到问题,不懂USB协议。。。代码是cubeMX生成的,请大家帮我分析一下是啥问题。 代码如下:
  1. void TIM2_IRQHandler(void)
  2. {
  3.   /* USER CODE BEGIN TIM2_IRQn 0 */

  4.   /* USER CODE END TIM2_IRQn 0 */
  5.   HAL_TIM_IRQHandler(&htim2);
  6.   
  7.   /* USER CODE BEGIN TIM2_IRQn 1 */
  8.   
  9.   //从传感器读取PS1_H、PS1_L、PS2_H、PS2_L

  10.   /* send  data to USB */
  11.   /* defined for USB PS data transfer */
  12.   u8 debugM[4];
  13.   debugM[0] = PS1_H;
  14.   debugM[1] = PS1_L;
  15.   debugM[2] = PS2_H;
  16.   debugM[3] = PS2_L;
  17.   OutputDebugMessage((uint8_t *)debugM, 4);
  18.   /* USER CODE END TIM2_IRQn 1 */
  19. }

  20. /* send pbuff to USB, begin with 0x10, end with 0x100d */
  21. uint8_t OutputDebugMessage(uint8_t *pbuff, uint16_t length)
  22. {
  23.   if(length > 7)
  24.     return USBD_FAIL;
  25.   uint8_t pbuff_head_tail[10];
  26.   pbuff_head_tail[0] = (uint8_t)0x10;
  27.   int i = 0;
  28.   for(i = 0; i < length; i++)
  29.   {
  30.     pbuff_head_tail[i + 1] = (uint8_t)pbuff[i];
  31.   }
  32.   pbuff_head_tail[length + 1] = (uint8_t)0x10;
  33.   pbuff_head_tail[length + 2] = (uint8_t)0x0d;
  34.   USBD_CDC_SetTxBuffer(&hUsbDeviceFS, (uint8_t*)pbuff_head_tail, length + 3);
  35.   return USBD_CDC_TransmitPacket(&hUsbDeviceFS);
  36. }
复制代码


收藏 评论4 发布时间:2015-10-30 16:41

举报

4个回答
潇潇雨歇pku 回答时间:2015-10-30 16:42:17
每次传送4字节,我的传送函数会给数据加头和尾,总共就是7字节:10 xx xx xx xx 10 0d。中间4个是数据。
现在每次都接收到00 00 00 00 01 00 00


由于在main传送是正确的。所以可以把传感器数据设置成全局变量,在中断中读取,然后在main的while中去传送,这样是可以工作的,但是总感觉这么做很别扭。
creep 回答时间:2015-10-30 18:31:02
u8 debugM[4];设置为static或者全局变量试试。
在main的while中去传送应该不别扭吧,在中断中才不是最好的选择。
潇潇雨歇pku 回答时间:2015-10-30 19:38:52
creep 发表于 2015-10-30 18:31
u8 debugM[4];设置为static或者全局变量试试。
在main的while中去传送应该不别扭吧,在中断中才不是最好的 ...

我想的是在中断中读到了就立马发出去。不过在中断中放太多东西进去确实也不好。
试过全局变量,还是一样的。
creep 回答时间:2015-10-30 22:02:57
潇潇雨歇pku 发表于 2015-10-30 19:38
我想的是在中断中读到了就立马发出去。不过在中断中放太多东西进去确实也不好。
试过全局变量,还是一样 ...

如果全局变量还不行,那在调用下面的代码的时候要发送的数据是否正确。跟进去看下什么时候被修改了没有。
  1. USBD_CDC_SetTxBuffer(&hUsbDeviceFS, (uint8_t*)pbuff_head_tail, length + 3);
复制代码
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版