1、单片机寄存器-io输入实验笔记

1、硬件

时钟总线如下:

PB端口挂载在AHB1总线上,因此要对该位进行使能。

引脚

LED0和LED1挂载在PB0和PB1上:推挽输出、100M、 上拉默认高电平,低电平点亮。

2、软件

位带操作

复制代码
#ifndef _IO_BIT_H_
#define _IO_BIT_H_
 
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr&0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
//F103XXIO
#define GPIOA_ODR_Addr (GPIOA_BASE+0x0C) //0x40020014
#define GPIOB_ODR_Addr (GPIOB_BASE+0x0C) //0x40020414 
#define GPIOC_ODR_Addr (GPIOC_BASE+0x0C) //0x40020814
#define GPIOD_ODR_Addr (GPIOD_BASE+0x0C) //0x40020C14
#define GPIOE_ODR_Addr (GPIOE_BASE+0x0C) //0x40021014
#define GPIOA_IDR_Addr (GPIOA_BASE+0x08) //0x40020010
#define GPIOB_IDR_Addr (GPIOB_BASE+0x08) //0x40020410
#define GPIOC_IDR_Addr (GPIOC_BASE+0x08) //0x40020810
#define GPIOD_IDR_Addr (GPIOD_BASE+0x08) //0x40020C10
#define GPIOE_IDR_Addr (GPIOE_BASE+0x08) //0x40021010

//F103XXI0 口操作,只对单一的I0 口,n 的值范围[0-15]
#define PAout(n) 		BIT_ADDR(GPIOA_ODR_Addr,n) //GPIOA 
#define PAin(n) 		BIT_ADDR(GPIOA_IDR_Addr,n) //GPIOA 
#define PBout(n) 		BIT_ADDR(GPIOB_ODR_Addr,n) //GPIOB 
#define	PBin(n) 		BIT_ADDR(GPIOB_IDR_Addr,n) //GPIOB 
#define PCout(n)		BIT_ADDR(GPIOC_ODR_Addr,n) //GPIOC 
#define PCin(n) 		BIT_ADDR(GPIOC_IDR_Addr,n) //GPIOC 
#define PDout(n) 		BIT_ADDR(GPIOD_ODR_Addr,n) //GPIOD 
#define PDin(n) 		BIT_ADDR(GPIOD_IDR_Addr,n) //GPIOD 
#define PEout(n) 		BIT_ADDR(GPIOE_ODR_Addr,n) //GPIOE 
#define PEin(n) 		BIT_ADDR(GPIOE_IDR_Addr,n) //GPIOE 


#endif

led.h

复制代码
#ifndef __LED_H
#define __LED_H	 
#include "sys.h" 

#define LED0 PBout(1)	// DS0
#define LED1 PBout(0)	// DS1	 

void LED_Init(void);//初始化
#endif

led.c

复制代码
void LED_Init(void)
{    	 
	RCC->AHB1ENR|=1<<1;//PB端口使能
	GPIO_Set(GPIOB,PIN0|PIN1,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PB0,PB1端口配置
	LED0=1;//LED0关闭
	LED1=1;//LED1关闭
}

main.c

复制代码
#include "sys.h"
#include "delay.h" 
#include "led.h"

  
int main(void)
{ 
	Stm32_Clock_Init(360,25,2,8);//设置时钟180MHz
	delay_init(180);		// 初始化延迟函数
	LED_Init();				// 灯的初始化函数
	while(1)
	{
		LED0=0;				// LED0亮
		LED1=1;				// LED1灭
		delay_ms(500);
		LED0=1;				// LED0灭
		LED1=0;				// LED1亮
		delay_ms(500);
	}
}
相关推荐
菥蓂寻生4 小时前
STM32移植到GD32中以105为例
stm32·单片机·嵌入式硬件
橘为己有44113 小时前
51单片机:定时/计数器
单片机·51单片机
杯子不吃紫菜15 小时前
LangGraph 体系实战(下):中断恢复、流式、子图与设计模式
单片机·嵌入式硬件·设计模式
qq_4480111616 小时前
中断服务函数简介
嵌入式硬件
Risehuxyc16 小时前
STM32程序逻辑---入口函数逻辑和NVIC嵌套向量中断控制器初始化
stm32·单片机·嵌入式硬件
【 STM32开发 】16 小时前
CubeMX+STM32】SD卡U盘实现__USB+FATFS (F103 篇)
stm32·单片机·嵌入式硬件
jianqiang.xue17 小时前
3倍向量算力:Arm给最小MCU装上本地AI
arm开发·人工智能·单片机
无敌最俊朗-1 天前
【电感专题2:电感的感抗、电路的阻抗、电流的滞后】
单片机·嵌入式硬件·元器件·电感
wuyk5551 天前
嵌入式故障诊断-Bug002-局部大数组压栈高温必死机
stm32·单片机·嵌入式硬件·mcu·物联网·51单片机·嵌入式实时数据库
Zwawa2 天前
嵌入式OLED表驱动菜单:用一张表、一个栈和一个窗口重写表驱动菜单
c语言·单片机·嵌入式