SYSTICK是系统滴答时钟,又叫做比较精确的delay函数,之所以说它比较精确,是相对于套两个for循环的粗延时函数而言的。SYSTICK实质上是系统时钟的八分频,STM32F103系列的主频是72M,八分频就是9M,既然是9M的时钟,那么从开始计数到计数9M次溢出就可以得到一个固定的时间长度值,这个时间长度值经过误差处理后就可以当作是1微秒,计数9M次这个过程重复做1000次就是1毫秒,SYSTICK的delay函数就是这么来的。SYSTICK是STM32小白必须掌握的延时手段,因为一来,STM32与单总线器件如DS18B20,DHT11,红外接收头等器件通信必须用SYSTICK延时函数而绝对不能用粗延时函数,这是我经过早期对STM32的学习实测证明的;二来SYSTICK函数可以用在RTOS(实时操作系统)上面生成节拍延时,节拍是任务时间计算和任务切换的最小时间片单位。SYSTICK虽然跟粗延时函数一样也占用CPU资源,但是占用率已经大大降低。注意,使用SYSTICK必须正确初始化系统时钟! 系统时钟初始化五个参数分别是PLLM,PLLN,PLLP,PLLQ,PLLR,其中PLLP跟PLLQ不用管,它们的值恒为2,而PLLM是分频数,我填4,PLLN是原始主频,我填100,PLLR是最后送达时钟的分频因子,我填2,这样子,系统主频就是(8/4)*100/2=100MHz。若想获得更高主频,只需要改PLLN的值为160即可(F4主频上限为168MHz)。 独立看门狗是硬件看门狗,作用是为了防止程序跑飞。独立看门狗中的独立指的是看门狗定时器所用时钟与系统时钟是分开的。在程序初始化阶段设置看门狗的分频系数和重装载值,看门狗定时器开始工作。程序中需要有一个循环喂狗动作,喂狗动作的实质就是将当前看门狗计数值清零。若看门狗定时器溢出,则程序会自动进行硬件复位。需注意的是,循环喂狗动作时间间隔必须小于看门狗定时器的计数溢出时间,否则开发板将会不断复位。若程序正常运行,则正常喂狗,看门狗定时器总是清零而不会溢出。若程序跑飞,无法执行喂狗动作,看门狗定时器溢出,则开发板自动硬件复位。喂狗操作在定时器2中断服务函数里面。 至于随机数发生器,顾名思义,不用多说。随机数发生器在外部中断PC13(开发板按钮)的中断服务函数里面,按一次按钮就产生生成一个随机数。 讲下PWM。Nucleo-F412开发板的三盏LED灯从左到右分别是PB14(红灯),PB7(蓝灯),PB0(绿灯),PB0对于STM32F4是定时器3的通道3,PB7是定时器4的通道2,PB14是定时器12的通道1,而在本程序中PB7用作外部中断指示灯,PB14用作定时器中断指示灯,因此我选取PB0作为PWM输出,也就是要初始化定时器3的各种参数以及定时器3的PWM通道3的各种参数。STM32的通用定时器产生PWM的方式是比较方式,将输入值与初始化的比较值进行比较,就可以产生占空比为输入值/比较值(或比较值/输入值)的PWM波,因此,占空比的调节非常灵活。 好,理论部分已经讲完,来看下实验效果!按下按钮翻转蓝色灯并生成随机数,从图中可以看到定时器2翻转红色灯并喂狗,PB0绿灯为呼吸灯效果。 上传一份可以直接调用的头文件。 |
谢谢!坛友的支持是我的动力。
【我与STM32共成长】+脚踏STM32F1和STM32F4两条船
https://www.stmcu.org.cn/module/ ... amp;fromuid=3301905
(出处: 意法半导体STM32/STM8技术社区)