欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > 单片机库函数-io输出操作

单片机库函数-io输出操作

2025/1/5 11:47:32 来源:https://blog.csdn.net/amyliyanice/article/details/144753401  浏览:    关键词:单片机库函数-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)
{ //PB11GPIO_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);		}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com