STM32串口空闲中断
串口初始化
- #include "usart5.h"
- vu16 UART5_RX_STA=0;
- char UART5_RX_BUF[UART5_REC_LEN];
- u8 UART5_TX_BUF[UART5_MAX_SEND_LEN];
- extern unsigned char send_flag,Return;
- extern unsigned char uart5_flag0;
- extern unsigned int bufj;
- void usart5_Init(u32 bound)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE); //ʹÄÜUART5£¬GPIOCʱÖÓ
- // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
- // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- // GPIO_Init(GPIOD, &GPIO_InitStructure);//³õʼ»¯
- // GPIO_SetBits(GPIOD,GPIO_Pin_1); //
- //UART5_TX
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸´ÓÃÍÆÍìÊä³ö
- GPIO_Init(GPIOC, &GPIO_InitStructure);//³õʼ»¯
- //UART5_RX
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿ÕÊäÈë
- GPIO_Init(GPIOD, &GPIO_InitStructure);//³õʼ»¯
- //Uart5 NVIC ÅäÖÃ
- NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//ÇÀÕ¼ÓÅÏȼ¶2
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //×ÓÓÅÏȼ¶1
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀʹÄÜ
- NVIC_Init(&NVIC_InitStructure); //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷
- //UART5 ³õʼ»¯ÉèÖÃ
- USART_InitStructure.USART_BaudRate = bound;//´®¿Ú²¨ÌØÂÊ
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤Îª8λÊý¾Ý¸ñʽ
- USART_InitStructure.USART_StopBits = USART_StopBits_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; //ÊÕ·¢Ä£Ê½
- USART_Init(UART5, &USART_InitStructure); //³õʼ»¯´®¿Ú5
- USART_ITConfig(UART5,USART_IT_IDLE,ENABLE);
- USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);//¿ªÆô´®¿Ú½ÓÊÜÖжÏ
- // TIM7_Int_Init(99,7199); //10msÖжÏ
- // UART5_RX_STA=0;
- USART_Cmd(UART5, ENABLE); //ʹÄÜ´®¿Ú4
- delay_FOR(1000);
- }
- char NUMFind[200]={0};
- int NUNFind_cnt = 0;
- void Uart5_Char(unsigned char ch)
- {
- while(USART_GetFlagStatus(UART5,USART_FLAG_TC)==RESET);
- USART_SendData(UART5,ch);
- }
- void Uart5_SendFIFO(unsigned char cmd[],unsigned int Len)
- {
- unsigned char i;
- while((UART5->SR & 0x40)==0);
- for(i=0;i<Len;i++)
- {
- UART5->DR = cmd[i];
- while((UART5->SR & 0x40)==0);
- }
- }
- void u5_printf(char* fmt,...)
- {
- u16 i,j;
- va_list ap;
- va_start(ap,fmt);
- vsprintf((char*)UART5_TX_BUF,fmt,ap);
- va_end(ap);
- i=strlen((const char*)UART5_TX_BUF);
- for(j=0;j<i;j++)
- {
- while(USART_GetFlagStatus(UART5,USART_FLAG_TC)==RESET);
- USART_SendData(UART5,UART5_TX_BUF[j]);
- }
- }
中断调用代码
- extern uint8_t Usart5_ReceiveState;
- extern u16 count;
- __asm void SystemReset(void);
- void UART5_IRQHandler(void)
- {
- u8 clear= clear;
- u8 res;
- if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET)
- {
- USART_ClearITPendingBit(UART5, USART_IT_RXNE);
- res = USART_ReceiveData(UART5);
- UART5_RX_BUF[count] = res;
- count++;
- // Uart5_Char(res);
- }
- else if(USART_GetITStatus(UART5, USART_IT_IDLE) != RESET)
- {
- clear = UART5->SR;
- clear = UART5->DR;
- Usart5_ReceiveState = 1;
- }
- }
主函数返回
- uint8_t Usart5_ReceiveState;
- void RCC_Configuration(void);
- void Port_Init(void);
- u16 count=0;
- int main()
- {
- u16 i;
- RCC_ClearFlag();
- RCC_Configuration();
- Init485();
- RF_PortInit();
- uart1_Init(115200);
- usart5_Init(115200);
- GET_ID();
- while(1)
- {
- GPIO_ResetBits(GPIOE,GPIO_Pin_4);
- GPIO_ResetBits(GPIOE,GPIO_Pin_5);
- for(i=0;i<test;i++)
- {
- // u5_printf("hello Dev,I am %s,\n\n",ID);
- // u5_printf("who are you?\n\n",ID);
- }
- // u1_printf("hello Dev,I am %s\n\n",ID);
- delay_FOR(400);
- if(Usart5_ReceiveState)
- {
- for(i=0;i<count;i++)
- {
- Uart5_Char(UART5_RX_BUF[i]);
- }
- // Uart5_Char(0x01);
- count = 0;
- Usart5_ReceiveState=0;
- }
- }
- }
- void RCC_Configuration(void)
- {
- ErrorStatus HSEStartUpStatus; //¶¨ÒåÍⲿ¾§ÕñΪÆô¶¯×´Ì¬Ã¶¾Ù±äÁ¿
- SystemInit(); //ϵͳ³õʼ»¯
- RCC_DeInit(); //¸´Î»RCC¼Ä´æÆ÷µ½Ä¬ÈÏÖµ
- RCC_HSEConfig(RCC_HSE_ON); //´ò¿ªÍⲿ¸ßËÙ¾§Õñ
- HSEStartUpStatus = RCC_WaitForHSEStartUp(); //µÈ´ýÍⲿ¸ßËÙ¾§Õñ×¼±¸ºÃ
- if(HSEStartUpStatus == SUCCESS) //Æô¶¯³É¹¦
- {
- FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); ////flash¶ÁÈ¡»º´æÇøʹÄÜ
- FLASH_SetLatency(FLASH_Latency_2); //flashÑÓʱ
- RCC_HCLKConfig(RCC_SYSCLK_Div1); //??AHB(HCLK)????==SYSCLK
- RCC_PCLK2Config(RCC_HCLK_Div1); //??APB2(PCLK2)?==AHB??
- RCC_PCLK1Config(RCC_HCLK_Div2); //??APB1(PCLK1)?==AHB1/2,Ô¤·ÖƵ2 72M
- RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //??PLL?? == 8M£¨Íⲿ£© * 9 = 72MHz
- RCC_PLLCmd(ENABLE); //??PLL??
- while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) //??PLL????
- {
- }
- RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //?????? = PLL??
- while(RCC_GetSYSCLKSource() != 0x08) //??PLL??????????
- {
- }
- }
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|
- RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOF|RCC_APB2Periph_GPIOG , ENABLE);//
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
- }
STM32串口空闲中断的更多相关文章
- Stm32使用串口空闲中断,基于队列来接收不定长、不定时数据
串口持续地接收不定长.不定时的数据,把每一帧数据缓存下来且灵活地利用内存空间,下面提供一种方式供参考.原理是利用串口空闲中断和DMA,每当对方发来一帧完整的数据后,串口接收开始空闲,触发中断,在中断处 ...
- 串口配合DMA接收不定长数据(空闲中断+DMA接收)-(转载)
1.空闲中断和别的接收完成(一个字节)中断,发送完成(发送寄存器控)中断的一样是串口中断: 2.空闲中断是接收到一个数据以后,接收停顿超过一字节时间 认为桢收完,总线空闲中断是在检测到在接收数据后, ...
- 串口1配合DMA接收不定长数据(空闲中断+DMA接收)
1.空闲中断和别的接收完成(一个字节)中断,发送完成(发送寄存器控)中断的一样是串口中断: 2.空闲中断是接收到一个数据以后,接收停顿超过一字节时间 认为桢收完,总线空闲中断是在检测到在接收数据后, ...
- STM32串口遇到的一个问题
做HLW8032电能表项目中关于USART使用DMA接收定长数据的问题 1:由于HLW8032芯片一上电,芯片就会通过串口每隔50ms向STM32发送24字节的数据,且我不能通过STM32控制HLW8 ...
- STM32串口DMA接收数据错位——暴力解决方法
背景:两片STM32通过串口通信,为了减小CPU负担,采用DMA进行通信,发送端为STM32F103C8T6,接收端为STM32F407VET6.在调试的过程中发现,一直出现数据错位的问题,接收端尝试 ...
- STM32—串口使用总结
文章目录 一.仅向上位机打印调试信息 二.与上位机交互信息 三.作为驱动接口 四.结合DMA接收数据帧 在日常学习中,串口经常作为和上位机通信的接口,进行打印信息方便调试程序,有时也会作为模块的驱动接 ...
- STM32 HAL 库实现乒乓缓存加空闲中断的串口 DMA 收发机制,轻松跑上 2M 波特率
前言 直接储存器访问(Direct Memory Access,DMA),允许一些设备独立地访问数据,而不需要经过 CPU 介入处理.因此在访问大量数据时,使用 DMA 可以节约可观的 CPU 处理时 ...
- STM32串口中断的一些资料
在研究STM32串口接收发送中断的时候找到不少不错的资料,现在备份在这里.以供自己查阅,以及方便其他人. TC ====TXE 顺便预告下最近会写个有关串口处理数据的帖子,从查询和中断方面以及数据处理 ...
- 关于STM32空闲中断
有一次做一个东西,为了尽量不占用CPU的处理数据时间,所以就使用DMA接收串口的数据,但是呢问题来了.,,,,,怎么样才能确定接收到了一条完整的数据了,,我们都知道只要打开DMA 那家伙就不停的把接收 ...
随机推荐
- mysql截取函数substring_index()和right()用法
); 以.作为截取的分隔符. ); 从第2位开始截取,截取所有的. );
- Lodop打印表格带页头页尾 高度是否包含页头页尾
通过设置TableHeightScope,可以实现对ADD_PRINT_TABLE,表格带页头页尾,查看本博客另一篇博文:Lodop打印表格带页头页尾 自动分页每页显示头尾 超文本超过打印项高度,会自 ...
- codeforces483B
Friends and Presents CodeForces - 483B You have two friends. You want to present each of them severa ...
- 获取本地的jvm信息,进行图形化展示
package test1; import java.lang.management.CompilationMXBean; import java.lang.management.GarbageCol ...
- 【CF1132G】Greedy Subsequences(线段树)
[CF1132G]Greedy Subsequences(线段树) 题面 CF 题解 首先发现选完一个数之后选择下一个数一定是确定的. 对于每个数预处理出左侧第一个比他大的数\(L\),那么这个数加入 ...
- [CTSC2018]暴力写挂
题目描述 www.lydsy.com/JudgeOnline/upload/201805/day1(1).pdf 题解 首先来看这个我们要最大化的东西. deep[u]+deep[v]-deep[lc ...
- Django的admin视图的使用
要现在admin.py文件中将你要视图化操作的类进行注册: from django.contrib import admin from api import models # Register you ...
- 五十二、linux 编程——网络介绍
52.1 网络介绍 使用远程资源 共享信息.程序和数据 分布处理 52.1.1 协议的概念 计算机网络中实现通信必须有一些约定,如对速率.传输代码.代码结构.传输控制步骤和出错控制等约定,这些约定即被 ...
- TPS和QPS 并发量区别;日活 访问量 活跃度
一.系统承载吞度量 系统的吞度量(承压能力)与request对CPU的消耗.外部接口.IO等等紧密关联.单个reqeust 对CPU消耗越高,外部系统接口.IO影响速度越慢,系统吞吐能力越低,反之越高 ...
- Python3:OOP Demo
方便快速回顾Python的OOP语法 ###################### # 类的私有专有方法 # ###################### # __init__ : 构造函数,在生成对 ...