单片机库函数-io输出操作
1、需要使用模块
使用库函数做跑马灯,要用到:
misc.h
misc.c
时钟模块:
stm32f10x_rcc.h
stm32f10x_rcc.c
gpio模块:
头文件:stm32f10x_gpio.h
源文件:stm32f10x_gpio.c
2、库函数
2.1、初始化GPIO
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
2.2、2个读取输入电平
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
2.3、2个读取输出电平
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
2.4、4个设置输出电平
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
3、步骤
a、使能io时钟
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
b、初始化io口
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
c、操作io口,输出高低电平
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); // 拉高引脚输出电平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); // 拉低引脚输出电平
4、呼吸灯实现代码
4.1、库函数实现
led.c
void led_init(void)
{
//PB11
GPIO_InitTypeDef gpio_InitTypeDef;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
gpio_InitTypeDef.GPIO_Mode=GPIO_Mode_Out_PP;
gpio_InitTypeDef.GPIO_Pin=GPIO_Pin_11;
gpio_InitTypeDef.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOB,&gpio_InitTypeDef);
GPIO_ResetBits(GPIOB,GPIO_Pin_11);
}
main.c
void main()
{
led_init();
while(1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_11);
delay(500);
GPIO_ResetBits(GPIOB,GPIO_Pin_11);
delay(500);
}
}
4.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 ijһλÊä³ö
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //GPIOA ijһλÊäÈë
#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //GPIOB ijһλÊä³ö
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //GPIOB ijһλÊäÈë
#define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //GPIOC ijһλÊä³ö
#define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //GPIOC ijһλÊäÈë
#define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //GPIOD ijһλÊä³ö
#define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //GPIOD ijһλÊäÈë
#define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //GPIOE ijһλÊä³ö
#define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //GPIOE ijһλÊäÈë
#endif
void main()
{
led_init();
while(1)
{
PBout(11) = 1;
delay(500);
PBout(11) = 0;
delay(500);
}
}