最近的项目想用标准库调配实时任务,做到类似RTOS的效果,用到10个定时器~
没想到配置定时器1就遇到了问题,我需要一个1ms的中断,定时器有168MHz的主频,168分频,再设定1000的自动重装载,更新中断自然就是1kHz了吧
然而实际测试糗大了,同事一眼就看出---我的中断10ms才来一个!
好在手边有一块开发板,在最小系统上跑我的程序,中断变快了,看来软件是没有问题的,那么硬件哪里出了问题?对照开发板的原理图才发现,我的12M外部晶振的匹配电容贴错了,晶振没有起振。换上两个20pF的电容之后,晶振就有了波形~
如果程序配置了外部晶振,但晶振没有起来,单片机的时钟就换到了内部高速时钟我这颗M4内核芯片的内部时钟是16M的,刚好是我计划的168MHz的1/10呀,怪不得中断慢了十倍。所有的任务都慢十倍,也不是不能跑。等我开始调OTG功能就要露馅了
本以为问题就圆满解决了,没想到。。。同事说我的1ms中断时间也不对!实际测起来比1ms快多了而且在开发板上没有这样的问题
原来开发板使用的8M外部晶振,和我的12M还是有区别,看来PLL需要再调节了。
标准库默认是8MHz的外部晶振除以8,再乘336,再除以2,得到168MHz,放到我大1.5倍的晶振上,相当于超频了
最终改了3处地方,PLL_B值,设计成了我的晶振频率,直接分频出1MHz;另外HSE的宏定义也要按着晶振来;硬件就是注意晶振能否正常起振,可以示波器x10挡抓下波形
搞掂~
|