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 那家伙就不停的把接收 ...
随机推荐
- 关于PHP自动捕捉处理错误和异常的尝试
之所以想着做错误和异常的自动处理是因为: 用的公司自己的框架写API,没有异常和错误相关功能, 而每次操作都进行try...catch,有点繁琐不说,感觉还很鸡肋,即使我catch到了,还是得写代码进 ...
- Clion设置字体大小和护眼色
1.显示行号File->Settings->Editor->General->Appearance右侧,Show line numbers 2.设置字体大小与行间距File-& ...
- [模板] 二分图博弈 && BZOJ2463:[中山市选2009]谁能赢呢?
二分图博弈 from BZOJ 1443 游戏(二分图博弈) - free-loop - 博客园 定义 1.博弈者人数为两人,双方轮流进行决策. 2.博弈状态(对应点)可分为两类(状态空间可分为两个集 ...
- Ubuntu 16.04安装MySQL(5.7.18)
此篇为http://www.cnblogs.com/EasonJim/p/7139275.html的分支页. 安装MySQL前需要做如下了解: 1.MySQL各类型版本的区别,参考:http://ww ...
- [洛谷P4234] 最小差值生成树
题目类型:\(LCT\)动态维护最小生成树 传送门:>Here< 题意:求一棵生成树,其最大边权减最小边权最小 解题思路 和魔法森林非常像.先对所有边进行排序,每次加边的时候删除环上的最小 ...
- 【XSY2903】B 莫比乌斯反演
题目描述 有一个\(n\times n\)的网格,除了左下角的格子外每个格子的中心里都有一个圆,每个圆的半径为\(R\),问你在左下角的格子的中心能看到多少个圆. \(n\leq {10}^9,R_0 ...
- 多版本python及多版本pip使用
最近做一些网站的发布程序,要用到python3,所以又安装了python3. www.qlrx.netwww.393662.comwww.qnpx.netwww.393225.com ...
- 转:centos 7 安装音频视频解码器
(原文:https://blog.csdn.net/zhou1519/article/details/39035233/) 1.安装额外的软件源epel和nux-dextop rpm -Uvh htt ...
- Gym - 101350A Sherlock Bones(思维)
The great dog detective Sherlock Bones is on the verge of a new discovery. But for this problem, he ...
- maven wrapper使用本地maven
修改maven-wrapper.properties内容如下: #distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apa ...