五,串口的中断接收

项目概述:

源代码:

main.c

#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "relay.h"
#include "shake.h"
#include "usart.h"
#include "exti.h"
void delay(uint16_t time)//延时函数
{
    uint16_t i=0;
    while(time--){
         i=12000;
        while(i--);
    }
}
   //结构体,接口pin 输出模式mode, 速率speed,在 gpio.C的gpio.h里
   //GPIO初始化函数也在gpio.C的gpio.h里
int  main()
{
   //先到main(),然后到下面的函数,然后到对应的.h,然后.c文件
     LED_Init();
     //Relay_Init();
   //Shake_Init();
     //Exti_Init();
     
    usart_init();
//    printf("wwxstm32");
    //putchar('9');
    //GPIO_SetBits(GPIOA , GPIO_Pin_4);//初始化继电器为关闭状态, 与代码3有关
    
     while(1) 
  {
        
  }
 
    
}
void USART1_IRQHandler(void)
{
  char temp;
    if(USART_GetITStatus( USART1, USART_IT_RXNE) != RESET)
    {
       temp = USART_ReceiveData(USART1);
        if(temp == 'O')
        {
           GPIO_ResetBits(GPIOA , GPIO_Pin_1);
             UsartSendStr(USART1,"LED IS OPEN");
        }
        if(temp == 'C')
        {
           GPIO_SetBits(GPIOA , GPIO_Pin_1);
            UsartSendStr(USART1,"LED IS CLOSE");
        }
    }
}
main.h

#include "stm32f10x.h"
void delay(uint16_t time);
usart.c

#include "usart.h"
#include "stm32f10x.h"
void usart_init(void)
{
GPIO_InitTypeDef gpiostruct;//定义结构体变量
USART_InitTypeDef Usartstruct;//定义结构体变量
NVIC_InitTypeDef Nvicstruct;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  //配置时钟:GPIOA的时钟,串口的时钟,引脚复用的时钟
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//配置GPIO的结构体 配置PA9 TX输出引脚
gpiostruct.GPIO_Mode  =  GPIO_Mode_AF_PP;//复用推挽输出
gpiostruct.GPIO_Pin   =  GPIO_Pin_9;//选定管脚为pA
gpiostruct.GPIO_Speed =  GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&gpiostruct);//调用初始化函数
//配置PA10 RX输入引脚
gpiostruct.GPIO_Mode = GPIO_Mode_IN_FLOATING ;//浮空输入
gpiostruct.GPIO_Pin  = GPIO_Pin_10;
//配置串口的结构体
GPIO_Init(GPIOA,&gpiostruct);
Usartstruct.USART_BaudRate = 115200;//波特率  配置波特率115200
Usartstruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流控制
Usartstruct.USART_Mode = USART_Mode_Rx  | USART_Mode_Tx;//USART模式 配置工作模式 收或发
Usartstruct.USART_Parity = USART_Parity_No;//检验位
Usartstruct.USART_StopBits = USART_StopBits_1;//停止位
Usartstruct.USART_WordLength = USART_WordLength_8b;//字长 配置控制数据位的字长:八位
USART_Init(USART1, &Usartstruct);//调用初始化函数
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//中断配置函数
USART_Cmd(USART1, ENABLE);
  
Nvicstruct.NVIC_IRQChannel = USART1_IRQn;
Nvicstruct.NVIC_IRQChannelCmd = ENABLE;
Nvicstruct.NVIC_IRQChannelPreemptionPriority = 1;
Nvicstruct.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&Nvicstruct);
}
//串口的发送
//创建发送单个字符的函数UsartSendByte()
void UsartSendByte(USART_TypeDef* USARTx, uint16_t Data)//参数结构体指针,要发送的数据
{
USART_SendData(USARTx,Data);//串口发送函数 在库函数中,
  while( USART_GetFlagStatus(USARTx,USART_FLAG_TXE) ==  RESET );//判断他的数据寄存器是否为空
}
//创建发送字符串的函数
void UsartSendStr(USART_TypeDef* USARTx,char *str)
{
    uint16_t i =0;
do
{
      UsartSendByte( USARTx, *(str + i));
     i++;
}while( *(str + i) != '\0' );
 while( USART_GetFlagStatus(USARTx,USART_FLAG_TC) ==  RESET );
      
}
int fputc(int ch,FILE *f)
{
     USART_SendData(USART1, (uint8_t)ch);
     while( USART_GetFlagStatus(USART1,USART_FLAG_TC) ==  RESET );
      return (ch);
}
int fgetc(FILE *f)
{ 
  while( USART_GetFlagStatus(USART1,USART_FLAG_RXNE) ==  RESET );
  return (int) USART_ReceiveData(USART1);
}
usart.h

#include "stm32f10x.h"
#include <stdio.h>
void usart_init(void);
void UsartSendByte(USART_TypeDef* USARTx, uint16_t Data);
void UsartSendStr(USART_TypeDef* USARTx,char *str);
led.c

#include "led.h"
#include "stm32f10x.h"
void LED_Init(void){
 
GPIO_InitTypeDef led_init;
//使能apb2的gpioa,说人话就是打开这个gpioa
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 
led_init.GPIO_Mode  = GPIO_Mode_Out_PP; //推挽输出模式
led_init.GPIO_Pin   = GPIO_Pin_1;       //引脚为1看原理图
led_init.GPIO_Speed = GPIO_Speed_10MHz; //点灯 速率10mhz即可
GPIO_Init(GPIOA,&led_init);
}
led.h

#include "stm32f10x.h"
void LED_Init(void);

效果展示:

手动发送C,led2灯灭,同时串口发送led is close

手动发送O,led2灯亮,同时串口发送led is open

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值