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);
}
}