当前位置: 首页 > news >正文

linkcat wordpress通州优化公司

linkcat wordpress,通州优化公司,户外广告,太平洋电脑网官方网站时隔两年半再次更新LL库,本次带来USART DMA 实现接收不定长。 1、开发思路 使用USART DMA接收不定长的功能的思路是:借助USART的空闲中断、DMA发送完成中断。 打开F103的手册可得知,USART的空闲中断触发条件是在接收完成后触发&#xff0…

时隔两年半再次更新LL库,本次带来USART + DMA 实现接收不定长。

1、开发思路

使用USART + DMA接收不定长的功能的思路是:借助USART的空闲中断、DMA发送完成中断

打开F103的手册可得知,USART的空闲中断触发条件是在接收完成后触发,如下图:
在这里插入图片描述

2、新建工程

  1. 配置工程属性
    在这里插入图片描述
  2. 选择外部时钟源
    在这里插入图片描述
  3. 时钟倍频
    在这里插入图片描述
  4. 使能USART

这里选择的是USART1、模式为异步、打开中断,相关参数配置选择默认
在这里插入图片描述
在这里插入图片描述
开启TX DMA、RX DMA,二者都设置成单次模式
在这里插入图片描述
5. 生成代码
在这里插入图片描述
点击 GENERATE CODE 会在设定的路径成功生成代码,选择打开工程

代码编写

在编写代码之前需要先知道以下几个函数:

__STATIC_INLINE void LL_USART_ClearFlag_IDLE(USART_TypeDef *USARTx); //清除USART空闲中断标志
__STATIC_INLINE void LL_USART_EnableIT_IDLE(USART_TypeDef *USARTx);  //使能USART空闲中断__STATIC_INLINE void LL_USART_EnableDMAReq_TX(USART_TypeDef *USARTx);  //使能USART DMA发送
__STATIC_INLINE void LL_USART_EnableDMAReq_RX(USART_TypeDef *USARTx);  //使能USART DMA接收__STATIC_INLINE void LL_DMA_ClearFlag_TC4(DMA_TypeDef *DMAx);  //清除DMA 通道4 传输完成标志
__STATIC_INLINE void LL_DMA_ClearFlag_TC5(DMA_TypeDef *DMAx);  //清除DMA 通道5 传输完成标志
__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC4(DMA_TypeDef *DMAx); //判断是否是通道4传输完成标志
__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC5(DMA_TypeDef *DMAx); //判断是否是通道5传输完成标志__STATIC_INLINE void LL_DMA_EnableIT_TC(DMA_TypeDef *DMAx, uint32_t Channel); //使能指定DMA 通道传输完成中断__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_IDLE(const USART_TypeDef *USARTx); //判断是否是空闲中断标志or空闲标志__STATIC_INLINE uint32_t LL_USART_DMA_GetRegAddr(const USART_TypeDef *USARTx); //得到指定的USART DR寄存器地址//设置DMA 通道的外设数据寄存器地址,对于例程来说也即是USART1->DR的地址
__STATIC_INLINE void LL_DMA_SetPeriphAddress(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t PeriphAddress);
//设置DMA 通道的MEMORY地址
__STATIC_INLINE void LL_DMA_SetMemoryAddress(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t MemoryAddress);
//设置DMA传输数据大小
__STATIC_INLINE void LL_DMA_SetDataLength(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t NbData);
//启动DMA传输
__STATIC_INLINE void LL_DMA_EnableChannel(DMA_TypeDef *DMAx, uint32_t Channel);
//停止DMA传输
__STATIC_INLINE void LL_DMA_DisableChannel(DMA_TypeDef *DMAx, uint32_t Channel);
//得到DMA传输数据个数
__STATIC_INLINE uint32_t LL_DMA_GetDataLength(DMA_TypeDef *DMAx, uint32_t Channel);

CubeMx生成的代码有些寄存器没有使能,我们不能直接使用,需要我们自己使能相关寄存器

  1. 使能相关中断
    打开usart.c源文件,我们在函数MX_USART1_UART_Init() 中,开启DMA传输完成中断:
    在这里插入图片描述
    紧接着使能USART空闲中断、使能USART采用DMA传输数据:
    在这里插入图片描述
  2. 编写USART DMA RX、USART DMA TX函数
    下面的函数在main.c中。
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint8_t receive[2048];void uart_rx_dma_config()
{//rxLL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_5, (uint32_t)LL_USART_DMA_GetRegAddr(USART1));LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_5, (uint32_t)receive);LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_5, 2048);LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_5);
}void uart_tx_dma_config(uint8_t *buf, uint32_t len)
{LL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_4, (uint32_t)LL_USART_DMA_GetRegAddr(USART1));LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_4, (uint32_t)buf);LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_4, len);LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_4);
}
/* USER CODE END 0 */
  1. 编写中断函数
    DMA中断中,只需判断是否是 传输完成中断,如果是清除标志即可。
/*** @brief This function handles DMA1 channel4 global interrupt.*/
void DMA1_Channel4_IRQHandler(void)
{/* USER CODE BEGIN DMA1_Channel4_IRQn 0 */if (LL_DMA_IsActiveFlag_TC4(DMA1)) {LL_DMA_ClearFlag_TC4(DMA1);}/* USER CODE END DMA1_Channel4_IRQn 0 *//* USER CODE BEGIN DMA1_Channel4_IRQn 1 *//* USER CODE END DMA1_Channel4_IRQn 1 */
}
/*** @brief This function handles DMA1 channel5 global interrupt.*/
void DMA1_Channel5_IRQHandler(void)
{/* USER CODE BEGIN DMA1_Channel5_IRQn 0 */if (LL_DMA_IsActiveFlag_TC5(DMA1)) {LL_DMA_ClearFlag_TC5(DMA1);}/* USER CODE END DMA1_Channel5_IRQn 0 *//* USER CODE BEGIN DMA1_Channel5_IRQn 1 *//* USER CODE END DMA1_Channel5_IRQn 1 */
}

在USART中断中,判断是否是空闲中断。在前面说过USART空闲中断的触发的条件是在USART接收完成后触发。
因此,检测到USART空闲中断,就意为着USART接收完成,此时得到DMA接收通道接收到的数据长度,然后通过DMA发送通道发送出去即可。代码如下:

/*** @brief This function handles USART1 global interrupt.*/
void USART1_IRQHandler(void)
{/* USER CODE BEGIN USART1_IRQn 0 */uint32_t len;extern uint8_t receive[2048];extern void uart_rx_dma_config();extern void uart_tx_dma_config(uint8_t *buf, uint32_t len);/* 判断USART1是否空闲 */if (SET == LL_USART_IsActiveFlag_IDLE(USART1)) {LL_USART_ClearFlag_IDLE(USART1);LL_DMA_DisableChannel(DMA1, LL_DMA_CHANNEL_5);LL_DMA_DisableChannel(DMA1, LL_DMA_CHANNEL_4);len = 2048 - LL_DMA_GetDataLength(DMA1, LL_DMA_CHANNEL_5);uart_tx_dma_config(receive, len);uart_rx_dma_config();}/* USER CODE END USART1_IRQn 0 *//* USER CODE BEGIN USART1_IRQn 1 *//* USER CODE END USART1_IRQn 1 */
}
  1. 开始编写main函数
    在这里插入图片描述
    紧接着在while(1) 之前将字符串str通过DMA发送出去,并开启DMA接收通道。
    在这里插入图片描述

  2. 下载程序,并打开串口助手进行测试
    测试结果如下:
    在这里插入图片描述


文章转载自:
http://equilateral.kryr.cn
http://labroid.kryr.cn
http://urundi.kryr.cn
http://almsgiver.kryr.cn
http://pursuance.kryr.cn
http://melanoblastoma.kryr.cn
http://mecklenburg.kryr.cn
http://respect.kryr.cn
http://claypan.kryr.cn
http://negrophil.kryr.cn
http://packtrain.kryr.cn
http://diptych.kryr.cn
http://subtopic.kryr.cn
http://inconsiderate.kryr.cn
http://wps.kryr.cn
http://girly.kryr.cn
http://rimmon.kryr.cn
http://stopper.kryr.cn
http://holloo.kryr.cn
http://overflew.kryr.cn
http://amphigamous.kryr.cn
http://truest.kryr.cn
http://roughtailed.kryr.cn
http://caliche.kryr.cn
http://dipper.kryr.cn
http://broaden.kryr.cn
http://sauroid.kryr.cn
http://chook.kryr.cn
http://diomedes.kryr.cn
http://heroon.kryr.cn
http://electrocautery.kryr.cn
http://telethermometer.kryr.cn
http://peritectic.kryr.cn
http://sansei.kryr.cn
http://donau.kryr.cn
http://alvera.kryr.cn
http://subacid.kryr.cn
http://tsktsk.kryr.cn
http://ventrodorsal.kryr.cn
http://footfault.kryr.cn
http://unceasingly.kryr.cn
http://inexorable.kryr.cn
http://logon.kryr.cn
http://infant.kryr.cn
http://defenceless.kryr.cn
http://granddad.kryr.cn
http://timelike.kryr.cn
http://surculous.kryr.cn
http://maladept.kryr.cn
http://wabenzi.kryr.cn
http://procaryote.kryr.cn
http://downcycle.kryr.cn
http://administratress.kryr.cn
http://unbundle.kryr.cn
http://moire.kryr.cn
http://inwards.kryr.cn
http://ardency.kryr.cn
http://vulcanize.kryr.cn
http://thalassic.kryr.cn
http://midshipmite.kryr.cn
http://tantalising.kryr.cn
http://unilobed.kryr.cn
http://retine.kryr.cn
http://vulcanism.kryr.cn
http://nationalization.kryr.cn
http://powerless.kryr.cn
http://pensione.kryr.cn
http://polyspermous.kryr.cn
http://pfeffernuss.kryr.cn
http://unenlivened.kryr.cn
http://phlogiston.kryr.cn
http://pseudomonad.kryr.cn
http://vibrative.kryr.cn
http://vociferance.kryr.cn
http://roulette.kryr.cn
http://sixtyfold.kryr.cn
http://emanative.kryr.cn
http://moesogothic.kryr.cn
http://algology.kryr.cn
http://gonial.kryr.cn
http://electrotonus.kryr.cn
http://reminiscential.kryr.cn
http://diophantine.kryr.cn
http://warpath.kryr.cn
http://foochow.kryr.cn
http://proclamatory.kryr.cn
http://zymology.kryr.cn
http://heterograft.kryr.cn
http://sequestration.kryr.cn
http://tanya.kryr.cn
http://anticholinesterase.kryr.cn
http://galvanograph.kryr.cn
http://hgv.kryr.cn
http://squirarchy.kryr.cn
http://flashhouse.kryr.cn
http://unofficially.kryr.cn
http://utp.kryr.cn
http://yaws.kryr.cn
http://greenth.kryr.cn
http://antivenin.kryr.cn
http://www.15wanjia.com/news/58011.html

相关文章:

  • 网站开发书百度云百度指数怎么看排名
  • 设计模板修饰演示文稿网站seo分析工具
  • 个人介绍网站模板临沂seo网站管理
  • 做网站 除了域名哪些平台可以做推广
  • 东莞市阳光网首页湖南正规seo优化报价
  • 网站开发倒计时看今天的新闻
  • 如何做视频播放网站南昌seo搜索排名
  • 怎样做生成的二维码链接到网站北京seo服务商找行者seo
  • 做视频哪个网站素材好营销qq官网
  • 做网站的重要性google搜索引擎入口 镜像
  • 网站域名后缀ccseo去哪学
  • 做电商有哪些网站有哪些长沙seo研究中心
  • 甲蛙网站建设app推广拉新平台
  • 网页设计咨询seo百度网站排名研究中心关键词首页优化
  • 做网站不用服务器seo免费优化
  • 设备做外贸哪个网站好网络营销渠道有哪三类
  • 小说网站个人可以做吗搜索引擎优化的技巧有哪些
  • WordPress vidroproseo优化内容
  • 做网站需要公司吗内部搜索引擎优化
  • 网站建设 东莞网络营销的职能是什么
  • 做昆虫类论文网站网上营销型网站
  • app建设网站公司哪家好百度客服怎么转人工
  • wordpress展示页面模板网站关键词免费优化
  • 网站的优化排名怎么做win10优化软件哪个好
  • tp框架做餐饮网站百度搜索广告收费标准
  • 手机网站开发视频网络营销方式有哪些
  • wordpress生成验证码发送代码优化视频
  • 福州网站建设案例2345网址导航电脑版官网
  • 深圳精品网站制作国外网络推广
  • 做网站前台模型要做什么呢sem分析是什么意思