10. USB
A. USB_OTG
1) 客户使用 STM32 的 的 DFU 原工程时需要注意几点
解
决
方
法
1 1 、 在 在 usb_istr.c 中 , 增加如下图红色字体语句
for (i=0;i<8;i++) EP[i] = _GetENDPOINT(i);
for (i=0;i<8;i++)
_SetENDPOINT (i, EP[i] & 0x7070);
2 2 、 在 在 usb_conf.h 中 , 按照下图红色字体语句 进行修改
#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD)||
defined(STM32L1XX_MD_PLUS)
#define INTERN_FLASH_SECTOR_ERASE_TIME 100
#define INTERN_FLASH_SECTOR_WRITE_TIME 104
#else
#define INTERN_FLASH_SECTOR_ERASE_TIME 100
#defin e INTERN_FLASH_SECTOR_WRITE_TIME 100
3 、 把固件库中的 stm32f10x_flash.c 使用附件的进行替换 。
4 4 、 软件进行读保护位时需要选使用 FLASH_Unlock(); 函数
int main(void)
{
#if defined (USE_STM32L152D_EVAL)
FLASH_Unlock();
FLASH_ClearFlag(FLASH_FLAG_OPTVERRUSR);
#endif
FLASH_Unlock();
FLASH_ReadOutProtection(ENABLE);
FLASH_Lock();
2) 部分 USB 兼容性
解
决
方
法
1. 部分 U U 盘有 3 3 个端点 , 数组越界导致 c Itf_Desc 被清空 , 所以主机不能识别设备
类型。 。h USBH_conf.h 文件的 S USBH_MAX_NUM_ENDPOINTS 的定义由 2 2 改成 3 3 就可以了
将 : #define USBH_ MAX_NUM_ENDPOINTS 2 2
改为 : #define USBH_MAX_NUM_ENDPOINTS 3 3
2. 在 在 n In 端点中断处理程序 R USB_OTG_USBH_handle_hc_n_In_ISR 中 , 对于 K NAK 中断 ,
0 V1.0.0 版本的处理如下 :
else if (hcint.b.nak)
{
if(hcchar.b.eptype == EP_TYPE_INTR)
{ {
UNMASK_HOST_INT_CHH (num);
USB_OTG_HC_Halt(pdev, num);
CLEAR_HC_INT(hcreg , nak);
} }
else if ((hcchar.b.eptype == EP_TYPE_CTRL)||
(hcchar.b.eptype == EP_TYPE_BULK))
{ {
/* re- - activate the channel */
hcchar.b.chen = 1;
hcchar.b.chdis = 0;
USB_OTG_WRITE_REG3 2(&pdev- - >regs.HC_REGS[num]- - >HCCHAR, hcchar.d32);
} }
pdev- - >host.HC_Status = HC_NAK;
} }
而 0 V2.1.0 版本的 K NAK 处理过程如下 :
else if (hcint.b.nak)
{
if(hcchar.b.eptype == EP_TYPE_INTR)
{ {
UNMASK_HOST_INT_CHH (num);
USB_OTG_HC_Halt(pdev, num );
} }
else if ((hcchar.b.eptype == EP_TYPE_CTRL)||
(hcchar.b.eptype == EP_TYPE_BULK))
{ {
/* re- - activate the channel */
hcchar.b.chen = 1;
hcchar.b.chdis = 0;
USB_OTG_WRITE_REG32(&pdev- - >regs.HC_REGS[num]- - >HCCH AR, hcchar.d32);
} }
pdev- - >host.HC_Status[num] = HC_NAK;
CLEAR_HC_INT(hcreg , nak);
} }
唯一的区别就是 CLEAR_HC_INT(hcreg , nak) 的位置 ,在 在 0 V1.0.0 版本中对于 L CTRL 和
K BULK 端点的 K NAK 中断没有清除 NAK , 我们的芯片会因此产生多次 N IN 传输的请求 , 导
致数据传输错 误 。 改为 1 V2.1.1 的写法后传输正常 。( ( 注意 s HC_Status 在 在 0 V2.1.0 是数
组 ,在 在 0 V1.0.0 是单个数据 , 直接拷贝的话要去掉后面的 [num] )
B. USB 外设的工作频率有限制
描述 有最低工作频率的要求,也就是 APB1 分频后的时钟必须大于 12MHz,比如
HCLK 为 56MHz,APB1 的最大分频系数为 4,56/4 = 14MHz,可以正常工作。 |