systick使用出错总结
来源:互联网 发布:金智妍kei知乎 编辑:程序博客网 时间:2024/06/05 06:10
在延时函数里,对一次计数结束进行判断时,出现了失误,导致延时时长出现异常。
先说明函数设计想法,主要while结束判断条件设计,要保证计数器在工作和计数到0结束。因此对SysTick->CTRL寄存器有两标志位要进行判断。
计数到0,[16]置1。重点是[16]读取后会清零,因此用一个temp变量进行一次读取,再分别判断标志位。
错误代码:
void delay_us(u32 us){u32 temp = 0;SysTick->LOAD = (u32)us * base_us; //设置重载值SysTick->VAL = 0x00; //计数值清零SysTick->CTRL = 0x01; //开始计时,无中断do{temp = SysTick->CTRL; //注意:[16]读后清零}while((temp & 0x01) && !(SysTick->CTRL & (1 << 16))); //此处while第二个条件不合理SysTick->VAL = 0x00; //计数值清零SysTick->CTRL = 0x00; //关闭计数}
错误原因:在while第二个判断条件又使用了SysTick->CTRL即直接用寄存器内容进行对计数到0的判断。因为在之前已经temp = SysTick->CTRL;读取了一次,这时[16]已清零。已无判断意义,导致延时出现异常正确代码:
void delay_us(u32 us){u32 temp = 0;SysTick->LOAD = (u32)us * base_us; //设置重载值SysTick->VAL = 0x00; //计数值清零SysTick->CTRL = 0x01; //开始计时,无中断do{temp = SysTick->CTRL; //注意:[16]读后清零}while((temp & 0x01) && !(temp & (1 << 16))); //用temp对寄存器的标志位进行判断,合理SysTick->VAL = 0x00; //计数值清零SysTick->CTRL = 0x00; //关闭计数}
阅读全文
0 0
- systick使用出错总结
- systick 的配置总结
- SysTick功能总结
- 使用STM32的systick定时器中断实现RTC工作过程出错
- MFC_LISTCTRL使用出错总结
- Systick
- systick
- SysTick
- Systick
- Systick
- Jacob的使用出错总结
- stm32使用systick精确延时
- stm32f4使用Systick实现延时
- 一个关于stm32的systick配置出错的小问题
- STM32使用Systick 实现精确定时
- STM32使用systick实现精确延时
- 使用命令行创建AVD时的出错总结
- Mybatis的使用注意事项和出错的一些总结
- Ubuntu录制视频转GIF
- MTU & MSS 详解记录(转)
- 一只可爱的c++爬虫
- 回车执行js函数实现ajax调用
- search-a-2d-matrix
- systick使用出错总结
- js图片库——改进版
- bzoj 5018: [Snoi2017]英雄联盟
- EU4-53: Making a proposal
- Notepad++ 快捷键
- Android studio gradle版本更新和APP运行配置
- Spring_day02
- R语言:ggplot做条形图和线图尝试
- 小白做四轴前篇(1)-心中的梦