main.c文件
#include "sys.h"
#include "delay.h"
#include "gpio.h"
uint8_t GetCNState;
int main(void)
{
delay_init(); //延时函数初始化
GPIO_Quick_Init(GPIOA_Pin0,GPIO_Mode_Out_PP,1); //初始化A0为推挽输出模式,开始电平为1
GPIO_Quick_Init(GPIOB_Pin1,GPIO_Mode_Out_PP,0); //初始化B1为推挽输出模式, 开始电平为0
GPIO_Quick_Init(GPIOC_Pin2,GPIO_Mode_IPU,1); //初始化C2为上拉输入模式
Write_GPIOx_Pinx(GPIOA_Pin0,0); //A0输出0
GetCNState = Read_GPIOx_Pinx(GPIOB_Pin1); //读端口B1的电平
while(1)
{
}
}
gpio.c文件
#include "gpio.h"
#include "delay.h"
/**************************************
功能 :GPIO快速初始化
参数1:选择GPIO
参数2:选择模式
GPIO_Mode_AIN
GPIO_Mode_Out_PP
GPIO_Mode_IPD
GPIO_Mode_IPU
GPIO_Mode_Out_OD
GPIO_Mode_Out_PP
GPIO_Mode_AF_OD
GPIO_Mode_AF_PP
参数3:IO口初始状态
**************************************/
void GPIO_Quick_Init(GPIOx_Pinx_enum GPIOx_Pinx, GPIOMode_TypeDef GPIO_Mode,u8 val)
{
static int Remap_SWJ_Disable = 0;
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_TypeDef* GPIOx;
uint16_t GPIO_Pin;
Check_GPIOx_Pinx(GPIOx_Pinx,&GPIOx,&GPIO_Pin);
if (GPIOx == GPIOA)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能端口时钟
else if(GPIOx == GPIOB)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能端口时钟
else if(GPIOx == GPIOC)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能端口时钟
else if(GPIOx == GPIOD)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //使能端口时钟
else if(GPIOx == GPIOE)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); //使能端口时钟
else if(GPIOx == GPIOF)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE); //使能端口时钟
else if(GPIOx == GPIOG)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE); //使能端口时钟
if( ((GPIOx == GPIOB && GPIO_Pin == GPIO_Pin_3) || (GPIOx == GPIOB && GPIO_Pin == GPIO_Pin_4) ||
(GPIOx == GPIOA && GPIO_Pin == GPIO_Pin_13) || (GPIOx == GPIOA && GPIO_Pin == GPIO_Pin_14) ||
(GPIOx == GPIOA && GPIO_Pin == GPIO_Pin_15)) && Remap_SWJ_Disable == 0)
{
Remap_SWJ_Disable = 1;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //使能端口时钟
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
}
GPIO_InitStructure.GPIO_Pin = GPIO_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOx, &GPIO_InitStructure); //根据设定参数初始化
GPIO_WriteBit(GPIOx,GPIO_Pin,(BitAction)val);
}
/**************************************
功能 :写GPIO
参数1:选择GPIO
参数2:写入的值
**************************************/
void Write_GPIOx_Pinx(GPIOx_Pinx_enum GPIOx_Pinx,u8 val)
{
GPIO_TypeDef* GPIOx;
uint16_t GPIO_Pin;
Check_GPIOx_Pinx(GPIOx_Pinx,&GPIOx,&GPIO_Pin);
GPIO_WriteBit(GPIOx,GPIO_Pin,(BitAction)val);
}
/**************************************
功能 :读GPIO
参数1:选择GPIO
返回 :GPIO值
**************************************/
uint8_t Read_GPIOx_Pinx(GPIOx_Pinx_enum GPIOx_Pinx)
{
GPIO_TypeDef* GPIOx;
uint16_t GPIO_Pin;
Check_GPIOx_Pinx(GPIOx_Pinx,&GPIOx,&GPIO_Pin);
return (GPIO_ReadInputDataBit(GPIOx,GPIO_Pin));
}
void Check_GPIOx_Pinx(GPIOx_Pinx_enum GPIOx_Pinx,GPIO_TypeDef** GPIOx,uint16_t* GPIO_Pin)
{
if(GPIOx_Pinx < 16*1) *GPIOx = GPIOA;
else if(GPIOx_Pinx < 16*2) *GPIOx = GPIOB;
else if(GPIOx_Pinx < 16*3) *GPIOx = GPIOC;
else if(GPIOx_Pinx < 16*4) *GPIOx = GPIOD;
else if(GPIOx_Pinx < 16*5) *GPIOx = GPIOE;
else if(GPIOx_Pinx < 16*6) *GPIOx = GPIOF;
else if(GPIOx_Pinx < 16*7) *GPIOx = GPIOG;
if(GPIOx_Pinx % 16 == 0) *GPIO_Pin = GPIO_Pin_0;
else if(GPIOx_Pinx % 16 == 1) *GPIO_Pin = GPIO_Pin_1;
else if(GPIOx_Pinx % 16 == 2) *GPIO_Pin = GPIO_Pin_2;
else if(GPIOx_Pinx % 16 == 3) *GPIO_Pin = GPIO_Pin_3;
else if(GPIOx_Pinx % 16 == 4) *GPIO_Pin = GPIO_Pin_4;
else if(GPIOx_Pinx % 16 == 5) *GPIO_Pin = GPIO_Pin_5;
else if(GPIOx_Pinx % 16 == 6) *GPIO_Pin = GPIO_Pin_6;
else if(GPIOx_Pinx % 16 == 7) *GPIO_Pin = GPIO_Pin_7;
else if(GPIOx_Pinx % 16 == 8) *GPIO_Pin = GPIO_Pin_8;
else if(GPIOx_Pinx % 16 == 9) *GPIO_Pin = GPIO_Pin_9;
else if(GPIOx_Pinx % 16 == 10) *GPIO_Pin = GPIO_Pin_10;
else if(GPIOx_Pinx % 16 == 11) *GPIO_Pin = GPIO_Pin_11;
else if(GPIOx_Pinx % 16 == 12) *GPIO_Pin = GPIO_Pin_12;
else if(GPIOx_Pinx % 16 == 13) *GPIO_Pin = GPIO_Pin_13;
else if(GPIOx_Pinx % 16 == 14) *GPIO_Pin = GPIO_Pin_14;
else if(GPIOx_Pinx % 16 == 15) *GPIO_Pin = GPIO_Pin_15;
}
gpio.h文件
#ifndef __GPIO_H_
#define __GPIO_H_
#include "sys.h"
typedef enum
{
GPIOA_Pin0 = 0,GPIOA_Pin1,GPIOA_Pin2,GPIOA_Pin3,GPIOA_Pin4,GPIOA_Pin5,GPIOA_Pin6,GPIOA_Pin7,GPIOA_Pin8,GPIOA_Pin9,GPIOA_Pin10,GPIOA_Pin11,GPIOA_Pin12,GPIOA_Pin13,GPIOA_Pin14,GPIOA_Pin15,
GPIOB_Pin0,GPIOB_Pin1,GPIOB_Pin2,GPIOB_Pin3,GPIOB_Pin4,GPIOB_Pin5,GPIOB_Pin6,GPIOB_Pin7,GPIOB_Pin8,GPIOB_Pin9,GPIOB_Pin10,GPIOB_Pin11,GPIOB_Pin12,GPIOB_Pin13,GPIOB_Pin14,GPIOB_Pin15,
GPIOC_Pin0,GPIOC_Pin1,GPIOC_Pin2,GPIOC_Pin3,GPIOC_Pin4,GPIOC_Pin5,GPIOC_Pin6,GPIOC_Pin7,GPIOC_Pin8,GPIOC_Pin9,GPIOC_Pin10,GPIOC_Pin11,GPIOC_Pin12,GPIOC_Pin13,GPIOC_Pin14,GPIOC_Pin15,
GPIOD_Pin0,GPIOD_Pin1,GPIOD_Pin2,GPIOD_Pin3,GPIOD_Pin4,GPIOD_Pin5,GPIOD_Pin6,GPIOD_Pin7,GPIOD_Pin8,GPIOD_Pin9,GPIOD_Pin10,GPIOD_Pin11,GPIOD_Pin12,GPIOD_Pin13,GPIOD_Pin14,GPIOD_Pin15,
GPIOE_Pin0,GPIOE_Pin1,GPIOE_Pin2,GPIOE_Pin3,GPIOE_Pin4,GPIOE_Pin5,GPIOE_Pin6,GPIOE_Pin7,GPIOE_Pin8,GPIOE_Pin9,GPIOE_Pin10,GPIOE_Pin11,GPIOE_Pin12,GPIOE_Pin13,GPIOE_Pin14,GPIOE_Pin15,
GPIOF_Pin0,GPIOF_Pin1,GPIOF_Pin2,GPIOF_Pin3,GPIOF_Pin4,GPIOF_Pin5,GPIOF_Pin6,GPIOF_Pin7,GPIOF_Pin8,GPIOF_Pin9,GPIOF_Pin10,GPIOF_Pin11,GPIOF_Pin12,GPIOF_Pin13,GPIOF_Pin14,GPIOF_Pin15,
GPIOG_Pin0,GPIOG_Pin1,GPIOG_Pin2,GPIOG_Pin3,GPIOG_Pin4,GPIOG_Pin5,GPIOG_Pin6,GPIOG_Pin7,GPIOG_Pin8,GPIOG_Pin9,GPIOG_Pin10,GPIOG_Pin11,GPIOG_Pin12,GPIOG_Pin13,GPIOG_Pin14,GPIOG_Pin15,
}GPIOx_Pinx_enum;
void Check_GPIOx_Pinx(GPIOx_Pinx_enum GPIOx_Pinx,GPIO_TypeDef** GPIOx,uint16_t* GPIO_Pin);
void GPIO_Quick_Init(GPIOx_Pinx_enum GPIOx_Pinx, GPIOMode_TypeDef GPIO_Mode,u8 val) ;
void Write_GPIOx_Pinx(GPIOx_Pinx_enum GPIOx_Pinx,u8 val) ;
uint8_t Read_GPIOx_Pinx(GPIOx_Pinx_enum GPIOx_Pinx);
void Get_Key_Time(GPIOx_Pinx_enum GPIOx_Pinx,long* PressLastTimes,u8 PressCN,u8 IsWait);
#endif
上一篇:STM32应用简章之PWM输出
下一篇:STM32快速初始化引脚 一行代码完成引脚初始化
推荐阅读
史海拾趣
进入21世纪后,EA Elektro-Automatik加大了对研发的投入,致力于技术突破和产品创新。公司成功开发出一系列具有高精度、高可靠性和高性能的电力测试解决方案,如高速模拟稳压器、直流/交流源、并联操作设备等。这些产品不仅满足了市场对精密测试设备的需求,也进一步巩固了EA Elektro-Automatik在电子测量领域的领先地位。
Amveco Toroidal Power Products公司成立于XXXX年,初始阶段主要专注于环形变压器的研发与生产。创始人凭借对环形变压器技术的深入了解和市场需求的敏锐洞察,带领团队克服了初创期的种种困难,成功开发出了具有高效能、低噪音特点的环形变压器产品,并赢得了客户的初步认可。随着市场口碑的逐渐积累,公司的业务规模开始稳步扩大。
面对日益激烈的市场竞争,统宇电研不断拓展市场领域,寻求新的增长点。公司积极参与国内外行业展会和论坛,加强与客户的沟通与交流,深入了解市场需求。同时,统宇电研还针对不同地区的市场特点,制定了灵活多样的销售策略和方案。这些努力使得统宇电研的市场份额不断扩大,品牌知名度也逐渐提升。
面对日益激烈的市场竞争,统宇电研不断拓展市场领域,寻求新的增长点。公司积极参与国内外行业展会和论坛,加强与客户的沟通与交流,深入了解市场需求。同时,统宇电研还针对不同地区的市场特点,制定了灵活多样的销售策略和方案。这些努力使得统宇电研的市场份额不断扩大,品牌知名度也逐渐提升。
为了进一步提升市场份额和品牌影响力,DIOTECH公司开始加大市场拓展力度。通过参加国际电子展会、举办新品发布会等活动,公司成功吸引了全球范围内的客户和合作伙伴的关注。同时,公司还加强了品牌建设,通过一系列营销活动提升了品牌知名度和美誉度。这些努力使得DIOTECH逐渐成为了电子行业内的知名品牌。
刚刚看到一个专于MSP430的个人网站,版主是南航 - 魏小龙 从里面看到了几个MSP430程序设计的初级资料,在这里分享一下 MSP430串口异步通讯原理与实现.pdf MSP430定时器的使用.pdf MSP430简单的端口、显示、中断综合应用.pdf… 查看全部问答∨ |
|
今天闲逛,在网上看到的这个图片,也许坛子里有人放过,但也顾不得了,因为它可以引出我接下来要谈的话题: 最近一周,是出奇的忙,再加上之前穷忙族的测试,80%和自己都相似,于是心里不禁一阵寒战。 回到家里,赶紧找出了都覆盖了尘土的《 ...… 查看全部问答∨ |
|
WINCE跑起来了,但启动画面停在logo处,没有跳到WINCE桌面??? 我的系统是Centrality Atlas-III+wince 5.0 现象是:如果在OAL层OEMInit中初始化LCD控制器参数,并显示logo,系统启动OK,能进wince桌面; 如果在EBOOT中初始化LCD控制器参数,并显示logo,从打印信息看, ...… 查看全部问答∨ |
我用的是2450的平台,现在把电池的驱动加上以后,若电池充满电了,即BatteryLifePercent=100%了,系统托盘那电池的图标会不见了!!!若BatteryLifePercent比100%低,则会出来,我该怎么把电池充满电的图标显示出来呢?第二个问题,电池电量降低了 ...… 查看全部问答∨ |
我们选修课 计算机体系结构设计与仿真 要用这些东邪,但是 计算机组成原理书上没有这方面的设计,只有alu,控制器这些,我网上也没找到有谁做个这个设计。 问下论坛里有人做这个吗,或者知道这个的引导下。 … 查看全部问答∨ |
|
有意请联系pangyuxi@danfoss.com IT Support IT支持工程师 职位描述/要求: 职位描述: 计算机系统客户端软硬件及相关周边设备的日常维护支持 计算机生产系统的支持 公司局域网的日常维护与支持 公司最终用户的相关培训 ...… 查看全部问答∨ |
设计资源 培训 开发板 精华推荐
- 美信基础模拟IC APP下载 助力您创新模拟设计!评论、抢楼全有礼!
- Keysight感恩月:每天送出一台示波器,一次注册即可参与
- 盛夏嗨学有礼——和dcexpert一起学ESP8266
- 直播已结束|浅谈Microchip的FPGA产品与智能嵌入式视觉解决方案
- “悦”读deyisupport博文 乐享知识智赢好礼
- 看专题答题赢好礼!PI 稳定可靠的TOPSwitch-JX开关电源IC
- 下载、答题赢好礼:使用Mentor的Xpedition Layout高效设计PCB
- 2023 DigiKey KOL 系列——将TinyML融入IoT物联网应用中
- 领取评测任务,免费体验NUCLEO-L452RE开发套件