串口初始化

#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串口空闲中断的更多相关文章

  1. Stm32使用串口空闲中断,基于队列来接收不定长、不定时数据

    串口持续地接收不定长.不定时的数据,把每一帧数据缓存下来且灵活地利用内存空间,下面提供一种方式供参考.原理是利用串口空闲中断和DMA,每当对方发来一帧完整的数据后,串口接收开始空闲,触发中断,在中断处 ...

  2. 串口配合DMA接收不定长数据(空闲中断+DMA接收)-(转载)

    1.空闲中断和别的接收完成(一个字节)中断,发送完成(发送寄存器控)中断的一样是串口中断: 2.空闲中断是接收到一个数据以后,接收停顿超过一字节时间  认为桢收完,总线空闲中断是在检测到在接收数据后, ...

  3. 串口1配合DMA接收不定长数据(空闲中断+DMA接收)

    1.空闲中断和别的接收完成(一个字节)中断,发送完成(发送寄存器控)中断的一样是串口中断: 2.空闲中断是接收到一个数据以后,接收停顿超过一字节时间  认为桢收完,总线空闲中断是在检测到在接收数据后, ...

  4. STM32串口遇到的一个问题

    做HLW8032电能表项目中关于USART使用DMA接收定长数据的问题 1:由于HLW8032芯片一上电,芯片就会通过串口每隔50ms向STM32发送24字节的数据,且我不能通过STM32控制HLW8 ...

  5. STM32串口DMA接收数据错位——暴力解决方法

    背景:两片STM32通过串口通信,为了减小CPU负担,采用DMA进行通信,发送端为STM32F103C8T6,接收端为STM32F407VET6.在调试的过程中发现,一直出现数据错位的问题,接收端尝试 ...

  6. STM32—串口使用总结

    文章目录 一.仅向上位机打印调试信息 二.与上位机交互信息 三.作为驱动接口 四.结合DMA接收数据帧 在日常学习中,串口经常作为和上位机通信的接口,进行打印信息方便调试程序,有时也会作为模块的驱动接 ...

  7. STM32 HAL 库实现乒乓缓存加空闲中断的串口 DMA 收发机制,轻松跑上 2M 波特率

    前言 直接储存器访问(Direct Memory Access,DMA),允许一些设备独立地访问数据,而不需要经过 CPU 介入处理.因此在访问大量数据时,使用 DMA 可以节约可观的 CPU 处理时 ...

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

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

  9. 关于STM32空闲中断

    有一次做一个东西,为了尽量不占用CPU的处理数据时间,所以就使用DMA接收串口的数据,但是呢问题来了.,,,,,怎么样才能确定接收到了一条完整的数据了,,我们都知道只要打开DMA 那家伙就不停的把接收 ...

随机推荐

  1. C# Note37: Writing unit tests with use of mocking

    前言 What's mocking and its benefits Mocking is an integral part of unit testing. Although you can run ...

  2. Django标签和过滤器

    过滤器格式{{   }} 标签格式{%  %} 模板中过滤器filter只能使用一个参数,自定义标签中则可以使用多个参数!!! 过滤器能够采用链式的方式使用,例如:{{ text | escape | ...

  3. c提高第三次作业

    1. char buf[] = "abcdef"; //下面有啥区别? const char *p = buf; //p指向的内存不能变 char const *p = buf; ...

  4. Kivy 中文教程 实例入门 简易画板 (Simple Paint App):1. 自定义窗口部件 (widget)

    1. 框架代码 用 PyCharm 新建一个名为 SimplePaintApp 的项目,然后新建一个名为 simple_paint_app.py 的 Python 源文件, 在代码编辑器中,输入以下框 ...

  5. Lodop的TABLE中format格式化的使用

    LODOP中的ADD_PRINT_TABLE支持很多函数和计算方法,可以用tdata对table表格里额数据进行计算,用format对结果进行格式化.这个format只能和tdata搭配使用,不能单独 ...

  6. nodejs开发辅助工具nodemon

    前面的话 修改代码后,需要重新启动 Express 应用,所做的修改才能生效.若之后的每次代码修改都要重复这样的操作,势必会影响开发效率,本文将详细介绍Nodemon,它会监测项目中的所有文件,一旦发 ...

  7. Spring MVC 使用介绍(十)—— 编码

    一.概述 客户端与服务器端在交互过程中,需要将字符以某种编码方式转化为字节流进行传输,因此涉及字符的编码和解码.某一方以编码方案A编码,另一方须以同样的编码方案解码,否则会出现乱码. 客户端与服务器端 ...

  8. Java连接远程Mysql过程中遇到的各种问题

    2018-11-16 10:46 2018-11-19 21:35 前言 本篇文章记录的是本人在使用Java程序连接另一台电脑(同一局域网)上的Mysql数据库的过程中遇到的各种问题及解决方案.希望能 ...

  9. TP5.x——多数据库连接查询

    前言 需要到不同的数据库获取不同的表,看了下文档发现有这类方法,就记录下 文档 https://www.kancloud.cn/manual/thinkphp5_1/353998 步骤 配置文件 re ...

  10. rest framework 认证 权限 频率

    认证组件 发生位置 APIview 类种的 dispatch 方法执行到 initial 方法 进行 认证组件认证 源码位置 rest_framework.authentication  源码内部需要 ...