23
2020
11

滴答硬件定时器

#include "stm32f10x.h"
static GPIO_InitTypeDef   GPIO_InitStructure;
#define  PB5OUT(n)   *(volatile uint32_t *)(0x42000000+((uint32_t)&GPIOB->ODR-0x40000000)*32+n*4)


void delay_ms(uint32_t n){
    while(n--){
    SysTick->CTRL=0; //关闭系统定时器,第0位:使能位,1为使能
    SysTick->LOAD=(168000)-1;//配置计数值,因为计算机从0开始,所以减一
    SysTick->VAL=0;//清空当前的值(标志位),定时器在计数时,标志位为0,当计数完毕时,标志位为1
    SysTick->CTRL=5;//5=101  使能系统计时器,并且使用系统时钟
        //第二位:时钟选择位,0=系统时钟/8,1=系统时钟
    while((SysTick->CTRL&0x10000)==0);//等待计数到0
        //第16位:计数到0则为1
    
    }
    
    SysTick->CTRL=0;
}

void delay_us(uint32_t n){
    //us就不用循环了,会增加误差
    SysTick->CTRL=0; //关闭系统定时器,第0位:使能位,1为使能
    SysTick->LOAD=(168*n)-1;//配置计数值,因为计算机从0开始,所以减一
    SysTick->VAL=0;//清空当前的值(标志位),定时器在计数时,标志位为0,当计数完毕时,标志位为1
    SysTick->CTRL=5;//5=101  使能系统计时器,并且使用系统时钟
        //第二位:时钟选择位,0=系统时钟/8,1=系统时钟
    while((SysTick->CTRL&0x10000)==0);//等待计数到0
        //第16位:计数到0则为1
    SysTick->CTRL=0;
}
void led0(void){
    //led0-->PB5
    //使能端口
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    //初始化GPIO引脚
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;//高速响应
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_SetBits(GPIOB,GPIO_Pin_5);
}
int main(){
    led0();
    

    while(1){
    PB5OUT(5)=0 ;    
    delay_ms(500);
    PB5OUT(5)=1;    
    delay_ms(500);
    }
}


微信扫码关注

更新实时通知

« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。