|
stm32芯片的设计确实很恶心简单举两个例子:
1. STM32F103芯片的USB和CAN中断和RAM共用,导致无法同时使用USB和CAN。
2.STM32F105芯片的USB的从机需要接VBUS脚,而103的不用接都可以;103的软连接的通过IO端口控制的,而105的却是内部上拉电阻。
这些问题导致了从STM32的103系列转到105时是不兼容的。USB部分代码还必须重新移植,这样的设计真的很恶心。
STM32不管是那个系列都为我们提供了例程,这一点来说大大减小了使用STM32的难道,下面我们简单的说说STM32的USB移植是需要注意的几点。
1. 首先应该注意更改外部晶振值,让实际与软件中的值相同:
#define HSE_VALUE ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */ (stm32f10x.h文件)
2. 设置内核时钟,我们一般都设置为72MHz:
#define SYSCLK_FREQ_72MHz 72000000 (system_stm32f10x.c文件)
3. 设置USB时钟,这个固定在48MHz(usb_desc.c文件):
/* Configure PLLs ------------------------------------------------------*/
/* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
/* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV3 | RCC_CFGR2_PLL2MUL10 |
RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
4. 设置断点的收发尺寸(最大64字节):
0x03, /* bmAttributes: Interrupt endpoint */
0x40, /* wMaxPacketSize: 64 Bytes max */
0x00,
0x01, /* bInterval: Polling Interval (10 ms) */
/* 34 */
0x07, /* bLength: Endpoint Descriptor size */
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */
/* Endpoint descriptor type */
0x01, /* bEndpointAddress: */
/* Endpoint Address (OUT) */
0x03, /* bmAttributes: Interrupt endpoint */
0x40, /* wMaxPacketSize: 64 Bytes max */
0x00,
0x01,
5. 必须同时修改以下几个地方的值与4设置相同():
/* EP0 is already configured in DFU_Init() by USB_SIL_Init() function */
/* Init EP1 IN as Interrupt endpoint */
OTG_DEV_EP_Init(EP1_IN, OTG_DEV_EP_TYPE_INT, 64);
/* Init EP1 OUT as Interrupt endpoint */
OTG_DEV_EP_Init(EP1_OUT, OTG_DEV_EP_TYPE_INT, 64);
SetBTABLE(BTABLE_ADDRESS);
/* Initialize Endpoint 0 */
SetEPType(ENDP0, EP_CONTROL);
SetEPTxStatus(ENDP0, EP_TX_STALL);
SetEPRxAddr(ENDP0, ENDP0_RXADDR);
SetEPTxAddr(ENDP0, ENDP0_TXADDR);
Clear_Status_Out(ENDP0);
SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);
SetEPRxValid(ENDP0);
/* Initialize Endpoint 1 */
SetEPType(ENDP1, EP_INTERRUPT);
SetEPRxAddr(ENDP1, ENDP1_RXADDR);
SetEPRxCount(ENDP1, 64);
SetEPRxStatus(ENDP1, EP_RX_VALID);
SetEPType(ENDP1, EP_INTERRUPT);
SetEPTxAddr(ENDP1, ENDP1_TXADDR);
SetEPTxCount(ENDP1, 64);
SetEPTxStatus(ENDP1, EP_TX_NAK);
6. 软连接设置(usb_pwr.h文件)
#define USB_DCT_PIN (GPIO_Pin_13) // PC13
#define USB_DCT_PORT (GPIOC) // GPIOC
#define USB_DCT_CLK (RCC_APB2Periph_GPIOC) //
需要注意STM32F105/107是不需要设置这个管脚的,但是103必须设置。
7. 中断设置(stm32f10x_it.c文件)
void OTG_FS_IRQHandler(void) // 105/107
{
STM32_PCD_OTG_ISR_Handler();
}
void USB_LP_CAN1_RX0_IRQHandler(void) // 103
{
USB_Istr();
}
需要特别注意的事103和105/107的程序是不同的,不能兼容,但105和107是兼容的。以上几个部分更改后基本上USB就可以正常工作了,您不防试试。
|
赞赏
-
1
查看全部赞赏
-
|