STMCU小助手
发布时间:2022-7-1 12:38
SysTick_Init()函数 SysTick_Init 函数代码如下: /************************************************************************* * 函 数 名 : SysTick_Init * 函数功能 : SysTick 初始化,SYSTICK 的时钟固定为 AHB 时钟的 1/8 * 输 入 : SYSCLK:系统时钟频率 * 输 出 : 无 **************************************************************************/ void SysTick_Init(u8 SYSCLK) { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); fac_us=SYSCLK/8; //SYSCLK的8分频 保存1us所需的计数次数 fac_ms=(u16)fac_us*1000; //每个 ms 需要的 systick 时钟数 } SysTick_Init 函数形参 SYSCLK 表示的系统时钟大小,默认配置我们使用的系统时钟是 72M,所以调用这个函数时,形参值即为 72。函数内部调用了一个库函数 SysTick_CLKSourceConfig,此函数用来对 SysTick 定时器时钟的选择,我们使用的SysTick定时器时钟是系统时钟的8 频 ,所以参数是SysTick_CLKSource_HCLK_Div8。如果使用系统时钟作为 SysTick 定时器时钟,那么参数即为 SysTick_CLKSource_HCLK。这个函数在 misc.c 库文件内,如何查找我们前面介绍过方法。 下面的两条语句是用来求取SysTick定时器在1us时间内和1ms时间内的计数次数。 delay_us()函数 delay_us 函数代码如下: /********************************************************************** * 函 数 名 : delay_us * 函数功能 : us 延时, * 输 入 : nus:要延时的 us 数 注 意 :nus 的 值 , 不 要 大 于 798915us( 最 大 值 即 2^24/fac_us@fac_us=21) * 输 出 : 无 **********************************************************************/ void delay_us(u32 nus) { u32 temp; SysTick->LOAD=nus*fac_us; //时间加载 SysTick->VAL=0x00; //清空计数器 SysTick->CTRL|=0x01 ; //开始倒数 do { temp=SysTick->CTRL; }while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达 SysTick->CTRL&=~0x01; //关闭计数器 SysTick->VAL =0X00; //清空计数器 } ①将需要延时多少 us 的计数值加载到 SysTick 的 LOAD 寄存器中,fac_us值是延时 1us 所需的计数值。 ②清空当前计数值寄存器 VAL。 ③打开 SysTick 定时器,定时器开始向下递减计数。 ④CTRL 寄存器的第 16 位是 SysTick 递减到 0 的标志位,如果递减到 0,此为置 1,通过读取该位来判断延时是否完成,从而退出 while 循环。 ⑤关闭 SysTick 定时器。 ⑥清空当前计数值寄存器 VAL。 delay_ms()函数 delay_ms 函数代码如下: /************************************************************* * 函 数 名 : delay_ms * 函数功能 : ms 延时, * 输 入 : nms:要延时的 ms 数 注意:nms 的值,SysTick->LOAD 为 24 位寄存器, 不要大于 0xffffff*8*1000/SYSCLK 对 72M 条件下,nms<=1864ms * 输 出 : 无 **************************************************************/ void delay_ms(u16 nms) { u32 temp; SysTick->LOAD=(u32)nms*fac_ms; // 时 间 加 载 (SysTick->LOAD 为 24bit) SysTick->VAL =0x00; //清空计数器 SysTick->CTRL|=0x01 ; //开始倒数 do { temp=SysTick->CTRL; }while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达 SysTick->CTRL&=~0x01; //关闭计数器 SysTick->VAL =0X00; //清空计数器 } 此函数功能与 delay_us 基本一样,只不过这里是延时 ms。要注意的是,SysTick 定 时 器 是 24 位 的 , 其 计 数 最 大 值 为 0xffffff , 时 间 为nms<=0xffffff*8*1000/SYSCLK,SYSCLK 是系统时钟为 72M,所以最大延时为1864ms。如果需要延时大于 1.864S,可以调用多个 delay_ms 函数即可。 主函数 在 main.c 文件中前面引入了工程中所需的头文件,可以打开工程查看,这里我们主要看下 main 函数,代码如下: /************************************************************** * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 ***************************************************************/ int main() { SysTick_Init(72); LED_Init(); while(1) { led1=0; led2=1; delay_ms(500); //精确延时 500ms led1=1; led2=0; delay_ms(500); //精确延时 500ms } } 主函数实现的功能比较简单,首先对 SysTick 定时器进行初始化配置,选择系统时钟 8 分频作为 SysTick 的时钟,然后初始化 LED,这个初始化过程前面已经介绍过,大家也可以进入这个函数内查看。最后进入 while 循环语句,对 PC0和 PC1 管脚进行位操作,里面也调用了 delay_ms 延时函数,这时候的延时是非常精确的。 将工程程序编译下载到开发板内, 可以看到 LED 模块的 2 个指示灯实现了流水灯效果。 |
【福利三:逢7发帖赢大礼】想要充分利用STM32H743VI片内的RAM空间(但并不顺利)
基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理
使用STM32 MCU和MPU连接PDM数字麦克风
分享STM32资料-采用 STM32U031R8 MCU 的 STM32 Nucleo-64 开发板,官方资料,数据手册等资料
HRTIM 指南
使用 STM32 的 DWT 单元监控内存
DAC,COMP,HRTIM Fault 功能的使用
一个软件引起的 LSE 驱动不良的问题
STM32 GUI LTDC 最大像素时钟评估方法
STM32 Cordic 运算速度评估
微信公众号
手机版