完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一、普通输出
int main() { unsigned int clk; // 系统时钟存在一个默认值 可不配置 SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN); clk=SysCtlClockGet(); //需要打开时钟 这里的延时是每三个时钟周期计数一次,所以要除以3 SysCtlDelay(SysCtlClockGet()*0.2/3); // 使能端口外设时钟 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); // 配置为输出模式 GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3); // 端口输出值 GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 2); while(1) { SysCtlDelay(SysCtlClockGet()*0.2/3); GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 2); SysCtlDelay(SysCtlClockGet()*0.2/3); GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0); } } 每个 GPIO 端口的中断能力都由 7 个寄存器控制。这些寄存器可以用于选择中断源、极性以及边沿属性。当一个或多个输入引发中断时,只有一个中断输出被送到整个GPIO端口的中断控制器。对于边沿触发,为了让进一步的中断可用,软件必须清除该中断。对于电平触发,必须保持住外部电平的状态才能使控制器识别中断的发生。 GPIO 端口 P 的每个管脚都可触发中断。每个管脚有一个专用中断向量,可以被单独的中断处理器. 处理。 配置步骤 配置系统时钟(可不配置) 打开端口时钟 配置为输出模式 为端口写值 二、输入中断 #include "key.h" unsigned char SW1_Press = 0; Key_State Key_Press[4] = {NIS_PRESS,NIS_PRESS,NIS_PRESS,NIS_PRESS}; void PortFIntHandler(void) { static uint8_t trigger=0; static uint32_t s; //获取中断状态 s = GPIOIntStatus(GPIO_PORTF_BASE, true); //清除发生的中断标志 GPIOIntClear(GPIO_PORTF_BASE, s); if((s&GPIO_PIN_4) ) { while(!GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_4));//等待按键松开 if(!trigger) trigger=1,GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_3|GPIO_PIN_1,1<<1); else trigger=0,GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_3|GPIO_PIN_1,0); } } void PortEIntHandler(void) { static uint8_t trigger=0; static uint32_t s; //获取中断状态 s = GPIOIntStatus(GPIO_PORTE_BASE, true); //清除发生的中断标志 GPIOIntClear(GPIO_PORTE_BASE, s); if((s&GPIO_PIN_1) ) { Key_Press[0] = 1; while(!GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_1));//等待按键松开 Key_Press[0] = IS_PRESS; if(!trigger) trigger=1,GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_3|GPIO_PIN_1,1<<1); else trigger=0,GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_3|GPIO_PIN_1,0); } if((s&GPIO_PIN_2)) { while(!GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_2));//等待按键松开 Key_Press[1] = IS_PRESS; if(!trigger) trigger=1,GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_3|GPIO_PIN_1,1<<1); else trigger=0,GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_3|GPIO_PIN_1,0); } if((s&GPIO_PIN_3)) { while(!GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_3));//等待按键松开 Key_Press[2] = IS_PRESS; if(!trigger) trigger=1,GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_3|GPIO_PIN_1,1<<1); else trigger=0,GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_3|GPIO_PIN_1,0); } if((s&GPIO_PIN_4)) { while(!GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_4));//等待按键松开 Key_Press[3] = IS_PRESS; if(!trigger) trigger=1,GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_3|GPIO_PIN_1,1<<1); else trigger=0,GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_3|GPIO_PIN_1,0); } } /* 函数功能:板载按键初始化,只能用SW1 */ void KeyInit(void) { //使能PF时钟 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOF)) { } //设置PF4为输入 GPIOPinTypeGPIOInput( GPIO_PORTF_BASE, GPIO_PIN_4); //上拉(没按就是高电平,按下就是低电平) GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);//推挽上拉 //PF4配置为下降沿中断 GPIOIntTypeSet(GPIO_PORTF_BASE,GPIO_PIN_4,GPIO_FALLING_EDGE); //开启PF4的中断 GPIOIntEnable(GPIO_PORTF_BASE,GPIO_PIN_4); //给PF组注册一个中断函数 GPIOIntRegister(GPIO_PORTF_BASE, PortFIntHandler); } /* 函数功能:扩展四个IO为按键模块,分别使用PE1-PE4 */ void ExternKeyInit(void) { SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE); while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOE)) { } GPIOPinTypeGPIOInput( GPIO_PORTE_BASE, GPIO_PIN_1); GPIOPadConfigSet(GPIO_PORTE_BASE, GPIO_PIN_1, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU); GPIOIntTypeSet(GPIO_PORTE_BASE,GPIO_PIN_1,GPIO_FALLING_EDGE); GPIOIntEnable(GPIO_PORTE_BASE,GPIO_PIN_1); GPIOIntRegister(GPIO_PORTE_BASE, PortEIntHandler); GPIOPinTypeGPIOInput( GPIO_PORTE_BASE, GPIO_PIN_2); GPIOPadConfigSet(GPIO_PORTE_BASE, GPIO_PIN_2, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);//推挽上拉 GPIOIntTypeSet(GPIO_PORTE_BASE,GPIO_PIN_2,GPIO_FALLING_EDGE); GPIOIntEnable(GPIO_PORTE_BASE,GPIO_PIN_2); GPIOIntRegister(GPIO_PORTE_BASE, PortEIntHandler); GPIOPinTypeGPIOInput( GPIO_PORTE_BASE, GPIO_PIN_3); GPIOPadConfigSet(GPIO_PORTE_BASE, GPIO_PIN_3, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);//推挽上拉 GPIOIntTypeSet(GPIO_PORTE_BASE,GPIO_PIN_3,GPIO_FALLING_EDGE); GPIOIntEnable(GPIO_PORTE_BASE,GPIO_PIN_3); GPIOIntRegister(GPIO_PORTE_BASE, PortEIntHandler); GPIOPinTypeGPIOInput( GPIO_PORTE_BASE, GPIO_PIN_4); GPIOPadConfigSet(GPIO_PORTE_BASE, GPIO_PIN_4, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);//推挽上拉 GPIOIntTypeSet(GPIO_PORTE_BASE,GPIO_PIN_4,GPIO_FALLING_EDGE); GPIOIntEnable(GPIO_PORTE_BASE,GPIO_PIN_4); GPIOIntRegister(GPIO_PORTE_BASE, PortEIntHandler); } 中断配置:注册中断 -> 中断类型-> 中断使能 中断标志位:获取标志位 -> 清除标志位 如果是正确的标志位则进行操作 |
|
|
|
只有小组成员才能发言,加入小组>>
3310 浏览 9 评论
2991 浏览 16 评论
3492 浏览 1 评论
9057 浏览 16 评论
4086 浏览 18 评论
1175浏览 3评论
603浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
596浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2333浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 16:04 , Processed in 1.094916 second(s), Total 78, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号