01 void USART1_IRQHandler(void)
02 {
03 static u8 i;
04 const u8 BufferSize = 20;
05 static u8 Counter = 0, index = 0;
06 static u8 RxBuffer[BufferSize];
07 static u8 TxBuffer[BufferSize];
08
09 if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断
10 {
11 RxBuffer[Counter] = USART_ReceiveData(USART1);
12 Counter++;//不会出错
13 if (0x0A == RxBuffer[Counter - 1] && 0x0D == RxBuffer[Counter - 2])
14 {
15 for (i = 0; i < Counter - 1; i++)
16 TxBuffer[i] = RxBuffer[i];
17 Counter = 0;
18 USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
19 }
20 //Counter++; 发送中断后,将导致RxBuffer[0] == RxBuffer[1],
21
22 //因为当打开USART_IT_TXE中断后,将立即触发发送中断,形成中断嵌套,而发送中断程序为完毕后将继续执行此行。
23
24 }
25
26 if (USART_GetITStatus(USART1, USART_IT_TXE) != RESET)//发送中断
27 {
28 USART_SendData(USART1, TxBuffer[index++]);
29 if (index == i)
30 {
31 index = 0;
32 USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
33 }
34 }
35 }
关键字:USART 发送与接收 无意识中断嵌套
引用地址:
USART发送与接收无意识中断嵌套
推荐阅读最新更新时间:2024-03-16 15:14
stm32f103 USART串口简单实现
(基于奋斗stm32_v5开发板) 1、创建工程并编写C程序 #include stm32f10x.h #include stdarg.h void USART1_Config() { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; /* 使能USART1的时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA , ENABLE); /*配置USART1 TX,并设置为复用推挽输出模式*/ GPIO_In
[单片机]
stm32学习之十
USART,AD与GPIO的温度传感器: 注意的是: 1、ADC_RegularChannelConfig(ADC1,ADC_Channel_16,1,ADC_SampleTime_239Cycles5); 2、ADC_TempSensorVrefintCmd(ENABLE); 依照上一节的程序,可以改写以下,形成现在的程序与效果: add.h和add.h(写成这种方式,原因与上一节一样) add.h的代码: #ifndef _ADD_H #define _ADD_H #include stm32f10x.h //对于12位的ADC,3.3V的ADC值为0xfff,温度为25度时对应的电压值为1.43V即0
[单片机]
STM32通过中断方式实现USART1通信
1.前言 这个例程花了我好几天的时间,涉及到的内容比较多,走了很多弯路,一定要总结一下! 首先说明,我的开发板不是比较流行的正点原子家的,而是普中的STM32F1,原子家的开发板太贵了。到目前为止,我还没有发现我的开发板出现硬件上的问题,就是客服很不给力,关于仿真器配置的一个小问题就解决不了。好在网上资料比较丰富,慢慢也能解决自己遇到的一些问题。 思路和程序网上大家列举的都一样。在上网查资料的过程中发现,ARM开发板就是厉害,我想找什么问题,不管大家用什么型号的开发板,程序几乎一点都没有变化,问题讨论起来方便多了! 2.程序摘要 分为4部分:GPIO配置、USART参数配置、NVIC总中断配置、中断函数; 在主函数中初始
[单片机]
STM32 USART 串口 DMA 接收和发送的源码详解
硬件平台:STM32F103ZET6; 开发环境:KEIL 4; 先说说应用通讯模式,串口终端的工作方式和迪文屏差不多,终端被动接受MCU发的指令,终端会偶尔主动发送一些数据给MCU(像迪文屏的触摸信息上传)。 串口DMA发送: 发送数据的流程: 前台程序中有数据要发送,则需要做如下几件事 1. 在数据发送缓冲区内放好要发送的数据,说明:此数据缓冲区的首地址必须要在DMA初始化的时候写入到DMA配置中去。 2. 将数据缓冲区内要发送的数据字节数赋值给发送DMA通道,(串口发送DMA和串口接收DAM不是同一个DMA通道) 3. 开启DMA,一旦开启,则DMA开始发送数据,说明一下:在KEIL调试好的时候,DMA和调试是
[单片机]
stm32之USART学习
首先,我是看着这位博主的文章受到的启发,进而加深了自己对USART的理解。下面是自己改装并实验过的程序。 原文:http://www.cnblogs.com/greatwgb/archive/2011/07/28/2119350.html 1. 串口的基本概念 在STM32的参考手册中,串口被描述成通用同步异步收发器(USART),它提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。USART利用分数波特率发生器提供宽范围的波特率选择。它支持同步单向通信和半双工单线通信,也支持LIN(局部互联网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS
[单片机]
STM32关于USART的问题集锦
STM32F207的串口问题 问: 答1:RCC_APB2PeriphClockCmd(RCC_APB2Periph_USARTx, ENABLE) for USART1 and USART6 * RCC_APB1PeriphClockCmd(RCC_APB1Periph_USARTx, ENABLE) for USART2, USART3, UART4 or UART5. * 3、stm32中的串口通信中的USART_WordLength,数据位的长度包不包括开始位哪些? 问:stm32中的串口通信中的USART_WordLength,数据位的长度包不包括开始位哪些? 答:不包括开始位,如果你有 校验(奇 偶)的
[单片机]
STM32 端口复用&重映射(USART Remap)
下面跟大家说一下STM32单片机的端口重映射,这里是以USART1的重映射为例. STM32上有很多I/O口,也有很多的内置外设想I2C,ADC,ISP,USART等,为了节省引出管脚,这些内置外设基本上是与I/O口共用管脚的,也就是I/O管脚的复用功能。但是STM32还有一特别之处就是:很多复用内置的外设的I/O引脚可以通过重映射功能,从不同的I/O管脚引出,即复用功能的引脚是可通过程序改变的. 三个红框交汇处.STM32F103VCT6 这个CPU的USART1接的是PB6/PB7 但是上电初始化后默认功能并非是USART1.所以想要用串口功能 .必须用端口重映射.. 大家知道,STM32的单片机每个功能模块有自己
[单片机]
STM32F103V---固件库使用---USART1
/******************** USART应用******************** stm32库文件应用---USART1应用 芯片型号:STM32F103V 引脚: TXD1:PA9-US1-TX RXD1:PA10-US1-RX 编写日期:2012年3月24日 作者: ClimberWin 效果: 串口1输出数据,循环累加 波特率: 9600,n,8,1 */ /* Includes ------------------------------------------------------------------*/ #include stm32f10x.h #include misc.h
[单片机]