8.对于上面的第7点,这些文件中有些功能是不适合CANNON板的,这时需要把他们注释掉,例如bsp.c中对LED的控制,STM32F401RE中并没有GPIOI,这是可以把这些函数的内容给注释掉;
9. 系统时钟需要配置正确,下面来说说STM32F401的时钟
STM32F4可以使用三种不同的时钟源来驱动系统时钟(SYSCLK):
- HSI振荡器时钟
- HSE振荡器时钟
- 主PLL (PLL)时钟
除此之外,还有两个次级时钟:
STM32F401时钟系统结构图请参考STM32F4的Reference manual。
(1)HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~26MHz。
(2)HSI 时钟信号由内部16 MHz RC振荡器生成,可直接用作系统时钟,或者用作 PLL 输入。
(3)STM32F4xx 器件具有两个PLL:
主PLL(PLL)由HSE或HSI振荡器提供时钟信号,并具有两个不同的输出时钟:
第一个输出用于生成高速系统时钟(最高达 168 MHz)
第二个输出用于生成USB OTG FS的时钟(48 MHz)、随机数发生器的时钟(48 MHz)和SDIO时钟( 48 MHz)。
配置要点:由于在PLL使能后主PLL配置参数便不可更改,所以建议先对PLL进行配置,然后再使能(选择HSI或HSE振荡器作为PLL时钟源,并配置分频系数M、N、P和Q)。
(3)LSE晶振是32.768 kHz低速外部(LSE)晶振或陶瓷谐振器,可作为实时时钟外设(RTC) 的时钟源来提供时钟/日历或其它定时功能,具有功耗低且精度高的优点。
(4)LSI RC可作为低功耗时钟源在停机和待机模式下保持运行,供独立看门狗(IWDG) 和自动唤醒单元(AWU)使用。时钟频率在32 kHz左右。
系统时钟SYSCLK,它是供STM32中绝大部分部件工作的时钟源。系统时钟可选择为PLL输出、HSI或者HSE。系统时钟最大频率为84MHz,它通过AHB分频器分频后送给各模块使用,AHB分频器可选择1、2、4、8、16、64、128、256、512分频。其中AHB分频器输出的时钟送给5大模块使用:
- 送给AHB总线、内核、内存和DMA使用的HCLK时钟。
- 通过8分频后送给Cortex的系统定时器时钟。
- 直接送给Cortex的空闲运行时钟FCLK。
- 送给APB1分频器。APB1分频器可选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率42MHz),另一路送给定时器(timer)2、3、4、5倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器2、3、4、5使用。
- 送给APB2分频器。APB2分频器可选择1、2、4、8、16分频,其输出一路供APB2外设使用(PCLK2,最大频率84MHz),另一路送给定时器(Timer)1、9、10、11倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器1,9,10,11使用。另外,APB2分频器还有一路输出供ADC分频器使用,分频后送给ADC模块使用。ADC分频器可选择为2、4、6、8分频。
uCOS-II中为CANNON配置系统时钟
主要代码如下
- /* 配置系统时钟 */
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;//使用HSI时钟源
- RCC_OscInitStruct.HSIState = RCC_HSI_ON;
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
- RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; //使用HIS作为PLL的时钟源
- RCC_OscInitStruct.PLL.PLLM = 16u;
- RCC_OscInitStruct.PLL.PLLN = 336u; /* PLLCLK = HSI * (PLLN / PLLM) = 336MHz. */
- RCC_OscInitStruct.PLL.PLLP = 4u; /* SYSCLK = PLLCLK / PLLP = 84MHz. */
- RCC_OscInitStruct.PLL.PLLQ = 7u; /* OTG_FSCLK = PLLCLK / PLLQ = 48MHz. */
- HAL_RCC_OscConfig(&RCC_OscInitStruct);
- /* 配置外设时钟 */
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK |
- RCC_CLOCKTYPE_HCLK |
- RCC_CLOCKTYPE_PCLK1 |
- RCC_CLOCKTYPE_PCLK2;
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
- /* HCLK = AHBCLK = PLL / AHBPRES(1) = 84MHz. */
- RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
- /* APB1CLK = AHBCLK / APB1DIV(2) = 42MHz (max). */
- RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
- /* APB2CLK = AHBCLK / APB2DIV(2) = 42MHz. */
- RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
复制代码
刚开始学习STM32和uCOS,不知上面说的对不对,请
论坛内各路大神不惜赐教。
`