在线时间475 小时
UID3069928
ST金币0
蝴蝶豆8
注册时间2015-1-6
论坛元老
- 最后登录
- 2020-12-9
|
发表于 2017-12-19 21:14:00
|
显示全部楼层
a0a.1 32b0c
问题1:案例中USB传输数据时,为什么会出现卡顿现象?以及如何解决?
出现问题时流程大致如下:
1> 在mian函数中发送数据CDC_Transmit_FS()
2> USBD_CDC_TransmitPacket()
3> USBD_LL_Transmit()
4> HAL_PCD_EP_Transmit()
5> __HAL_LOCK(hpcd); 此时成功获取互斥锁
6> 恰好此时有一个接收中断,由于USB中断具有优先级,跳转到接收中断内执行;同时,USB核会自动关闭OUT端点;
7> HAL_PCD_DataOutStageCallback()
8> USBD_CDC_DataOut()
9> CDC_Receive_FS()
10> USBD_CDC_ReceivePacket()
11> USBD_LL_PrepareReceive()
12> HAL_PCD_EP_Receive()
13> __HAL_LOCK(hpcd); 此时获取互斥锁失败导致返回,接收函数在OUT端点没有再次打开就已经提前结束,导致接收循环无以为继。
由于此问题是发送与接收处于不同优先等级导致资源冲突所致,那么我们可以将发送也放到与USB接收中断相同的中断等级中去,例如可以利用USB的EOPF中断,在开启EOPF中断后,在此中断内发送数据,这样发送与接收中断就处于相同等级了,EOPF每1ms触发一次,速度完全可以。当然开启一个相同优先级的定时器来做发送数据也是可以,只不过定时器间隔得控制好。
此外,其实此问题是出现在Cube库的低版本中,例如CubeF4 V1.5.0和CubeF2 V1.3.0中都存在,但是在最新本的CubeF4 V1.16.0,CubeF2 V1.6.0版本中此问题得到了解决;此问题虽然后来发现是版本太旧所致,但从多个客户反馈此问题来看,此问题依然不失为一个很好的参考和教训。
问题2:案例中,常用的测量STM32L低功耗模式下的唤醒时间方法是什么?
使用不同时钟下LPUART 的方法
问题3:案例中提到,基于Gcc和Eclipse的集成开发环境有哪两种?并简要说明其优势
基于Gcc和Eclipse的集成开发环境SW4STM32和TrueSTUDIO
免费且容易使用,接近IAR/KEIL的用户体验,能够进行STM32全系列开发但不受代码大小限制,而且具有跨平台的优势。
|
|