STM32--新建工程模板(寄存器版本)

  • 寄存器点亮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)

  • 实验结果

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值