int main(void)
{
uint8_t a=;//LED高低电压控制 /* System Clocks Configuration */
RCC_Configuration(); //系统时钟设置
/*嵌套向量中断控制器
说明了USART1抢占优先级级别0(最多1位) ,和子优先级级别0(最多7位) */
NVIC_Configuration(); //中断源配置
/*对控制LED指示灯的IO口进行了初始化,将端口配置为推挽上拉输出,口线速度为50Mhz。PA9,PA10端口复用为串口1的TX,RX。
在配置某个口线时,首先应对它所在的端口的时钟进行使能。否则无法配置成功,由于用到了端口B, 因此要对这个端口的时钟
进行使能,同时由于用到复用IO口功能用于配置串口。因此还要使能AFIO(复用功能IO)时钟。*/
GPIO_Configuration(); //端口初始化
USART_Config(USART1); //串口1初始化 while ()
{
if(rec_f == )
{
//判断是否收到一帧有效数据
rec_f = ; for(i=; i<sizeof(TxBuffer1); i++) //发送字符串
{
USART_SendChar(USART1,TxBuffer1[i]);
Delay(0x0000ff0);
}
/*for(i=0;i<TxCounter1;i++)//发送字符串
{
USART_SendChar(USART1,RxBuffer1[i]);
} */
if(a==)
{
GPIO_SetBits(GPIOD, GPIO_Pin_2); //LED1 明暗闪烁
a=;
}
else
{
GPIO_ResetBits(GPIOD, GPIO_Pin_2);
a=;
}
}
}
}

main函数如上。

相关变量

uint8_t TxBuffer1[] = "USART Interrupt Example: This is USART1 DEMO";
uint8_t RxBuffer1[], rec_f, tx_flag, i; __IO uint8_t TxCounter1 = 0x00;
__IO uint8_t RxCounter1 = 0x00; uint32_t Rec_Len;

串口中断函数配置如下所示:

//--------------------------------------------------------------------------------------
void USART_SendChar(USART_TypeDef* USARTx,uint8_t data)
{
USART_SendData(USARTx,data);
while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET);
}
//--------------------------------------------------------------------------------------
void USART_Config(USART_TypeDef* USARTx)
{
USART_InitStructure.USART_BaudRate = ; //速率19200bps
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位8位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位1位
USART_InitStructure.USART_Parity = USART_Parity_No; //无校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流控
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式 /* Configure USARTx */
USART_Init(USARTx, &USART_InitStructure); //配置串口参数函数 /* Enable USARTx Receive and Transmit interrupts */
USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE); //使能接收中断
USART_ITConfig(USARTx, USART_IT_TXE, ENABLE); //使能发送缓冲空中断 /* Enable the USARTx */
USART_Cmd(USARTx, ENABLE);
}
//--------------------------------------------------------------------------------------
void Delay(__IO uint32_t nCount)
{
for(; nCount!=; nCount--);
}
/*--------------------------------------------------------------------------------------
系统时钟配置为72MHZ+外设时钟配置*/
void RCC_Configuration(void)
{
SystemInit();
RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOD |RCC_APB2Periph_GPIOA, ENABLE);
}
//--------------------------------------------------------------------------------------
void GPIO_Configuration(void)
{
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //LED1控制--PD2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //USART1 TX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure); //A端口 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //USART1 RX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //复用开漏输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //A端口
}
//--------------------------------------------------------------------------------------
void NVIC_Configuration(void)
{
/* 结构声明*/
NVIC_InitTypeDef NVIC_InitStructure; /* Configure the NVIC Preemption Priority Bits */
/* Configure one bit for preemption priority */
/* 优先级组 说明了抢占优先级所用的位数,和子优先级所用的位数 在这里是1, 7 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //设置串口1中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = ; //抢占优先级 0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = ; //子优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);
}

在中断服务函数中编写usart函数。

//串口1 中断服务程序
void USART1_IRQHandler(void)
{
unsigned int i; //判断读寄存器是否非空
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
//将读寄存器的数据缓存到接收缓冲区里
RxBuffer1[RxCounter1++] = USART_ReceiveData(USART1); //判断结束标志是否是0x0d 0x0a
if(RxBuffer1[RxCounter1-] == 0x0d && RxBuffer1[RxCounter1-] == 0x0a)
{
for(i=; i< RxCounter1; i++)
TxBuffer1[i] = RxBuffer1[i]; //将接收缓冲器的数据转到发送缓冲区,准备转发 //接收成功标志
rec_f = ; //发送缓冲区结束符
TxBuffer1[RxCounter1] = ;
TxCounter1 = RxCounter1;
RxCounter1 = ;
}
} //这段是为了避免STM32 USART 第一个字节发不出去的BUG
if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
{
//禁止发缓冲器空中断,
USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
} }

运行结果如下,在发送去不填写任何字符,直接发送,显示RT Interrupt Example: This is USART1 DEMO,说明前三个字符已经被占用替换了。

试验平台alienteck mini stm32V1.9 stm32f103rbt6

STM32串口中断实例二的更多相关文章

  1. STM32串口中断的一些资料

    在研究STM32串口接收发送中断的时候找到不少不错的资料,现在备份在这里.以供自己查阅,以及方便其他人. TC ====TXE 顺便预告下最近会写个有关串口处理数据的帖子,从查询和中断方面以及数据处理 ...

  2. STM32 串口中断总结

    原文:https://blog.csdn.net/weixin_42480952/article/details/82981409 最近在学习使用dma传输方式进行串口通讯,感觉这个很详细,存一下 . ...

  3. STM32串口——中断方式的一般配置方法

    #include "stm32f10x.h" /************************************************ 该程序讲解串口程序的一般配置方法: ...

  4. stm32串口学习(二)

    今天继续学习stm32的串口编程(利用库函数).上次我们说了串口的发送,这次我们说接收. 接收可以用查询的方法,也可以用中断.显然,工程中多用中断的方式,那么就来看看中断接收. 代码其实很简单,基本的 ...

  5. stm32串口中断总结

    串口文件uart.c需要被用到; 串口通信是对GPIO端口引脚的功能复用,因此需要用到gpio.c; 因为中断的产生,因此中断文件也是需要用到的: 中断响应函数需要自己编写: 接收中断:在接收移位寄存 ...

  6. STM32串口中断

    在打开串口1中断后 待机唤醒功能,(PA0唤醒)等 系统挺运行问题? ??(2014.11.13)

  7. stm32串口接收中断协议解析

    借鉴了文章:<stm32串口中断接收方式详细比较> 文章地址:http://blog.csdn.net/kevinhg/article/details/40186169 串口的配置这里不做 ...

  8. stm32串口接收完整的数据包

    参考了文章:<stm32串口中断接收方式详细比较> 文章地址:http://bbs.elecfans.com/jishu_357017_1_1.html 借鉴了第四种中断方式 串口的配置这 ...

  9. (二)stm32之中断配置

    一.stm32的中断和异常 Cortex拥有强大的异常响应系统,它能够打断当前代码执行流程事件分为异常和中断,它们用一个表管理起来,编号为0~15为内核异常,16以上的为外部中断,这个表就是中断向量表 ...

随机推荐

  1. net start命令发生系统错误5和错误1058的解决方法

    net start命令用于开启服务,格式为:net start [服务名](与之对应的"net stop [服务名]"为关闭服务命令) 5是没有管理员权限,右键管理员即可 1058 ...

  2. Spring整合Struts2 XML版

    1.jar包 <!--spring配置--> <dependency> <groupId>org.springframework</groupId> & ...

  3. 基于FCM的消息推送功能

    需求背景 我方项目需要支持客户端消息推送,iOS终端可以借由苹果本身的apns很方便的实现,但是对于Android来说,必须集成第三方的SDK来处理.考虑到项目需要以及成本,我们选择使用谷歌的FCM框 ...

  4. Bootstrap插件-carousel(轮播图)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Java图形界面开发—列出指定目录

    代码如下: package com.packageTemp; import javax.swing.*; import java.awt.*; import java.awt.event.*; imp ...

  6. Masonry 等间隔或等宽高排列多个控件

    - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...

  7. C#高性能Socket服务器IOCP实现

    引言我一直在探寻一个高性能的Socket客户端代码.以前,我使用Socket类写了一些基于传统异步编程模型的代码(BeginSend.BeginReceive,等等)也看过很多博客的知识,在linux ...

  8. 使用JDBC操作SAP云平台上的HANA数据库

    本文假设您对JDBC(Java Database Connectivity)有最基本的了解.您也可以将其同ADBC(ABAP Database Connectivity)做对比,细节请参考我的博客AD ...

  9. php之基础深入---类与对象篇

    1.类的自动加载: spl_autoload_register()函数可以注册任意数量的自动加载器,当使用尚未被定义的类(class)和接口(interface)时自动去加载,这样可以避免includ ...

  10. Head First HTML与CSS阅读笔记(二)

    上一篇Head First HTML与CSS阅读笔记(一)中总结了<Head First HTML与CSS>前9章的知识点,本篇则会将剩下的10~15章内容进行总结,具体如下所示. div ...