发新帖我要提问
12
返回列表
打印
[STM32F1]

基于STM32F103C8T6的EXTI外部中断感应灯

[复制链接]
楼主: 雨果喝水
手机看帖
扫描二维码
随时随地手机跟帖
21
雨果喝水|  楼主 | 2022-12-27 16:03 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
5)AFIO复用IO口

AFIO主要用于引脚复用功能的选择和定义
在STM32中,AFIO主要完成两个任务:复用功能引脚重映射、中断引脚选择

使用特权

评论回复
22
雨果喝水|  楼主 | 2022-12-27 16:04 | 只看该作者
如图为中断引脚选择功能

使用特权

评论回复
23
雨果喝水|  楼主 | 2022-12-27 16:06 | 只看该作者

使用特权

评论回复
24
雨果喝水|  楼主 | 2022-12-27 16:07 | 只看该作者
EXTI功能框图

使用特权

评论回复
25
雨果喝水|  楼主 | 2022-12-27 16:08 | 只看该作者
EXTI中断函数配置

外部中断软件设计
a) 软件设计思想
i. 初始化中断
ii. EXTI(外部中断)

使用特权

评论回复
26
雨果喝水|  楼主 | 2022-12-27 16:10 | 只看该作者
所有使用到的外设时钟使能
初始化GPIO口
外部中断线配置
a) AFIO外部中断寄存器选择哪个端口
EXTI相关寄存器
NVIC配置

使用特权

评论回复
27
雨果喝水|  楼主 | 2022-12-27 16:11 | 只看该作者
中断服务函数

中断服务函数的编写
a) 判断是哪一个中断(共用中断服务函数)
b) 清对应中断挂起标志位
c) 中断服务函数

使用特权

评论回复
28
雨果喝水|  楼主 | 2022-12-27 16:12 | 只看该作者
程序代码

1、Exti.c
#include "stm32f10x.h"
#include "exti.h"


void Exti_Init(void)
{
   
          //1.配置GPIO
          GPIO_InitTypeDef shake_init;       
          EXTI_InitTypeDef exti_init;
          NVIC_InitTypeDef nvic_init;
       
          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//优先级分组配置

                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);//配置GPIO时钟
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//配置EXTI中断时钟,又输出又中断
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource2);
          
          
         
          
       
          shake_init.GPIO_Mode   =  GPIO_Mode_IPD;
                shake_init.GPIO_Pin    =  GPIO_Pin_2;
    shake_init.GPIO_Speed  =  GPIO_Speed_10MHz;
       
                GPIO_Init(GPIOA,&shake_init);

       
          //2.配置Exti外部中断
          exti_init.EXTI_Line    = EXTI_Line2;//外部中断通道
          exti_init.EXTI_LineCmd = ENABLE;//使能外部中断通道
          exti_init.EXTI_Mode    = EXTI_Mode_Interrupt;//选择外部中断模式
          exti_init.EXTI_Trigger = EXTI_Trigger_Falling;//中断触发方式
         
          EXTI_Init(&exti_init);//中断初始化
          
       
          //3.配置NVIC中断控制器
               
          nvic_init.NVIC_IRQChannel    =  EXTI2_IRQn;//中断通道2
                nvic_init.NVIC_IRQChannelCmd =  ENABLE;    //使能通道
                nvic_init.NVIC_IRQChannelPreemptionPriority =  1; //抢占优先级
                nvic_init.NVIC_IRQChannelSubPriority   =  1;//子优先级
               
                NVIC_Init(&nvic_init);  

}



使用特权

评论回复
29
雨果喝水|  楼主 | 2022-12-27 16:14 | 只看该作者
Exti.h
#include "stm32f10x.h"

void Exti_Init(void);


使用特权

评论回复
30
雨果喝水|  楼主 | 2022-12-27 16:15 | 只看该作者
shake.c
#include "stm32f10x.h"
#include "shake.h"

void Shake_Init(void)
{
            GPIO_InitTypeDef shake_init;       
       
          //1.使能GPIOA时钟
                        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
       
       
                //2.结构体配置
            shake_init.GPIO_Mode   =  GPIO_Mode_IPD;
                        shake_init.GPIO_Pin    =  GPIO_Pin_2;
            shake_init.GPIO_Speed  =  GPIO_Speed_10MHz;
       
                        GPIO_Init(GPIOA,&shake_init);

       
                       
       
          
       
       

}


使用特权

评论回复
31
雨果喝水|  楼主 | 2022-12-27 16:28 | 只看该作者
skake.h
#include "stm32f10x.h"

void Shake_Init(void);







使用特权

评论回复
32
雨果喝水|  楼主 | 2022-12-27 16:29 | 只看该作者
relay.c
#include "stm32f10x.h"
#include "relay.h"


void Relay_Init(void)
{
       
            GPIO_InitTypeDef relay_init;
                //1.使能GPIOA时钟
            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

       
          //2.GPIOA3结构体配置
                        relay_init.GPIO_Mode  = GPIO_Mode_Out_PP;
            relay_init.GPIO_Pin   = GPIO_Pin_3 ;
            relay_init.GPIO_Speed = GPIO_Speed_10MHz;
       
            GPIO_Init(GPIOA, &relay_init);
       
}


使用特权

评论回复
33
雨果喝水|  楼主 | 2022-12-27 16:31 | 只看该作者
relay.h
#include "stm32f10x.h"

void Relay_Init(void);


使用特权

评论回复
34
雨果喝水|  楼主 | 2022-12-27 16:32 | 只看该作者
main.c
#include "stm32f10x.h"
#include "main.h"
#include "LED.h"
#include "usart.h"
#include "relay.h"
#include "shake.h"
#include "exti.h"

void delay(uint16_t time)//延迟函数
{
                uint16_t i=0;
          while(time--)
                {
                                i=12000;
                          while(i--);
                }
}



int  main()
{
         LED_Init();
         usart_init();
         Relay_Init();
         Shake_Init();
         Exti_Init();
       
         GPIO_SetBits(GPIOA,GPIO_Pin_3);
       
}


void  EXTI2_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line2)!=RESET)//如果函数发生中断
                {
                                GPIO_ResetBits(GPIOA,GPIO_Pin_3);//接通继电器,开灯
                          delay(1000);
                          GPIO_SetBits(GPIOA,GPIO_Pin_3);//关闭继电器,关灯
                }
                else
                {
                                GPIO_SetBits(GPIOA,GPIO_Pin_3);//关闭继电器,关灯
                }
               
                EXTI_ClearITPendingBit(EXTI_Line2);//中断标志清除

}





使用特权

评论回复
35
雨果喝水|  楼主 | 2022-12-27 16:35 | 只看该作者
USART.C
#include "stm32f10x.h"
#include "usart.h"

void usart_init(void)   //串口初始化
{
            GPIO_InitTypeDef GPIO_initstructure;
            USART_InitTypeDef USART_initstructure;
            NVIC_InitTypeDef Nvic_Init;
            NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   //配置中断组为中断组2   misc.h
       
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
            RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);   //配置中断复用时钟
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
       

                
        //配置PA9 TX       
      GPIO_initstructure.GPIO_Mode   =GPIO_Mode_AF_PP; //推挽输出
                        GPIO_initstructure.GPIO_Pin    =GPIO_Pin_9;
                        GPIO_initstructure.GPIO_Speed  =GPIO_Speed_50MHz;
                        GPIO_Init(GPIOA,&GPIO_initstructure);

              //配置PA10 RX
            GPIO_initstructure.GPIO_Mode   =GPIO_Mode_IN_FLOATING; //浮空输入
                        GPIO_initstructure.GPIO_Pin    =GPIO_Pin_10;
                       
            GPIO_Init(GPIOA,&GPIO_initstructure);
             
             //串口1打开
            USART_initstructure.USART_BaudRate=115200;    //波特率
            USART_initstructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
            USART_initstructure.USART_Mode=USART_Mode_Rx | USART_Mode_Tx;
                        USART_initstructure.USART_Parity=USART_Parity_No;     //校验位
                        USART_initstructure.USART_StopBits= USART_StopBits_1;         //停止位
                        USART_initstructure.USART_WordLength= USART_WordLength_8b;  //有效字节长度  8位
            USART_Init(USART1,&USART_initstructure);
      //使能串口1
                        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);   //串口中断配置
                        USART_Cmd(USART1,ENABLE);

      
   //配置中断
      
                                               
                  Nvic_Init.NVIC_IRQChannel       =USART1_IRQn;       //设置中断通道  stm32f10x.h
                  Nvic_Init.NVIC_IRQChannelCmd    =ENABLE;                   //控制是否使能
                  Nvic_Init.NVIC_IRQChannelPreemptionPriority  =1;          //设置抢占优先级
                  Nvic_Init.NVIC_IRQChannelSubPriority   =1;             //设置子优先级
               
                  NVIC_Init(&Nvic_Init);

}


//发送单个字符   调用方法   USARTSendByte(USART1,'o');
void USARTSendByte(USART_TypeDef* USARTx, uint16_t Data){

  USART_SendData(USART1,Data);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET);  //判断是否发送完成

}



//发送字符串   //原理字符发送最后一位是\0判断是否最后一位\0就能发送字符串   调用方法   USARTSendStr(USART1,"ruanzebin");
void USARTSendStr(USART_TypeDef* USARTx, char *str){

   uint16_t i=0; //无符号整形十六位
  
    do{
                       
                USARTSendByte(USARTx, *(str+i));
                        i++;
               
               
                }while(*(str+i)!='\0');

   while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);  //判断是否发送完成

}
  //printf 函数  putchar函数(输出单个字符)  通过重定向  输出数值
int fputc(int ch ,FILE *f){


  USART_SendData(USART1,(uint8_t)ch);
  while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET);  //判断是否发送完成

  return (ch);
}
  //scanf()  getchar函数   
int fgetc(FILE *f)
{
       
     while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE)==RESET); //判断是否接收成功

       return (int)USART_ReceiveData(USART1);


}






使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则