|
#define _IO volatile: }; [# U# }) z' K2 c( r typedef unsigned int uint32_t;# \7 x7 E" F6 G7 U: r% }3 M typedef _IO uint32_t vu32;" _7 @+ W; g6 [5 u9 H: X: c% ` typedef unsigned short int uint16_t;7 }/ l& D5 i: X: s5 d 2 k3 s$ w% M6 |2 r3 j1 F' { #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位)8 }# |# h, X2 X# G1 k" i! ~9 B" I* a #define GPIO_Pin_3 ((uint16_t)0x0008)//0000000000001000第四引脚置1(对应的是BSRR和BRR寄存器的16位)# U+ }- b) h. O6 S. } #define GPIO_Pin_4 ((uint16_t)0x0010)//0000000000010000第五引脚置1(对应的是BSRR和BRR寄存器的16位) #define GPIO_Pin_5 ((uint16_t)0x0020)//0000000000100000第六引脚置1(对应的是BSRR和BRR寄存器的16位)4 l% ]# N4 T# X0 E/ V! W #define GPIO_Pin_6 ((uint16_t)0x0040)//0000000001000000第七引脚置1(对应的是BSRR和BRR寄存器的16位)$ w+ f" M- W1 c6 i* @2 @- @2 D# |+ t #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位)6 E! d) Z$ A3 |7 ^* `3 U/ v #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位)4 o; j2 R# |, m C" S% g) [) n0 r #define GPIO_Pin_All ((uint16_t)0xFFFF)//11111111111111118 E" v* k9 P" y. ? ) k) V% r2 u) m #define RCC_APB2Periph_AFIO ((uint32_t)0x00000001)$ r o. n, a5 o" e' Z) S #define RCC_APB2Periph_GPIOA ((uint32_t)0x00000004)1 o1 M( i R3 A, T: ~" G. m- F #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**********/5 b7 \- ]: `6 k5 r( j% F3 Q2 }: A typedef struct {4 Z8 W$ r% A, p7 D9 r9 p _IO uint32_t CRL;//端口配置低寄存器 | Z) k5 Q6 U5 r' a _IO uint32_t CRH;//端口配置高寄存器 _IO uint32_t IDR;//端口输入数据寄存器 _IO uint32_t ODR;//端口输出数据寄存器 _IO uint32_t BSRR;//端口位设置/清除寄存器 _IO uint32_t BRR;//端口位清除寄存器, R+ ^5 I8 _) d, t, X _IO uint32_t LCKR;//端口配置锁定寄存器; p- A/ f d6 P U }GPIO_TypeDef;9 X/ T. @7 i- `( t3 K7 F& ^) ^ ' `2 g! | C R$ ~# W typedef struct 6 Q/ c( e4 }7 d# d9 o* q {; t4 R2 Z- Z5 X8 E( A f _IO uint32_t CR;//时钟控制寄存器 _IO uint32_t CFGR;//时钟配置寄存器5 W) A* k" v* a3 s9 m _IO uint32_t CIR;//时钟中断寄存器- E& R( b/ u! R; L$ w' } _IO uint32_t APB2RSTR;//APB2外设复位寄存器 _IO uint32_t APB1RSTR;//APB1外设复位寄存器7 q" O2 R" L9 a% ] @5 ~& x _IO uint32_t AHBENR;//AHB外设时钟使能寄存器 _IO uint32_t APB2ENR;//APB2外设时钟使能寄存器 _IO uint32_t APB1ENR;//APB1外设时钟使能寄存器 _IO uint32_t BDCR;//备份域控制寄存器6 H, \; t1 `( I+ g4 `. i; m _IO uint32_t CSR;//控制/状态寄存器! D3 v0 C5 ]1 h }RCC_TypeDef; - Z7 v6 Y0 }' Z b: H# _& Q0 | 4 J* R# ~2 E' S: w W% d* A" o /***********GPIO管脚的内存地址***********/ #define PERIPH_BASE ((uint32_t)0x40000000), z$ |6 g9 A9 R #define APB2PERIPH_BASE (PERIPH_BASE+0x10000)" v' `' j! r9 {, }- I L #define GPIOD_BASE (APB2PERIPH_BASE+0x1400)* X: b$ u0 J. ^+ \$ p5 D% t P #define GPIOD ((GPIO_TypeDef *)GPIOD_BASE) /**********RCC时钟***********************/ #define AHBPERIPH_BASE (PERIPH_BASE+0x20000)8 t I4 q( r2 V+ w #define RCC_BASE (AHBPERIPH_BASE+0x1000) #define RCC ((RCC_TypeDef *)RCC_BASE)3 G% f' [9 ]- S5 \3 Y2 D5 I void Delay(uint32_t nCount) {' U/ Y: Z% e/ d& H# P8 E for(;nCount!=0;nCount--); }0 R2 }( q; ]7 H) v int main(void) { RCC->APB2ENR|=RCC_APB2Periph_GPIOD;// //GPIOD->CRL=0xFFFF00FF;1 V( b; D9 q8 c# Z9 o5 m1 j GPIOD->CRL=0x30033300;//配置CRL寄存器----这个模式 通用推挽输出模式 输出模式,最大速度50MHz while(1) { GPIOD->BRR=GPIO_Pin_2;//BRR写1置0-->使ODR(输出低电平,写0无影响)--->使LED亮了# t7 x* Z7 Y' d Delay(0xFFFF);. r7 G+ C' P. O! ^ GPIOD->BRR=GPIO_Pin_3; Delay(0X2FFFF);; @* R Q5 A- J3 ]" V2 B6 C6 {1 z GPIOD->BRR=GPIO_Pin_4;9 I" ^: w5 ^. n4 U Delay(0xFFFFF); GPIOD->BRR=GPIO_Pin_7; S- G& L- m! i+ \+ @9 @8 I3 {/ n Delay(0X2FFFFF);. I5 ]4 }( z& \- c GPIOD->BSRR=GPIO_Pin_2;//BSRR写1置1(前16位是BS,后16位是BR)-->使ODR(输出高电平,写0无影响)--->LED灭了., \# e+ x( R% t/ L# Q) \% {; I Delay(0xFFFF); GPIOD->BSRR=GPIO_Pin_3; Delay(0X2FFFF);* G4 l# H( ` B6 w GPIOD->BSRR=GPIO_Pin_4;5 B: q6 d: X: q/ o8 _- R* z# l Delay(0xFFFFF);7 V( k7 h# [1 g GPIOD->BSRR=GPIO_Pin_7;5 r% N. i+ E# t9 a5 {; V) [ Delay(0X2FFFFF);1 F, b% |) |! B7 ^8 U/ X }5 S; J2 B/ | Z9 [" u x5 B/ H } 通过这个程序,我了解到各个与GPIO口有关的寄存器的功能,以及时钟的寄存器的功能。( H" U2 V2 V$ B) S , ~- _: r3 Z7 j0 l, v ! G5 L$ N* X9 y: p H # \. Z' A8 @. d' E* H . ?$ J: f% O, B+ T$ Y. n$ W2 e |
微信公众号
手机版
谢谢分享
我也是现学现卖