- 寄存器点亮LED灯
#include "stm32f10x.h" void SystemInit(void); int main(void){ //打开GPIOB端口的时钟 *(unsigned int *)0x40021018 |= ((1) << 3); //配置为输出模式且配置速度 *(unsigned int *)0x40010C00 |= (1 << 0); //控制ODR寄存器 *(unsigned int *)0x40010C0C &= ~(1 << 0);//最低位清零,其它位保持不变 return 0; } void SystemInit(void) { //函数体为空,目的是为了骗过编译器不报错 }
-
注意
-
|=:表示置位,与~配合使用
-
&=:表示清0
-
-
-
GPIO简介
-
GPIO是通用输入输出端口,简单来说就是软件可控制的引脚,STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。
-
GPIO功能框图
-
①I/O引脚:芯片引出来的外部引脚,输入电压高于VDD时,I/O引脚到VDD方向导通,电压流不到芯片内部,但是有一个限值,超过这个限值二极管就会烧坏,起不到保护作用,导致电压流入到芯片内部,可能会损坏芯片。若电压低于VSS(GND),电流往外流,也能起到保护的作用。
-
②推挽输出:I/O引脚输出0/1的时候,通过操作③输出数据寄存器,通过输出控制,控制P-MOS或N-MOS,最后到达I/O引脚。其中②部分可用下图表示,例如INT为1,经过反向器后变为0,此时Ug为0,P-MOS上的Us为3.3V,则导通,此时OUT输出为1;同理,若INT为0,则OUT为0。推的时候方向为VDD->OUT;挽的时候方向为OUT->GND。
-
开漏输出:P-MOS管不工作,只能输出低电平。若INT为1,经过反向器为0,Ug=Us截止,此时OUT悬空,为高阻态。若要输出高电平,则需要加上拉电阻,此时OUT则为1。若INT为0,则OUT为0。多用于IIC与SMBUS总线。
-
TTL肖特基触发器:高于2V将其变为1,低于1.2V将其变为0;输入数据寄存器的值只能为0/1。模拟输入不经过该触发器。
-
I/O引脚做输出,我们可以直接通过设置输出数据寄存器,也可以通过设置位设置/位清除寄存器进行配置,因为它最终会写到数据输出寄存器中。
-
-
GPIO初始化顺序:
-
选定具体的GPIOx
-
打开该GPIOx的时钟
-
配置GPIO工作模式(CRL/CRH寄存器)
-
控制GPIO输出高低电平(ODR/BRR/BSRR寄存器)
-
-
-
寄存器操作LED代码
/*****main.c******/ #include "stm32f10x.h" void SystemInit(void); int main(void){ #if 0 //-----地址操作 //打开GPIOB端口的时钟 *(unsigned int *)0x40021018 |= ((1) << 3); //配置为输出模式且配置速度 *(unsigned int *)0x40010C00 |= (1 << 0); //控制ODR寄存器 *(unsigned int *)0x40010C0C &= ~(1 << 0);//最低位清零,其它位保持不变 #endif //-----寄存器操作 //打开GPIOB端口的时钟 RCC_APB2ENR |= ((1) << 3); //配置为输出模式且配置速度 GPIOB_CRL &= ~(0x0F << 0);//操作多个bit之前先进行清0操作,严谨**** GPIOB_CRL |= (1 << 0); //控制ODR寄存器 GPIOB_ODR &= ~(1 << 0);//最低位清零,其它位保持不变 return 0; } void SystemInit(void) { //函数体为空,目的是为了骗过编译器不报错 }
/*********stm32f10x.h********/ //用来存放STM32寄存器映射的代码 #define PERIPH_BASE (unsigned int)0x40000000 //外设基地址 #define APB1_PERIPH_BASE PERIPH_BASE //APB1基地址 #define APB2_PERIPH_BASE (PERIPH_BASE + 0x10000) //APB1基地址 #define AHB_PERIPH_BASE (PERIPH_BASE + 0x20000) //APB1基地址 #define RCC_BASE (AHB_PERIPH_BASE + 0x1000) //RCC基地址 #define GPIOB_BASE (APB2_PERIPH_BASE + 0x0C00) //GPIOB基地址 #define RCC_APB2ENR *(unsigned int *)(RCC_BASE + 0x18)//APB2时钟使能寄存器 #define GPIOB_CRL *(unsigned int *)(GPIOB_BASE + 0x00) #define GPIOB_CRH *(unsigned int *)(GPIOB_BASE + 0x04) #define GPIOB_ODR *(unsigned int *)(GPIOB_BASE + 0x0C)
-
实验结果
STM32--新建工程模板(寄存器版本)
最新推荐文章于 2024-06-19 14:27:27 发布