STM32F103C8 访问USB寄存器错误
第一次用这个MCU,工程是根据 freeRTOS 10.1 里面的例程修改过来,然后插入USB初始化代码。但是不知道为什么,只要一访问USB寄存器空间(0x5000 0000 - 0x5003 FFFF USB OTG FS),就会进入HardFault_Handler中断。
Keil 里面调试也是访问不到 这块的寄存器,请各位大神帮忙,看看是哪里初始化没做好?
<blockquote>int main(void)
int main(void)
{
BoardLowInit();
GpioInit();
Uart1Init();
USBD_INIT(); for (;;);
}
void BoardLowInit( void )
{
/* Reset the RCC clock configuration to the default reset state(for debug purpose) */
/* Set HSION bit */
RCC->CR |= (uint32_t)0x00000001;
RCC->CFGR &= (uint32_t)0xF0FF0000;
/* Reset HSEON, CSSON and PLLON bits */
RCC->CR &= (uint32_t)0xFEF6FFFF;
/* Reset HSEBYP bit */
RCC->CR &= (uint32_t)0xFFFBFFFF;
/* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
RCC->CFGR &= (uint32_t)0xFF80FFFF;
/* Disable all interrupts and clear pending bits*/
RCC->CIR = 0x009F0000;
SCB->ExceptionTableOffset = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
ClockInit();
}
void ClockInit (void)
{
/* Start with the clocks in their expected state. */
RCC_DeInit();
SystemCoreClock = HSI_VALUE;
ulwSystemTickms = 0;
ulwSystemTickus = 0;
/* Enable HSE (high speed external clock). */
RCC_HSEConfig( RCC_HSE_ON );
/* Wait till HSE is ready. */
while( RCC_GetFlagStatus( RCC_FLAG_HSERDY ) == RESET )
{
}
/* 2 wait states required on the flash. */
*( ( unsigned long * ) FLASH_BASE ) = 0x02;
/* HCLK = SYSCLK */
RCC_HCLKConfig( RCC_SYSCLK_Div1 );
/* PCLK2 = HCLK */
RCC_PCLK2Config( RCC_HCLK_Div1 );
/* PCLK1 = HCLK/2 */
RCC_PCLK1Config( RCC_HCLK_Div2 );
/* PLLCLK = 8MHz * 9 = 72 MHz. */
RCC_PLLConfig( RCC_PLLSource_HSE_Div1, RCC_PLLMul_9 );
/* Enable PLL. */
RCC_PLLCmd( ENABLE );
/* Wait till PLL is ready. */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
/* Select PLL as system clock source. */
RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK );
/* Wait till PLL is used as system clock source. */
while( RCC_GetSYSCLKSource() != 0x08 )
{
}
/* Enable GPIOA, GPIOB, GPIOC, GPIOD, GPIOE and AFIO clocks */
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC
| RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE );
/* SPI2 Periph clock enable */
RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE );
/* Set the Vector Table base address at 0x08000000 */
NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0 );
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
/* Configure HCLK clock as SysTick clock source. */
SysTick_CLKSourceConfig( SysTick_CLKSource_HCLK );
RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);
RCC_ADCCLKConfig(RCC_PCLK2_Div2);
SystemCoreClock = 72000000;
// RCC_APB1PeriphClockCmd( RCC_APB1Periph_ALL, ENABLE );
// RCC_APB2PeriphClockCmd( RCC_APB2Periph_ALL, ENABLE );
}
void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Configure SOF VBUS ID DM DP Pins */
GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_11 |
GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB1PeriphClockCmd( RCC_APB1Periph_USB, ENABLE );
}
是硬件调试,还是软件模拟调试的?
STM32F103C8没有USB OTG,F105、F107才有OTG
0x5000 0000 - 0x5003 FFFF地址是USB OTG FS
F103只有0x4000 5C00 - 0x4000 5FFF USB device FS registers
哦,原来如此,这个是 OTG的空间,那我换device初始化代码试试。
页:
[1]