DMA存储器到外设代码讲解
实验目的:
bsp_dma_mtp.h
#ifndef __BSP_DMA_MTP_H #define __BSP_DMA_MTP_H#include "stm32f10x.h" #include <stdio.h>// 串口工作参数宏定义 #define DEBUG_USARTx USART1 #define DEBUG_USART_CLK RCC_APB2Periph_USART1 #define DEBUG_USART_APBxClkCmd RCC_APB2PeriphClockCmd #define DEBUG_USART_BAUDRATE 115200// USART GPIO 引脚宏定义 #define DEBUG_USART_GPIO_CLK (RCC_APB2Periph_GPIOA) #define DEBUG_USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd#define DEBUG_USART_TX_GPIO_PORT GPIOA #define DEBUG_USART_TX_GPIO_PIN GPIO_Pin_9 #define DEBUG_USART_RX_GPIO_PORT GPIOA #define DEBUG_USART_RX_GPIO_PIN GPIO_Pin_10#define USART_TX_DMA_CLK RCC_AHBPeriph_DMA1 #define USART_TX_DMA_CHANNEL DMA1_Channel4 #define USART_TX_DMA_FLAG_TC DMA1_FLAG_TC4 #define USART_DR_ADDRESS (USART1_BASE+0x04)#define SENDBUFF_SIZE 5000void USARTx_DMA_Config(void); void USART_Config(void); #endif /* __BSP_DMA_MTP_H */
bsp_dma_mtp.c
#include "bsp_dma_mtp.h"uint8_t SendBuff[SENDBUFF_SIZE];/*** @brief USART GPIO 配置,工作参数配置* @param 无* @retval 无*/ void USART_Config(void) {GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;// 打开串口GPIO的时钟DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);// 打开串口外设的时钟DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);// 将USART Tx的GPIO配置为推挽复用模式GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);// 将USART Rx的GPIO配置为浮空输入模式GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);// 配置串口的工作参数// 配置波特率USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;// 配置 针数据字长USART_InitStructure.USART_WordLength = USART_WordLength_8b;// 配置停止位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(DEBUG_USARTx, &USART_InitStructure);// 使能串口USART_Cmd(DEBUG_USARTx, ENABLE); }///重定向c库函数printf到串口,重定向后可使用printf函数 int fputc(int ch, FILE *f) {/* 发送一个字节数据到串口 */USART_SendData(DEBUG_USARTx, (uint8_t) ch);/* 等待发送完毕 */while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);return (ch); }// Memory -> P (USART->DR) void USARTx_DMA_Config(void) {DMA_InitTypeDef DMA_InitStruct;RCC_AHBPeriphClockCmd(USART_TX_DMA_CLK, ENABLE);DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)USART_DR_ADDRESS;DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)SendBuff;DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralDST;DMA_InitStruct.DMA_BufferSize = SENDBUFF_SIZE;DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;DMA_InitStruct.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;DMA_InitStruct.DMA_Priority = DMA_Priority_High;DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;DMA_Init(USART_TX_DMA_CHANNEL, &DMA_InitStruct);DMA_ClearFlag(USART_TX_DMA_FLAG_TC);DMA_Cmd(USART_TX_DMA_CHANNEL, ENABLE); }
main.c
#include "stm32f10x.h" #include "bsp_led.h" #include "bsp_dma_mtp.h"extern uint8_t SendBuff[SENDBUFF_SIZE];#define SOFT_DELAY Delay(0x0FFFFF);void Delay(__IO u32 nCount);/*** @brief 主函数* @param 无* @retval 无*/ int main(void) {uint16_t i=0;/* LED 端口初始化 */LED_GPIO_Config();USART_Config();for(i=0; i<SENDBUFF_SIZE; i++){SendBuff[i] = 'P';}USARTx_DMA_Config();USART_DMACmd(DEBUG_USARTx, USART_DMAReq_Tx, ENABLE);while (1){LED1_TOGGLEDelay(0xFFFFF);} }void Delay(__IO uint32_t nCount) //简单的延时函数 {for(; nCount != 0; nCount--); }
转载于:https://www.cnblogs.com/wenshinlee/p/8980740.html
DMA存储器到外设代码讲解相关推荐
- 串口的空闲中断+DMA接收(附F4代码)
传统串口接受与发送: 串口接受一个很长的帧,接受帧时依靠串口中断每次只能传输8位,传一个帧要进入好多次中断,每次进入中断都要判断是否接收完毕. DMA串口接收与发送: 1,电脑通过串口1给STM32F ...
- (实验50)单片机,STM32F4学习笔记,代码讲解【串口IAP实验】【正点原子】【原创】
文章目录 ❤2023重新理解记录 其它文章链接,独家吐血整理 实验现象 主程序 IAP初始化程序 代码讲解 文章目录 ❤2023重新理解记录 其它文章链接,独家吐血整理 实验现象 主程序 IAP初始化 ...
- 【开源教程11】疯壳·开源蓝牙心率防水运动手环-整机功能代码讲解
开源蓝牙心率防水运动手环 --疯壳·智能穿戴开发系列 整机功能代码讲解 整机代码 1 软件设计 本节,我们将融合前面的蓝牙收发.三轴记步.电量检测.外部 Flash 读写. 心率检测和 Led ...
- 【开发教程11】疯壳·开源蓝牙心率防水运动手环-整机功能代码讲解
开源蓝牙心率防水运动手环 --疯壳·智能穿戴开发系列 整机功能代码讲解 整机代码 1 软件设计 本节,我们将融合前面的蓝牙收发.三轴记步.电量检测.外部 Flash 读写. 心率检测和 Led ...
- (实验38)单片机,STM32F4学习笔记,代码讲解【SD卡实验】【正点原子】【原创】
文章目录 其它文章链接,独家吐血整理 实验现象 主程序 SD卡驱动程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创] ( ...
- (实验39)单片机,STM32F4学习笔记,代码讲解【FATFS实验】【正点原子】【原创】
文章目录 其它文章链接,独家吐血整理 实验现象 主程序 FATFS初始化程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创 ...
- (实验55)单片机,STM32F4学习笔记,代码讲解【网络通信实验】【正点原子】【原创】
文章目录 其它文章链接,独家吐血整理 实验现象 主程序 LWIP初始化程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创] ...
- (实验37)单片机,STM32F4学习笔记,代码讲解【内存管理实验】【正点原子】【原创】
文章目录 其它文章链接,独家吐血整理 实验现象 主程序 内存池初始化程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创] ...
- (实验4)单片机,STM32F4学习笔记,代码讲解【串口实验】【正点原子】【原创】
文章目录 其它文章链接,独家吐血整理 实验现象 主程序 串口中断程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创] (实 ...
最新文章
- PEAR, PECL和Perl的区别
- 北京大学年度人物揭榜!发论文、搞科研,看“学神打架”!
- Android 浏览器 —— 使用 WebView 实现文件下载
- IntelliJ IDEA for Mac 如何取消双击shift键打开全局搜索弹窗
- 哈佛大学单细胞课程|笔记汇总 (二)
- UI设计线框图可编辑模板,临摹学习设计要点
- java 调用dll内存泄露_对 精致码农大佬 说的 Task.Run 会存在 内存泄漏 的思考
- webpack的sourcemap
- 非常简单的conda环境重命名方法
- HDU 1257 最少拦截系统 简单DP
- autofs rhel7
- LSI存储论坛:6Gb SAS让DAS焕发新活力?
- chrome不能安装adblock插件
- 手机端自动播放网页背景音乐代码
- c语言.jpg图片转成数组_如何把pdf转成jpg?PDF转jpg过程详解
- C# winform 一个简单的类的方法的封装与调用
- Excel实用技巧-如何批量提取excel工作表名称
- 要只看每日减少的新增数量,别忘了疫情最开始的时候可能也只有几个人患病
- 自定义Android聊天气泡ChatView。仿微信聊天气泡,能自定义边框,颜色,点击特效。
- Fluent的融化凝固模型介绍
热门文章
- 机器学习 对模型进行惩罚_使用Streamlit对机器学习模型进行原型制作
- 机器学习 多变量回归算法_如何为机器学习监督算法识别正确的自变量?
- 6月15日起,刷卡机不能自选商户了,这样会有多少卡被封掉?
- 李嘉诚今日正式退休,来看看他一生都做过哪些牛逼的事
- C++ 11 在 Qt 5 中的应用
- python3 规则引擎_几个常见规则引擎的简单介绍和演示
- centos7搜狐 mysql_基于centOS6.7搭建LAMP(httpd-2.4.18+mysql-5.5.47+php-5.6.16)环境
- a标签隐藏真实地址_家庭影院布线非常杂乱应该怎么补救?A/V电缆管理的7个技巧...
- java如何使用配置文件_如何使用java.util.Properties读取配置文件?
- python-mysql 基础知识记录