|
本帖最后由 1sfsfsadfa 于 2019-6-5 09:30 编辑 1、将STM32F1的库函数晶振配置的地方修改。如图
2、Systick定时器初始化。
3、FreeRTOS时钟节拍设置为 #define configTICK_RATE_HZ (1000) //时钟节拍频率,这里设置为1000,周期就是1ms 4、通过任务调度,发现时钟节拍时间不对。
5、理论上我要定时在1s一次。
求助大佬帮忙看看。 |
微信公众号
手机版
你还需要把stm32f10x.h里面的HSE_VALUE修改为16M
完成上述工作之后你的时基就是准确的72M,这样你的RTOS的时间就准了。
评分
查看全部评分
上述情况是我已经改了 #define HSE_VALUE ((uint32_t)16000000) /*!< Value of the External oscillator in Hz */
https://www.stmcu.org.cn/module/forum/thread-614091-1-1.html
评分
查看全部评分
不准就不准呗,带操作系统的软件定时都不准,大体上没问题就行了。要准的话,用硬件定时器中断方式。
上位机不是实时系统,在串口界面显示的时间误差本来就大。要想得到准确的时间,请用逻辑分析仪抓数据波形。
评分
查看全部评分
要比较准确的检查定时,简单写个1秒钟翻转的GPIO,然后用示波器或频率计检查。
评分
查看全部评分
评分
查看全部评分
好方法。方便。
// /* Configure PLLs ------------------------------------------------------*/
// /* PLL2 configuration: PLL2CLK = (HSE / 2) * 8 = 64 MHz */
// /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 8 = 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_DIV2 | RCC_CFGR2_PLL2MUL8 |
// RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV8);
//
// /* Enable PLL2 */
// RCC->CR |= RCC_CR_PLL2ON;
// /* Wait till PLL2 is ready */
// while((RCC->CR & RCC_CR_PLL2RDY) == 0)
// {
// }
//
//
// /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */
// RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
// RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 |
// RCC_CFGR_PLLMULL9);
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1_Div2 | RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLMULL9);
#else
评分
查看全部评分