STM32F030-UART1_DMA使用提示
STM32F030-UART1_DMA使用提示
前言:
今天把STM32F030C8T6的串口DMA学习了一下,为了加快各位研发人员的开发进度,避免浪费大量的时间在硬件平台上,写出个人代码调试的经验。个人水平有限,如有错误,还请指正mr.li.ming@qq.com。
提示:使用的内部RC时钟,最大速度48MHz;使用USART1-PA9/PA10.
第一步:初始化端口
/*******************************************************************************
* @brief 串口1端口初始化
* @param None
* @retval None
****************************************************************Author:Liming**/
void USART1_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_Initstructure;
RCC_AHBPeriphClockCmd(USART1_GPIO_CLK,ENABLE);
/* Connect pin to Periph */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1); // 注意这里是GPIO_PinSource9
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);
GPIO_Initstructure.GPIO_Pin=USART1_TX_PIN;
GPIO_Initstructure.GPIO_Mode=GPIO_Mode_AF;
GPIO_Initstructure.GPIO_OType=GPIO_OType_PP; // 推挽输出
GPIO_Initstructure.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_Initstructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(USART1_GPIO_PORT,&GPIO_Initstructure);
GPIO_Initstructure.GPIO_Pin = USART1_RX_PIN; // 浮空输入
GPIO_Init(USART1_GPIO_PORT,&GPIO_Initstructure);
}
第二步:初始化UART1
/*******************************************************************************
* @brief 串口1初始化
* @param None
* @retval None
****************************************************************Author:Liming**/
void USART1_Init(uint32_t BaudRate)
{
USART_InitTypeDef USART_Initstructure;
RCC_APB2PeriphClockCmd(USART1_CLK,ENABLE);
USART1_GPIO_Init(); // 调用了上面的端口初始化,故主函数里调用此函数即可。
USART_Initstructure.USART_BaudRate = BaudRate;
USART_Initstructure.USART_Parity =USART_Parity_No;
USART_Initstructure.USART_WordLength =USART_WordLength_8b;
USART_Initstructure.USART_StopBits =USART_StopBits_1;
USART_Initstructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
USART_Initstructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None;
USART_Init(USART1,&USART_Initstructure);
USART_ClearFlag(USART1,USART_FLAG_TC);
USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);
USART_Cmd(USART1,ENABLE); // 使能串口
}
第三步:DMA1中断配置
/*******************************************************************************
* @brief DMA1中断配置
* @param None
* @retval None
****************************************************************Author:Liming**/
void DMA1_NVIC_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPriority = 2;
NVIC_Init(&NVIC_InitStructure);
}
注意事项:
1.
USART1发送数据
使用的是DMA1的第二通道。查表可知,为什么还有第四通道呢,那是给USART1端口重映射了之后使用的。
第四步:DMA1配置
/*******************************************************************************
*
@brief DMA1配置
*
@param None
* @retval
None
****************************************************************Author:Liming**/
void DMA1_Init(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
DMA_InitStructure.DMA_BufferSize = 12;
// 缓存大小
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // 内存到内存关闭
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; // 普通模式
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; // 内存到外设
DMA_InitStructure.DMA_Priority = DMA_Priority_High; // DMA通道优先级
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;// 内存地址递增
DMA_InitStructure.DMA_PeripheralBaseAddr =
(uint32_t)&USART1->TDR; // 外设地址
DMA_InitStructure.DMA_PeripheralInc =
DMA_PeripheralInc_Disable;// 外设地址不变
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; // 内存数据长度
DMA_InitStructure.DMA_MemoryBaseAddr
= (uint32_t)UART1_TXBUFFER; // 定义内存基地址
DMA_InitStructure.DMA_PeripheralDataSize =
DMA_PeripheralDataSize_Byte;//外设数据长度
DMA_Init(DMA1_Channel2,&DMA_InitStructure);
DMA_ClearITPendingBit(DMA1_IT_TC2); // 清除一次DMA中断标志
DMA_ITConfig(DMA1_Channel2,DMA_IT_TC,ENABLE);// 使能DMA传输完成中断
DMA1_NVIC_Init(); // 调用了上面的中断配置,故主函数里调用此函数即可
DMA_Cmd(DMA1_Channel2,ENABLE);
}
注意事项:
1.
缓存大小:就是你一次要发送多长的数据。
2.
DMA方向:因为是串口发送数据,所以是从内存到外设,USART1对于单片机来讲是个外设。定义的发送数组是内存。
3.
内存地址递增:其实不难理解,从发送数组的UART1_TXBUFFER[0]- UART1_TXBUFFER[n]肯定是递增的。
4.
外设地址不递增:所有的数据都是通过串口发送寄存器发出去,所以外设地址不变。
5.
内存/外设数据长度:串口发送的数据都是字节为单位,所以长度是Byte
6.
DMA_ITConfig(DMA1_Channel2,DMA_IT_TC,ENABLE);注意这一句不要写错。
第五步:DMA1的中断处理函数
/**
*
@brief DMA1_Channel1中断服务函数
*
@param 无
* @retval 无
*/
void DMA1_Channel2_3_IRQHandler(void)
{
/*判断DMA传输完成中断*/
if(DMA_GetITStatus(DMA1_IT_TC2)
!= RESET)
{
UART1_STATE = 2;// send over
}
/*清除DMA中断标志位*/
DMA_ClearITPendingBit(DMA1_IT_TC2);
}
这里使用了一个变量UART1_STATE作为标志位
第六步:使用DMA1发送串口数据
USART1_Init(115200);
DMA1_Init();
while(1)
{
if(UART1_STATE==2)
{
UART1_STATE = 1;
DMA_Cmd(DMA1_Channel2,DISABLE); // 发送完成先关掉DMA通道
DMA_SetCurrDataCounter(DMA1_Channel2,12); // 设置需要发送的长度
DMA_Cmd(DMA1_Channel2,ENABLE); // 再打开DMA通道
}
GPIO_SetBits(GPIOA,GPIO_Pin_4);Delay(500);
GPIO_SetBits(GPIOA,GPIO_Pin_3);Delay(500);
GPIO_ResetBits(GPIOA,GPIO_Pin_4);Delay(500);
GPIO_ResetBits(GPIOA,GPIO_Pin_3);Delay(500);
}
注意事项:
1.
一定要注意,DMA的传输有个长度计数器,DMA传输完成后,计数器里的值就变成了0;数据是不传了,但是通道并没有关闭。所以想要再次传输就需要修改这个长度计数器的值,但是这个值的修改必须要关闭通道后修改。所以就有了上面的步骤,关闭通道—修改计数值—打开通道
希望对各位看官有所帮助,并能触类旁通,对于外设到内存啊,内存到内存啊,ADC与DMA啊,SPI与DMA都能轻松的应用。
STM32F030-UART1_DMA使用提示的更多相关文章
- iPhone Anywehre虚拟定位提示“后台服务未启动,请重新安装应用后使用”的解决方法
问题描述: iPhone越狱了,之后在Cydia中安装Anywhere虚拟定位,但是打开app提示:后台服务未启动,请重新安装应用后使用. 程序无法正常使用... 解决方法: 打开Cydia-已安装, ...
- jsp中出现onclick函数提示Cannot return from outside a function or method
在使用Myeclipse10部署完项目后,原先不出错的项目,会有红色的叉叉,JSP页面会提示onclick函数错误 Cannot return from outside a function or m ...
- 【SQLServer】【恢复挂起的解决方案】附加文件时候的提示“无法重新生成日志,原因是数据库关闭时存在打开的事务/用户,该数据库没有检查点或者该数据库是只读的。 ”【数据库恢复】
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 先贴错误: 吐槽一下: 进入正题: 新建一个同名数据库 停止MSSQL服务 替换数据库文 ...
- SQLServer执行命令出现“目录无效的提示”
异常处理汇总-数据库系列 http://www.cnblogs.com/dunitian/p/4522990.html 一般都是清理垃圾清理过头了,把不该删的目录删了 网上说法: 问题描述: 1.s ...
- 利用CSS中的:after、: before制作的边三角提示框
小颖昨天分享了一篇参考bootstrap中的popover.js的css画消息弹框今天给大家再分享一篇使用:before和:after伪元素画消息弹框的CSS. 画出来是介个酱紫的: 有没有觉得画的萌 ...
- TypeScript Vs2013 下提示Can not compile modules unless '--module' flag is provided
VS在开发TypeScript程序时候,如果import了模块有的时候会有如下提示: 这种情况下,只需要对当前TypeScript项目生成设置为AMD规范即可!
- 当web.config文件放置在共享目录下(UNC),启动IIS会提示有错误信息500.19,伴随有错误代码0x80070003和错误代码0x80070005的解决办法
最近遇到一个很有意思的使用环境,操作人员将所有的网站应用内容投放到共享存储里面,并且使用微软的SMB协议将其以CIFS的方式共享出来,使用Windows Server 2008 R2的IIS将其连接起 ...
- HTML5轻松实现搜索框提示文字点击消失---及placeholder颜色的设置
在做搜索框的时候无意间发现html5的input里有个placeholder属性能轻松实现提示文字点击消失功能,之前还傻傻的在用js来实现类似功能... 示例 <form action=&quo ...
- Win10提示没有权限使用网络资源问题解决
借鉴链接:http://www.cr173.com/html/67361_1.html Win10提示没有权限使用网络资源解决方法 1.打开控制面板; 2.在所有控制面板项中找到凭据管理器; 3.添加 ...
- Xamarin Android 应用程序内图标上数字提示
最近在用 Xamarin 做一个 Android 应用,打开应用时,如果有新消息,需要在应用内的 Toolbar 或者首页的图标上显示数字提示.在这里和大家分享一下实现方法,如果你有更新好的实现方法, ...
随机推荐
- swiper轮播图插件
一.简介 ①Swiper是纯javascript打造的滑动特效插件,面向手机.平板电脑等移动终端.Swiper能实现触屏焦点图.触屏Tab切换.触屏多图切换等常用效果. ②Swiper 是一款免费以及 ...
- 洛谷P2730 [IOI]魔板 Magic Squares
题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都有一种颜色.这8种颜 ...
- linux命令之------More命令
More命令 1)作用:命令类似cat,不过会以一页一页的形式显示,更方便使用者逐页阅读. 2)-num:一次显示的行数 3)-d:提示使用者,在画面下方显示[Press space to conti ...
- shell脚本编程基础之函数
函数 作用:代码重用 定义函数: 方法1: function FUNCTION_NAME { #函数名和定义变量名一样,只能包含数字字母下划线,并且不能以数字开头 command } 方法2: FUN ...
- 转载:SVD
ComputeSVD 在分布式矩阵有CoordinateMatirx, RowMatrix, IndexedRowMatrix三种.除了CoordinateMatrix之外,Indexe ...
- powershell.exe WannaCrypt(永恒之蓝) down.bddp.net
今天win机器进程出现大量 powershell.exe,把cpu占满100%,打开任务管理器看到如下信息: powershell -nop -w hidden -ep bypass -c " ...
- 图解CRM(客户关系管理)全流程
https://blog.csdn.net/lylmwt/article/details/84921432
- 项目启动tomcat失败的几种可能原因和解决方法
传送门:https://blog.csdn.net/u010565910/article/details/80411468 总结一下tomcat启动问题,也给自己做个笔记 , 逐渐补充完善. 1.ja ...
- 第10组 Beta冲刺(4/5)
链接部分 队名:女生都队 组长博客: 博客链接 作业博客:博客链接 小组内容 恩泽(组长) 过去两天完成了哪些任务 描述 将数据分析以可视化形式展示出来 新增数据分析展示等功能API 服务器后端部署, ...
- python项目总结--学生选课
题目要求: 根据业务需求,现要对慕课学院(1)班的所有学员进行选修课程分配,使得每一名学生都可以选修到一门课程.具体要求如下: 1.自定义学生信息.课程信息.教师信息三者的具体描述 2.自定义exam ...