|
#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;//控制/状态寄存器 }RCC_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) void Delay(uint32_t nCount) { for(;nCount!=0;nCount--); } int main(void) { RCC->APB2ENR|=RCC_APB2Periph_GPIOD;// //GPIOD->CRL=0xFFFF00FF; GPIOD->CRL=0x30033300;//配置CRL寄存器----这个模式 通用推挽输出模式 输出模式,最大速度50MHz while(1) { GPIOD->BRR=GPIO_Pin_2;//BRR写1置0-->使ODR(输出低电平,写0无影响)--->使LED亮了 Delay(0xFFFF); GPIOD->BRR=GPIO_Pin_3; Delay(0X2FFFF); GPIOD->BRR=GPIO_Pin_4; Delay(0xFFFFF); GPIOD->BRR=GPIO_Pin_7; Delay(0X2FFFFF); GPIOD->BSRR=GPIO_Pin_2;//BSRR写1置1(前16位是BS,后16位是BR)-->使ODR(输出高电平,写0无影响)--->LED灭了. Delay(0xFFFF); GPIOD->BSRR=GPIO_Pin_3; Delay(0X2FFFF); GPIOD->BSRR=GPIO_Pin_4; Delay(0xFFFFF); GPIOD->BSRR=GPIO_Pin_7; Delay(0X2FFFFF); } } 通过这个程序,我了解到各个与GPIO口有关的寄存器的功能,以及时钟的寄存器的功能。 |
| 不会用代码片,所以辛苦大家看这个了 |
| 好贴,从最基本的寄存器开始写,很不错的。 |
| 谢谢,只是新手 |
| 我还要努力 |
| 谢谢分享 先记号下 等集齐了元件点点看 |
鼓励一下, |
| 不错,写的很详细!! |
![]() ![]() ![]() ![]() |
| 我会努力坚持下去的,大家一起加油啊 |
STM32
超强工具——STM32CubeMX 你会用吗?
集结出发! STM32全国研讨会系列之一:ST智能门铃中国首秀
关于STM32启动文件的几个小问题
【银杏科技ARM+FPGA双核心应用】STM32H7系列35——USB_VCP_FS
【银杏科技ARM+FPGA双核心应用】STM32H7系列28——USB_HID
粉丝分享 | 图说CRC原理应用及STM32硬件CRC外设
STM32L151进入低功耗,并由RTC唤醒的故事
[转]stm32控制NFC模块(PN532)源码(P2P,模拟卡,读写卡等
STM32G070RB+LVGL移植
微信公众号
手机版