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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版