技术标签: 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`}
e-OKv#]
这本书。。 在pinmap 里面有定义IZ\fvYp
iSUu3Yv,_m
Q*M(d\V s
这是我们所用到的 PB7 的 我使用的是福昕阅读器 可以直接 ctrl +F 查找 USART1 就可以找到串口1的 接口.Z#/%y3S
.;qh>Gt\
\Tz'>[\
DMA配置方面 要去 stm32F4 中文参考手册里面去查找f/s" 2r
\Rb:t}
这个在 DMA章节里面会提到 具体的 DMA 数据流和 外设的对应关系?#fm-5WIi
BoST?"&}'
a2ho+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'$
题目描述【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方法: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
时间宝贵,无套路,请直接上车!推荐一:新品中柏EZpad7上市时间:2018年2月参考价格:32G999元/64G1099元硬件配置:IntelZ8350四核处理器/Windows10/4GB/10.1英寸/1920×1200中柏EZpad7是一款10.1英寸移动办公设备,轻至680g、仅10.5毫米厚的全金属超薄机身,更方便携带。作为一款二合一产品,中柏EZpad7不仅能够成为移动...
W5500 芯片是硬连线 TCP/IP 嵌入式以太网控制器,可提供与嵌入式系统的更轻松的 Internet 连接。 W5500 使用户只需使用嵌入了 TCP/IP 堆栈、10/100 以太网 MAC 和 PHY 的单芯片即可在其应用程序中实现 Internet 连接。本文将详细介绍在STM32CubeIDE中如何移植W5500驱动。...
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开发流程背景知识的分析与研究项目方案的设计与制定写清楚项目背景写清楚项目需求写清楚方案框架写清楚算法细节确保逻辑完备性确保实现无关性确保书面易懂性算法可行性仿真与验证Why?When?How?FPGA设计方案的制定编写FPGA设计方案的好处如何编写FPGA设计方案FPGA功能代码的编写FPGA设计的功能仿真一、仿真的分类。二、功能仿真的作用。三、正确的功能仿真时机。四、功能仿真的工具。五、注意仿真代码的备份。六、功能仿真的工作量。前言FPGA的开发遵循一定的流程,我们要学会站在巨人的
鸟类识别在之前做过,但是效果特别差。而且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
为什么80%的码农都做不了架构师?>>> ...
适用于 Adobe Acrobat Reader XI 以及 DC 系列(本人亲测)现象描述:点击 AcroRd32.exe ,出现正常程序界面后不到一秒自动关闭(闪退)。解决方法:在 AcroRd32.exe 同一目录下点击 Eula.exe (End User Licence Agreement,最终用户许可协议),点击 Accept 同意即可。在某外国 Adobe 论坛上看到
在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 ——> rules里面添加代码
我们的接口全部做了签名处理,做接口调试的时候可能需要频繁的注释掉后端验签的方法,虽然麻烦,但是可以正常调试。但是如果需要请求一下线上的数据,总不能把线上的验签注释掉吧。postman是我常用的一个接口测试工具,使用 Pre-request Script 功能在发出请求前执行一些脚本,来达到签名的目的。Pre-request Script是通过Postman的沙盒(Sandbox)来实现的,而S...
一、生成一个以太坊钱包地址通过以太坊命令行客户端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...