pccldr 发表于 2019-2-21 10:22:16

STM32F103C8 访问USB寄存器错误

第一次用这个MCU,工程是根据 freeRTOS 10.1 里面的例程修改过来,然后插入USB初始化代码。
但是不知道为什么,只要一访问USB寄存器空间(0x5000 0000 - 0x5003 FFFF USB OTG FS),就会进入HardFault_Handler中断。
Keil 里面调试也是访问不到 这块的寄存器,请各位大神帮忙,看看是哪里初始化没做好?




<blockquote>int main(void)

pccldr 发表于 2019-2-21 10:24:39

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 );
}

toofree 发表于 2019-2-21 11:38:41

是硬件调试,还是软件模拟调试的?
STM32F103C8没有USB OTG,F105、F107才有OTG

0x5000 0000 - 0x5003 FFFF地址是USB OTG FS
F103只有0x4000 5C00 - 0x4000 5FFF USB device FS registers










pccldr 发表于 2019-2-21 13:07:10

哦,原来如此,这个是 OTG的空间,那我换device初始化代码试试。
页: [1]
查看完整版本: STM32F103C8 访问USB寄存器错误