我正在使用ST STM32F101xB和μC/ OS-II,我在旧主板上安装了外部时钟(HSE)并且运行正常。我们想在新的主板上使用内部时钟(HSI),然而,RTOS(Appmaintask())不能使用内部时钟运行,我已经改变了我的代码如下,任何想法改变的原因是什么:
void BSP_Init (void)
{
RCC_DeInit();
//RCC_HSEConfig(RCC_HSE_ON);
//RCC_WaitForHSEStartUp();
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1); // APB2 clock divide by 1 => 64MHz
RCC_PCLK1Config(RCC_HCLK_Div2); // APB1 clock divide by 2 => 32MHz
FLASH_SetLatency(FLASH_Latency_2);
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
//RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_8); // 64MHz
RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_8);
RCC_PLLCmd(ENABLE);
RCC_LSEConfig(RCC_LSE_OFF);
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {
;
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while (RCC_GetSYSCLKSource() != 0x08) {
;
}
//Set the Vector Table base location at 0x08000000
//NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
// Need to finalize and arange priority for each interrupts in future,
// So that 1 interrupt wont blocks another interrupt.
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
}
void main()
{
INT8U err;
cpuObj = new Cstm32f10x();
BSP_Init();
BSP_IntDisAll(); /* Disable all ints until we are ready to accept them. */
OSInit();
err = OSTaskCreateExt (AppMainTask,
(void *)0,
(OS_STK *)&AppMainTaskStk[APP_MAIN_TASK_STK_SIZE-1],
APP_MAIN_TASK_PRIO,
APP_MAIN_TASK_ID,
(OS_STK *)&AppMainTaskStk[0],
APP_MAIN_TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSStart(); // Start multitasking (i.e. give control to uC/OS-II)
}
void AppMainTask (void *p_arg)
{
OS_CPU_SysTickInit();
while(TRUE)
{
OSTimeDly(1);
}
}
感谢。
答案 0 :(得分:0)
通常在ST / ARM提供的CMSIS启动代码中执行PLL的设置。在调用 main()
之前,此代码作为运行时环境启动的一部分执行。我建议您使用此代码进行芯片初始化,因为静态数据初始化和静态对象构造函数在 main()
之前运行,并且会在可能的关键初始化之前运行。
STM32 Standard Peripheral Library中包含具有Cortex-M3内核和STM32F1xx特定设备支持的CMSIS。实际完成工作的文件是system_stm32f10x.c。您在BSP_Init()
中执行的其他功能(如闪存延迟)也由CMSIS启动代码处理。即使您自定义此代码,我强烈建议您使用早期环境初始化的这种方法。
另一种可能性是使用STM32CubeMX实用程序生成配置代码。这似乎是对现在显而易见的STM32 MicroXplorer实用程序的替代。