在72MHZ下点亮LED

#define _IO volatile
typedef unsigned int uint32_t;
typedef _IO uint32_t vu32;
typedef unsigned short int uint16_t;


#define GPIO_Pin_0   ((uint16_t)0x0001)//0000000000000001第一引脚置1(对应的是BSRR和BRR寄存器的16位)
#define GPIO_Pin_1   ((uint16_t)0x0002)//0000000000000010第二引脚置1(对应的是BSRR和BRR寄存器的16位)
#define GPIO_Pin_2   ((uint16_t)0x0004)//0000000000000100第三引脚置1(对应的是BSRR和BRR寄存器的16位)
#define GPIO_Pin_3   ((uint16_t)0x0008)//0000000000001000第四引脚置1(对应的是BSRR和BRR寄存器的16位)
#define GPIO_Pin_4   ((uint16_t)0x0010)//0000000000010000第五引脚置1(对应的是BSRR和BRR寄存器的16位)
#define GPIO_Pin_5   ((uint16_t)0x0020)//0000000000100000第六引脚置1(对应的是BSRR和BRR寄存器的16位)
#define GPIO_Pin_6   ((uint16_t)0x0040)//0000000001000000第七引脚置1(对应的是BSRR和BRR寄存器的16位)
#define GPIO_Pin_7   ((uint16_t)0x0080)//0000000010000000第八引脚置1(对应的是BSRR和BRR寄存器的16位)
#define GPIO_Pin_8   ((uint16_t)0x0100)//0000000100000000第九引脚置1(对应的是BSRR和BRR寄存器的16位)
#define GPIO_Pin_9   ((uint16_t)0x0200)//0000001000000000第十引脚置1(对应的是BSRR和BRR寄存器的16位)
#define GPIO_Pin_10  ((uint16_t)0x0400)//0000010000000000第11引脚置1(对应的是BSRR和BRR寄存器的16位)
#define GPIO_Pin_11  ((uint16_t)0x0800)//0000100000000000第12引脚置1(对应的是BSRR和BRR寄存器的16位)
#define GPIO_Pin_12  ((uint16_t)0x1000)//0001000000000000第13引脚置1(对应的是BSRR和BRR寄存器的16位)
#define GPIO_Pin_13  ((uint16_t)0x2000)//0010000000000000第14引脚置1(对应的是BSRR和BRR寄存器的16位)
#define GPIO_Pin_14  ((uint16_t)0x4000)//0100000000000000第15引脚置1(对应的是BSRR和BRR寄存器的16位)
#define GPIO_Pin_15  ((uint16_t)0x8000)//1000000000000000第16引脚置1(对应的是BSRR和BRR寄存器的16位)
#define GPIO_Pin_All ((uint16_t)0xFFFF)//1111111111111111


#define RCC_APB2Periph_AFIO   ((uint32_t)0x00000001)
#define RCC_APB2Periph_GPIOA  ((uint32_t)0x00000004)
#define RCC_APB2Periph_GPIOB  ((uint32_t)0x00000008)
#define RCC_APB2Periph_GPIOC  ((uint32_t)0x00000010)
#define RCC_APB2Periph_GPIOD  ((uint32_t)0x00000020)//这个是0000000000010000   主要是为了配合时钟的16位(其中第5位是IO口D的使能时钟位)
/***************GPIOD**********/
typedef struct 
{
   _IO uint32_t CRL;//端口配置低寄存器
   _IO uint32_t CRH;//端口配置高寄存器
   _IO uint32_t IDR;//端口输入数据寄存器
   _IO uint32_t ODR;//端口输出数据寄存器
   _IO uint32_t BSRR;//端口位设置/清除寄存器
   _IO uint32_t BRR;//端口位清除寄存器
   _IO uint32_t LCKR;//端口配置锁定寄存器
}GPIO_TypeDef;

typedef struct 
{
   _IO uint32_t CR;//时钟控制寄存器
   _IO uint32_t CFGR;//时钟配置寄存器
   _IO uint32_t CIR;//时钟中断寄存器
   _IO uint32_t APB2RSTR;//APB2外设复位寄存器
   _IO uint32_t APB1RSTR;//APB1外设复位寄存器
   _IO uint32_t AHBENR;//AHB外设时钟使能寄存器
   _IO uint32_t APB2ENR;//APB2外设时钟使能寄存器
   _IO uint32_t APB1ENR;//APB1外设时钟使能寄存器
   _IO uint32_t BDCR;//备份域控制寄存器
   _IO uint32_t CSR;//控制/状态寄存器
   _IO uint32_t AHBRSTR;//AHB外设时钟复位寄存器
   _IO uint32_t CFGR2;//时钟配置寄存器2
}RCC_TypeDef; 
typedef struct 
{
   _IO uint32_t ACR;//闪存访问控制寄存器
   _IO uint32_t KEYR;//FPEC键寄存器
   _IO uint32_t OPTKEYR;//闪存OPTKEY寄存器
   _IO uint32_t SR;//闪存状态寄存器
   _IO uint32_t CR;//闪存控制寄存器
   _IO uint32_t AR;//闪存地址寄存器
   _IO uint32_t RESERVED;//保留区
   _IO uint32_t OBR;//选择字节寄存器
   _IO uint32_t WRPR;//写保护寄存器
}FLASH_TypeDef;

/***********GPIO管脚的内存地址***********/
#define PERIPH_BASE     ((uint32_t)0x40000000)
#define APB2PERIPH_BASE (PERIPH_BASE+0x10000)
#define GPIOD_BASE      (APB2PERIPH_BASE+0x1400)
#define GPIOD           ((GPIO_TypeDef *)GPIOD_BASE)

/**********RCC时钟***********************/
#define AHBPERIPH_BASE  (PERIPH_BASE+0x20000)
#define RCC_BASE        (AHBPERIPH_BASE+0x1000)
#define RCC             ((RCC_TypeDef *)RCC_BASE)


#define APB1PERIPH_BASE    PERIPH_BASE
#define APB2PERIPH_BASE    (PERIPH_BASE + 0x10000)
#define AHBPERIPH_BASE     (PERIPH_BASE + 0x20000)
#define FLASH_R_BASE       (AHBPERIPH_BASE + 0x2000)
#define FLASH              ((FLASH_TypeDef *)FLASH_R_BASE) 

void Delay(uint32_t nCount)
{
    for(;nCount!=0;nCount--);
}
int main(void)
{
   unsigned char sws;
   RCC->CR|=1<<16;//外部使能(HSE)打开
   while(!(RCC->CR>>17));//等待硬件将外部使能置1
   /**********配置时钟**************/
   RCC->CFGR2|=1<<6;//PREDIV2    5分频
   RCC->CFGR2|=6<<8;//PLL2MUL    8倍频
   RCC->CFGR2|=1<<16;//PLL2作为PREDIV1的时钟
   RCC->CR|=1<<26;//PLL2使能打开
   while(!(RCC->CR>>27));//等待硬件将其置1
   RCC->CFGR2|=1<<2;//PREDIV1  5分频
   RCC->CFGR|=1<<16;//PREDIV1 作为PLL的时钟
   RCC->CFGR|=7<<18;//PLLMUL  4倍    
   RCC->CR|=1<<24;//PLL 使能打开
   while(!(RCC->CR>>25));//等待 硬件将其置1
   FLASH->ACR|=0x01;
   RCC->CFGR|=1<<1;//选择PLLCK 作为系统时钟
   RCC->APB2ENR |= RCC_APB2Periph_GPIOD;//使GPIO时钟使能启动   
   GPIOD->CRL |=  0x30033300;//Pin2引脚推免的形式以最大的50MHZ输出
   while (1)
   {    
        GPIOD->BRR = GPIO_Pin_2;//使第二引脚输出0(低电平)
        Delay(0x5FFFFF);
        GPIOD->BRR = GPIO_Pin_3;//使第三个引脚输出0(低电平)
        Delay(0x5FFFFF);
        GPIOD->BRR = GPIO_Pin_4;//使第四个引脚输出0(低电平)
        Delay(0x5FFFFF);
        GPIOD->BRR = GPIO_Pin_7;//使第七个引脚输出0(低电平) 
        Delay(0x5FFFFF);
        GPIOD->BSRR = GPIO_Pin_2;//使第二引脚输出1(高电平)
        Delay(0x5FFFFF);
        GPIOD->BSRR = GPIO_Pin_3;//使第二引脚输出1(高电平)
        Delay(0x5FFFFF);
        GPIOD->BSRR = GPIO_Pin_4;//使第四引脚输出0(低电平)
        Delay(0x5FFFFF);
        GPIOD->BSRR = GPIO_Pin_7;//使第七引脚输出1(高电平)
        Delay(0x5FFFFF);
    }
}
在这里我详细介绍了,大家可以去看看[这里写链接内容](http://www.stmcu.org/module/forum/thread-608426-1-1.html)






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值