OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3669|回复: 0

用原子大神的STM32F767做的按键中断点灯程序

[复制链接]

10

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2015-10-8
在线时间
18 小时
发表于 2021-4-5 17:09:44 | 显示全部楼层 |阅读模式
原代码分享如下:
#include "it.h"
#include "delay.h"

/*

函数名:it_init()
函数功能:中断初始化函数
形参:无
返回值:无
备注:

硬件:                                PB0:led1         推挽上拉输出
                                                        PB1:led0         推挽上拉输出
                                                        PA0: WK_UP        下拉输入
                                                        PC13:key2        上拉输入
                                                        PH2:        key1        上拉输入
                                                        PH3:        key0        上拉输入
                                                       

软件:                                代码流程:
                                                                1. 初始化各GPIO口
                                                                2. 初始化EXTI配置
                                                                3. 初始化NVIC配置
                                                                4. 中断服务函数
                                                                5. 主函数。

*/

void it_init()
{
        uint32_t i;
        /**************GPIO 初始化************/
       
        //打开GPIO口的时钟源

        RCC->AHB1ENR |=(0x87<<0);
        //GPIO口PA0的模式,输出类型,输出速度,上/下拉配置
        GPIOA->MODER &=~(3<<0);
        GPIOA->MODER |=(1<<0);
        GPIOA->OTYPER&=~(1<<0);
        GPIOA->OSPEEDR&=~(3<<0);
        GPIOA->OSPEEDR|=(3<<0);
        GPIOA->PUPDR &=~(3<<0);
        GPIOA->PUPDR |=(2<<0);
        //GPIO口PB0、PB1的模式,输出类型,输出速度,上/下拉配置
        GPIOB->MODER &=~(0xf<<0);
        GPIOB->MODER |=(0x5<<0);
        GPIOB->OTYPER&=~(3<<0);
        GPIOB->OSPEEDR&=~(0xf<<0);
        GPIOB->OSPEEDR|=(0xf<<0);
        GPIOB->PUPDR &=~(0xf<<0);
        GPIOB->PUPDR |=(0x5<<0);
        //GPIO口PC13的模式,输出类型,输出速度,上/下拉配置
        GPIOC->MODER &=~(0x3<<26);
        GPIOC->PUPDR &=~(0x3<<26);
        GPIOC->PUPDR |=(0x1<<26);
        //GPIO口PH2、PH3的模式,输出类型,输出速度,上/下拉配置
        GPIOH->MODER &=~(0xf<<4);
        GPIOH->PUPDR &=~(0xf<<4);
        GPIOH->PUPDR |=(0x5<<4);

/****************EXTI中断配置***************************/

        //EXTI3_key0_PH3中断配值配值

        RCC->APB2ENR |=(1<<14);

        i=(0x05FA0000|0x500);
        SCB->AIRCR =i;
        EXTI->IMR &=~(1<<3);
        EXTI->IMR |=(1<<3);
        EXTI->FTSR|=(1<<3);
        SYSCFG->EXTICR[0] |=(0x7<<12);
        NVIC->ISER[0] |=(1<<9);
        NVIC->IP[9]=0xA0;
       
        //EXTI2—key1_PH2中断配置
        EXTI->IMR &=~(1<<2);
        EXTI->IMR |=(1<<2);
        EXTI->FTSR|=(1<<2);
        SYSCFG->EXTICR[0] |=(0x7<<8);
        NVIC->ISER[0] |=(1<<8);
        NVIC->IP[8]=0xE0;
       
        //EXTI15-10—key2_PC13中断配置
        EXTI->IMR &=~(1<<13);
        EXTI->IMR |=(1<<13);
        EXTI->FTSR|=(1<<13);
        SYSCFG->EXTICR[3] |=(0x7<<4);
        NVIC->ISER[1] |=(1<<8);
        NVIC->IP[40]=0xF0;
       
       
}

/*

函数名:EXTI2_IRQHandler
函数功能:中断线2服务函数
形参:无
返回值:无
备注:

硬件:                                PB0:led1         推挽上拉输出
                                                        PB1:led0         推挽上拉输出
                                                        PA0: WK_UP        下拉输入
                                                        PC13:key2        上拉输入
                                                        PH2:        key1        上拉输入
                                                        PH3:        key0        上拉输入
                                                       

软件:                                代码流程:
                                                                1. 初始化各GPIO口
                                                                2. 初始化EXTI配置
                                                                3. 初始化NVIC配置
                                                                4. 中断服务函数
                                                                5. 主函数。

*/

void EXTI2_IRQHandler()
{
        delay_ms(10);

        if(EXTI->PR&0x1<<2)
        {
                ledg_0;
                delay_ms(500);
                ledg_1;
                delay_ms(500);
        }
       
                EXTI->PR |=(1<<2);
}


void EXTI3_IRQHandler()
{
                delay_ms(10);

        if(GPIOH->IDR&0x1<<3)
        {
                ledr_0;
                delay_ms(500);
                ledr_1;
                delay_ms(500);
        }
                EXTI->PR |=(1<<3);
       
}
       




void EXTI15_10_IRQHandler()
{
        delay_ms(10);

        if(GPIOC->IDR&0x1<<13)
        {
                ledg_0;
                ledr_0;
                delay_ms(500);
                ledg_1;
                ledr_1;
                delay_ms(500);
        }
       
                EXTI->PR |=(1<<13);
}       
       
       
       


请大家讨论
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-28 03:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表