声明:本专题系列的博文主要是用于个人学习以及后续查阅调用,由于是这方面的初学者,所以写的比较浅陋,有喜欢的朋友可以一起学习,编程大神们请略过。。。。。。
1、以一个GPIO的初始化程序为例,以下是GPIO的配置:
void GPIO_Init() //端口初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
//声明一个结构体变量,用来初始化GPIO
SystemInit(); //首先进行GPIO模块的时钟初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
//因为使用的GPIOC端口,所以使能GPIOC端口的时钟
/* 配置GPIO的模式和IO口*/
GPIO_InitStructure.GPIO_Pin=LED;
//选择你要设置的IO口,这里以一个LED接口为例;这里的“LED”实际上是一个宏定义,在相应头文件中已申明所代表的含义,目的主要是便于后续修改、调整
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
//设置推挽输出模式,这里的GPIO模式共有八种,分别是:
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复用推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
//设置传输速率
GPIO_Init(GPIOC,&GPIO_InitStructure);
//初始化该IO口所在的GPIO组,并指向该GPIO结构的指针
}
2、延时函数
以下延时函数是常用的一个通过占用CPU来达到延时效果的函数,延时不准确,但对于日常开发,多用于此。
void delay(u32 i)
{
while(i–);
}
函数比较简单,只需要在相应的功能模块的“.C”文件中写好,即可直接调用,如:delay(6000000);//延时约为1s
3、系统定时器延时函数
该函数可精确定时,在一些延时要求精度较高的场合应用。
微秒延时函数:
void delay_us(u32 i)
{
u32 temp;
SysTick->LOAD=9i;
//设置重装数值,72MHz时;这里之所以“9i”,是因为系统时钟在这里经过了8分频,这里是9MHz,即换算为时间就是约为1us,所以后续想要延时多少us,就直接给“i”赋值
SysTick->CTRL=0X01; //CTRL是该定时器的控制和状态寄存器,需要先使能,即就是将该寄存器最低位置1使能
SysTick->VAL=0; //VAL是当前值寄存器,需要先清零计数器
do
{
temp=SysTick->CTRL; //读取当前倒计数值
}
while((temp&0x01)&&(!(temp&(1<<16)))); //等待时间到达,若当前值计数减到0的时候,CTRL寄存器的第16位(标志位)则会置1,此时则跳出循环,该次延时完毕
SysTick->CTRL=0; //关闭计数器
SysTick->VAL=0; //清空计数器
}
毫秒延时函数:
void delay_ms(u32 i)
{
u32 temp;
SysTick->LOAD=9000*i;
//设置重装数值,72MHz时;
SysTick->CTRL=0X01; //使能,减到0是无动作,采用外部时钟源
SysTick->VAL=0; //清零计数器
do
{
temp=SysTick->CTRL; //读取当前倒计数值
}
while((temp&0x01)&&(!(temp&(1<<16)))); //等待时间到达
SysTick->CTRL=0; //关闭计数器
SysTick->VAL=0; //清空计数器
}
同样调用的时候比较简单,直接:
delay_ms(1000); //精确延时1s