#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)
在72MHZ下点亮LED
最新推荐文章于 2024-07-03 22:24:30 发布