1、较精确的软件延时函数:
void delay_us ( unsigned int us ) { unsigned char n; while( us-- ) for( n=0;n<9; n++ ); } void delay_ms ( unsigned int ms ) { while( ms-- ) delay_us(1000); }
2、关于GPIO的8种模式:
GPIO_Mode_AIN //模拟输入 GPIO_Mode_IN_FLOATING //浮空输入 GPIO_Mode_IPD //下拉输入 GPIO_Mode_IPU //上拉输入 GPIO_Mode_Out_OD //开漏输出 GPIO_Mode_Out_PP //推挽输出 GPIO_Mode_AF_OD //开漏复用输出
GPIO_Mode_AF_PP //推挽复用输出
3、嘀嗒定时器:
delay.c内容:
#include "delay.h" void delay_us ( unsigned int us) //微秒级延时函数,嘀嗒定时器为24位向下计数器 { SysTick -> VAL = 0; //设置计数器初值为0,一共32位,24位可用 SysTick -> LOAD = 9*us; //每计9个数才是1us,这里和TIM定时器计数有区别 SysTick -> CTRL = 0x01; //使能计数器,第0位为使能位,置1使能,置0失能 while((SysTick ->CTRL) != 0x10001); //向下产生溢出后,产生中断标志,及判断16位是否置1 SysTick -> CTRL =0; //产生溢出后,产生中断标志的第16位被置1,此时再将第16位置0,以便下次计数 SysTick -> VAL =0; //设置计数器初值为0,一共32位,24位可用 } void delay_ms ( unsigned int ms) //毫秒级延时函数,嘀嗒定时器为24位向下计数器 { SysTick -> VAL = 0;//设置计数器初值为0,一共32位,24位可用 SysTick -> LOAD = 9000*ms;//这里计9000个数才是1ms,这里和TIM定时器计数有区别 SysTick -> CTRL = 0x01;//使能计数器,第0位为使能位,置1使能,置0失能 while((SysTick ->CTRL) != 0x10001);//向下产生溢出后,产生中断标志,及判断16位是否置1 SysTick -> CTRL =0;//产生溢出后,产生中断标志的第16位被置1,此时再将第16位置0,以便下次计数 SysTick -> VAL =0;//设置计数器初值为0,一共32位,24位可用 }
delay.h内容:
#ifndef __DELAY_H #define __DELAY_H #include "stm32f10x.h" void delay_us(unsigned int us); void delay_ms(unsigned int ms); #endif
4、关于按键软件消抖的写法:
if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin_x)==0){ delay_ms(50); if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin_x)==0){
//此处为按键按下所要实现的功能
}
}
5、关于GPIO_CRL &=~(0x0F<<(4*0))的解析:
“ ~(0x0F<<(4*0)) ” 的值为0xF0;
后写为:GPIO_CRL= GPIO_CRL & 0xF0;
假设GPIO_CRL的值为0100 1100
那么这条程序的作用:GPIO_CRL的值的低4位被置0,其他位不变。
6、关于灯闪程序的问题:
GPIO_SetBits(GPIOA, GPIO_Pin_8); SysTick_Delay_Ms(500); //系统精准的延时函数 GPIO_ResetBits(GPIOA, GPIO_Pin_8); SysTick_Delay_Ms(500);
要想实现灯闪,必须在灯亮及灭后加延时函数,否则无法实现目的,即考虑视觉停留问题!
7、关于按键硬件防抖的电路设计:
注:此处参照野火板子硬件防抖设计
8、关于基本定时器,通用定时器和高级定时器: