stm32 串口2空闲中断死机_stm32F4 串口空闲中断_weixin_39775127的博客-程序员秘密

技术标签: stm32 串口2空闲中断死机  

stm32F4 串口空闲中断

很多智能型传感器内置单片机 通过单片机将原始的数据处理,然后以串口的形式发送给用户单片机,用户单片机在利用串口得来的信息进行决策。 那么有没有一种简化通讯的方式呢 ?那就是串口 +DMA了!wY=k$

F%z$^ m-_6.Y3+7I

主要思想: 配置一个串口DMA接收 任务,任务搬运的数据量要大于一次通讯的总数据量(也就是DMA 的搬运工作还没结束 我们的数据就已经搬完了) 然后这时候因为串口的总线 没有数据传输了(数据传输频率不是特别高 完全占用总线的情况下,总线肯定会有一段时间空闲!) 这时候 因为串口的总线空闲会触发一个 串口总线控线中断,在这个中断里面  我们进行数据处理(获取感兴趣的信息),并且在数据处理完成后 将DMA 重新设置一个搬运任务。  这样 我们只需要在一帧(次)的数据传输完成后去处理一次数据即可,不需要每次都去处理串口接收中断,这样有好处!in7h^6?I

[email protected]>Q7AUCQB&e'n<

下面话不多说,上代码!  我是用的是Stm32F407VET6 代码下载 搜索 ‘stm32f407 配置6路串口DMA 接收 不定长数据Ya;[email protected]

|3G;Rh9w,~EM(*k._

void USART1_init()  //  PB7n;LjKE

{[LM9^*sG2V

GPIO_InitTypeDef   GPIO_InitStructure;J1Run0

USART_InitTypeDef  USART_InitStructure;6z2%/P-'

NVIC_InitTypeDef   NVIC_InitStructure;`r]C%Y4?

DMA_InitTypeDef    DMA_InitStructure;:6J&%n

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);dWP

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);^$s&bH'8

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);20/P:;

//以上是初始化各种时钟o>HU4O}

GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);*iVEO

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ;L&0aS:

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;3.6Gh|7

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;XDQ<28^

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;-z">ov-)

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;%D3Asw/5a

GPIO_Init(GPIOA,&GPIO_InitStructure);EMzJyGt7

//  以上是初始化 串口的IOART0o7B

USART_InitStructure.USART_BaudRate = 115200;S0`u!l89(

USART_InitStructure.USART_WordLength = USART_WordLength_8b;wz>[CXpi_

USART_InitStructure.USART_StopBits = USART_StopBits_1;iKu4s

USART_InitStructure.USART_Parity = USART_Parity_No;K[S)e!\.

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;c7D{^$L9v

USART_InitStructure.USART_Mode = USART_Mode_Rx ;-""(>$b2

USART_Init(USART1, &USART_InitStructure);

USART_Cmd(USART1, ENABLE);?JBA`,-

USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); // 这里开启的是总线空闲中段!  不是接收非空中断_&r19pY

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;:!JQ

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;g3

Oro}wt6

NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;0\V)DV.i

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;Lngf,Of.e

NVIC_Init(&NVIC_InitStructure);&+3RsIlW

USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);2"c 5<

//以上是定时器的基本配置   主要是一些通讯相关的参数  不多做介绍 配置中断部分要看一下biVNZdA

DMA_DeInit(DMA2_Stream5);/D964VR1M\

while (DMA_GetCmdStatus(DMA2_Stream5) != DISABLE);TfHL'u9B

DMA_InitStructure.DMA_Channel = DMA_Channel_4;                             //  DMA通道`g<0FQA

DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART1->DR;    // 外设地址>+DMTV[O

DMA_InitStructure.DMA_Memory0BaseAddr = (u32)USART_Cache[0];  //内部存储区地址z[@i=avPG

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory ;           // 传输方向 外设到内存[^D>xD3B2

DMA_InitStructure.DMA_BufferSize = RECEIVE_BUF_SIZE;                  //  接收的数据大小  一个常数 大于一帧的数据量rBOH9L

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;   //MRg Ozg

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;          //DTa!vg

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;7$x%A&]

DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;USaa#s4'

DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;-/2B fIq

DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;r&IDTS#

DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;a l9(

9)

DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;=zu;npM

DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;efE=5%O

DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;+o):grWvQ

DMA_Init(DMA2_Stream5, &DMA_InitStructure);I0qJr2[X~

DMA_Cmd(DMA2_Stream5, ENABLE);/;{L~f=et)

}ZH*h1?\X

H23 O]r\&~YFj B

以上就是初始化函数 其中的IO口 请查阅1;'-$K`}

7714d8f4256fac353cf557287b3e35fd.pnge-OKv#] 

这本书。。   在pinmap  里面有定义IZ\fvYp

95e201c3de6d6d9b15e054afb8c9e41c.pngiSUu3Yv,_m 

add30b68664812bb7b776ad845938e42.pngQ*M(d\V s 

这是我们所用到的 PB7 的  我使用的是福昕阅读器   可以直接 ctrl +F 查找 USART1  就可以找到串口1的 接口.Z#/%y3S

.;qh>Gt\

\Tz'>[\

DMA配置方面  要去 stm32F4 中文参考手册里面去查找f/s" 2r

7b11d5d68c6f95796eabb3c36fed6d55.png\Rb:t} 

这个在 DMA章节里面会提到 具体的 DMA 数据流和 外设的对应关系?#fm-5WIi

74d67d1757264ac86c359dd27b9a8964.pngBoST?"&}' 

5b5696a373e0875c326e01d379a39e0c.pnga2ho+TwT 

我的是在文档的 第205页  如果你下载了文档应该也会在差不多的位置可以找到相应的介绍。t\a|Gp W

fms(_Q:R?T\(k=0RM

如果配置部分没有问题了  就可以继续向下看 终端部分的函数!L[A?W

u~2]$/Ut%J1(H

void USART1_IRQHandler(void).gzfaxi

{^\kH^

u16 dataO1)\!=&

.

if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)  //>fth

iA

{A_WaRYG

DMA_Cmd(DMA2_Stream5, DISABLE);;E[Q/

tr:w

data = USART1->SR;i pl,{

data = USART1->DR;  // 这里必须读一下串口的SR和DR寄存器  这样程序才能正常运行, 具体原因我没有找到 望大佬解答gu%i|-}

  这里可以插入自己的数据处理程序, 注意这里是中端 程序占用的时间别太多 而且绝对不能用delay函数!(x?Tjyzw

DMA_ClearFlag(DMA2_Stream5,DMA_FLAG_TCIF5 | DMA_FLAG_FEIF5 | DMA_FLAG_DMEIF5 | DMA_FLAG_TEIF5 | DMA_FLAG_HTIF5);eG8l^[

DMA_SetCurrDataCounter(DMA2_Stream5, RECEIVE_BUF_SIZE);:=TIq

DMA_Cmd(DMA2_Stream5, ENABLE); //  这两行是重新设置DMA  让这个搬运工准备下一次的工作U*E)y7MY

}S D{ )Sq

USART_ClearITPendingBit(USART1,USART_IT_IDLE); // 清除标志位-ucgET`

}Kd58'$

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39775127/article/details/113543611

智能推荐

107. Binary Tree Level Order Traversal II_佛系城的博客-程序员秘密

题目描述【Leetcode】 Given a binary tree, return the bottom-up level order traversal of its nodes’ values. (ie, from left to right, level by level from leaf to root). For example: Given binary tree

简单的List的方法,冒泡排序练习及答案,三种遍历方式(java)_list能不能使用冒泡排序_CuteTTU的博客-程序员秘密

List方法:import java.util.ArrayList;import java.util.List;@SuppressWarnings({"all"})public class ListMethod { public static void main(String[] args) { List list = new ArrayList(); list.add("喵喵"); list.add("雷"); //v

中柏7s装linux,墙裂推荐中柏新品平板EZpad 7和EZpad 7s_双色球class的博客-程序员秘密

时间宝贵,无套路,请直接上车!推荐一:新品中柏EZpad7上市时间:2018年2月参考价格:32G999元/64G1099元硬件配置:IntelZ8350四核处理器/Windows10/4GB/10.1英寸/1920×1200中柏EZpad7是一款10.1英寸移动办公设备,轻至680g、仅10.5毫米厚的全金属超薄机身,更方便携带。作为一款二合一产品,中柏EZpad7不仅能够成为移动...

STM32F1网络编程-W5500网卡驱动移植_stm32 w5500移植_视觉&物联智能的博客-程序员秘密

W5500 芯片是硬连线 TCP/IP 嵌入式以太网控制器,可提供与嵌入式系统的更轻松的 Internet 连接。 W5500 使用户只需使用嵌入了 TCP/IP 堆栈、10/100 以太网 MAC 和 PHY 的单芯片即可在其应用程序中实现 Internet 连接。本文将详细介绍在STM32CubeIDE中如何移植W5500驱动。...

java schema校验_Json Schema 校验json,java代码示例_哎呀吗呀咪呀的博客-程序员秘密

Json Schema 校验json,java代码示例1、json schema 入门请参考下面两篇博客1.1Json Schema 快速入门1.2Json Schema 简介2、java代码实现步骤2.1引入依赖com.github.fgejson-schema-validator2.2.62.2创建工具类JsonSchemaUtilimport com.fasterxml.jackson.da...

FPGA之道——FPGA开发流程之项目方案与FPGA设计方案_fpga项目_吉大秦少游的博客-程序员秘密

文章目录前言FPGA开发流程背景知识的分析与研究项目方案的设计与制定写清楚项目背景写清楚项目需求写清楚方案框架写清楚算法细节确保逻辑完备性确保实现无关性确保书面易懂性算法可行性仿真与验证Why?When?How?FPGA设计方案的制定编写FPGA设计方案的好处如何编写FPGA设计方案FPGA功能代码的编写FPGA设计的功能仿真一、仿真的分类。二、功能仿真的作用。三、正确的功能仿真时机。四、功能仿真的工具。五、注意仿真代码的备份。六、功能仿真的工作量。前言FPGA的开发遵循一定的流程,我们要学会站在巨人的

随便推点

深度学习之基于VGG16与ResNet50实现鸟类识别_基于vgg16的鸟类分类_starlet_kiss的博客-程序员秘密

鸟类识别在之前做过,但是效果特别差。而且ResNet50的效果直接差到爆炸,这次利用VGG16与ResNet50的官方模型进行鸟类识别。1.导入库import tensorflow as tfimport numpy as npimport matplotlib.pyplot as pltimport os,pathlib,PILfrom tensorflow.keras import layers,models,Sequential,Input,Modelfrom tensorflow.ke

ios应用程序详解_weixin_34163741的博客-程序员秘密

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

Adobe Acrobat Reader 窗口一闪而过的解决方法_adobe acrobat dc操作窗口自动消失_「已注销」的博客-程序员秘密

适用于 Adobe Acrobat Reader XI 以及 DC 系列(本人亲测)现象描述:点击 AcroRd32.exe ,出现正常程序界面后不到一秒自动关闭(闪退)。解决方法:在 AcroRd32.exe 同一目录下点击 Eula.exe (End User Licence Agreement,最终用户许可协议),点击 Accept 同意即可。在某外国 Adobe 论坛上看到

vue-cli项目中使用sass遇到的坑_vue-cli对sass的影响_我不淑女girl的博客-程序员秘密

在Windows下,sass基于ruby使用,所以第一步先安装ruby.在vue项目中,分别安装node-sass 、sass-loadernpm install sass-loader --save-dev //安装sass-loader,这时候安装的是最新版本的sassnpm install node-sass --save-dev //安装node-sass然后在build/webpack.base.conf.js做修改在module ——&gt; rules里面添加代码

使用postman对请求自动加签名_pm.request.url.query_沐雨聼風的博客-程序员秘密

我们的接口全部做了签名处理,做接口调试的时候可能需要频繁的注释掉后端验签的方法,虽然麻烦,但是可以正常调试。但是如果需要请求一下线上的数据,总不能把线上的验签注释掉吧。postman是我常用的一个接口测试工具,使用 Pre-request Script 功能在发出请求前执行一些脚本,来达到签名的目的。Pre-request Script是通过Postman的沙盒(Sandbox)来实现的,而S...

以太坊ETH源码分析(1):地址生成过程_eth钱包生成代码 python_3WebDAO的博客-程序员秘密

一、生成一个以太坊钱包地址通过以太坊命令行客户端geth可以很简单的获得一个以太坊地址,如下:~/go/src/github.com/ethereum/go-ethereum/build/bin$geth account newINFO [11-03|20:09:33.219] Maximum peer count ETH=25 LES=0 tot...

推荐文章

热门文章

相关标签