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

STM32入门(10)

STM32入门(10)

image-20260315183857611

项目一:DMA数据转运

#include "stm32f10x.h"                    // Device header
#include "Delay.h"
#include "OLED.h"
#include "MyDMA.h"uint8_t DataA[] = {0x01,0x02,0x03,0x04};  // 定义测试数组DataA,为数据源 
uint8_t DataB[] = {0,0,0,0};              // 定义测试数组DataB,为数据目的地int main()
{// 模块初始化OLED_Init();                                    // OLED初始化MyDMA_Init((uint32_t)DataA,(uint32_t)DataB,4);  // DMA初始化,把源数组和目的地的数组的地址传入// 显示静态字符串OLED_ShowString(1,1,"DataA"); OLED_ShowString(3,1,"DataB");// 显示数组的首地址OLED_ShowHexNum(1,8,(uint32_t)DataA,8);OLED_ShowHexNum(3,8,(uint32_t)DataB,8);	while(1){DataA[0] ++;       // 变换测试数据DataA[1] ++;DataA[2] ++;DataA[3] ++;OLED_ShowHexNum(2, 1,DataA[0],2);     // 显示数组DataAOLED_ShowHexNum(2, 4,DataA[1],2);OLED_ShowHexNum(2, 7,DataA[2],2);OLED_ShowHexNum(2,10,DataA[3],2);OLED_ShowHexNum(4, 1,DataB[0],2);     // 显示数组DataBOLED_ShowHexNum(4, 4,DataB[1],2);OLED_ShowHexNum(4, 7,DataB[2],2);OLED_ShowHexNum(4,10,DataB[3],2);	Delay_ms(1000);         			  // 延时1s,观察转运前的现象MyDMA_Transfer();       			  // 使用DMA转运数组,从DataA转运到DataBOLED_ShowHexNum(2, 1,DataA[0],2);     // 显示数组DataAOLED_ShowHexNum(2, 4,DataA[1],2);OLED_ShowHexNum(2, 7,DataA[2],2);OLED_ShowHexNum(2,10,DataA[3],2);OLED_ShowHexNum(4, 1,DataB[0],2);     // 显示数组DataBOLED_ShowHexNum(4, 4,DataB[1],2);OLED_ShowHexNum(4, 7,DataB[2],2);OLED_ShowHexNum(4,10,DataB[3],2);	Delay_ms(1000);         			  // 延时1s,观察转运后的现象 }
}
#include "stm32f10x.h"                  // Device headeruint16_t MyDMA_Size;                    // 定义全局变量,用于记住Init函数的Size,供Transfer函数使用/*** 函    数:DMA初始化* 参    数:AddrA 原数组的首地址* 参    数:AddrB 目前数组的首地址* 参    数:Size 转运的数据大小(转运次数)* 返 回 值:无*/
void MyDMA_Init(uint32_t AddrA,uint32_t AddrB,uint16_t Size)
{MyDMA_Size = Size;                                         // 将Size写入到全局变量,记住参数Size// 开启时钟RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);          // 开启DMA的时钟// DMA初始化DMA_InitTypeDef DMA_InitStructure;                                      // 定义结构体变量DMA_InitStructure.DMA_PeripheralBaseAddr = AddrA;						// 外设基地址,给定形参AddrADMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; // 外设数据宽度,选择字节DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;			// 外设地址自增,选择使能DMA_InitStructure.DMA_MemoryBaseAddr = AddrB;							// 存储器基地址,给定形参AddrBDMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;			// 存储器数据宽度,选择字节DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;					// 存储器地址自增,选择使能DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;						// 数据传输方向,选择由外设到存储器DMA_InitStructure.DMA_BufferSize = Size;								// 转运的数据大小(转运次数)DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;							// 模式,选择正常模式DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;								// 存储器到存储器,选择使能DMA_InitStructure.DMA_Priority = DMA_M2M_Enable;						// 优先级,选择中等DMA_Init(DMA1_Channel1,&DMA_InitStructure);				// 将结构体变量交给DMA_Init,配置DMA1的通道1// DMA使能DMA_Cmd(DMA1_Channel1,DISABLE);         // 这里先不给使能,初始化后不会立刻工作,等后续调用Transfer后,再开始}/*** 函    数:启动DMA数据转运* 参    数:无* 返 回 值:无*/
void MyDMA_Transfer(void)
{DMA_Cmd(DMA1_Channel1,DISABLE);                      // DMA失能,在写入传输计数器之前,需要DMA暂停工作DMA_SetCurrDataCounter(DMA1_Channel1,MyDMA_Size);    // 写入传输计数器,指定将要转运的次数DMA_Cmd(DMA1_Channel1,ENABLE);                       // DMA使能,开始工作while(DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET);    // 等待DMA工作完成DMA_ClearFlag(DMA1_FLAG_TC1);                        // 清除工作完成标志位
}
#ifndef __MYDMA_H
#define __MYDMA_Hvoid MyDMA_Init(uint32_t AddrA, uint32_t AddrB, uint16_t Size);
void MyDMA_Transfer(void);#endif
http://www.jsqmd.com/news/482313/

相关文章:

  • 打开网站显示图片上传失败?错误怎么办|已解决
  • 校园网线是否可以通过两个路由器进行中转?
  • PHP 网站完整搬家避坑指南(新手必看,杜绝报错、断站)
  • Java 后端实现 token自动续期,这方案有点优雅!
  • AI 批量图片去水印工具 v1.0.0 - 豆包专属去水印
  • 分发:AI的终极护城河
  • LLM可观测性:AI系统缺失的环节
  • 面试官问:订单30分钟未支付,自动取消,该怎么实现?
  • 香河婚介所里的无数次擦肩,终在免费缘分中寻得 IT 人的安稳归宿
  • MySQL 1045 登录失败,账号密码错误处理 常见错误与避坑指南
  • 应该使用AI构建内部工具吗?
  • 缓存和数据库一致性问题,看这篇就够了
  • 5 个正在爆火的开源AI工具
  • 狗东面试,起手就问 MVCC 原理
  • Anthropic报告:AI对就业的影响
  • OpenFeign 夺命连环 9问,又挂这上了
  • 68个适合个人GPU部署的LLM
  • C++ vector、unordered_set和稀疏集的增删遍历性能对比 - 码客
  • 啪!啪!@Transactional 注解的12种失效场景,这坑我踩个遍
  • 第8篇:PI控制器设计实战演练
  • Day10 | 用栈实现队列、用队列实现栈、有效的括号、删除字符串中的所有相邻重复项
  • 3.12笔记
  • 华为CE6800交换机堆叠配置案例
  • 【AI总结博客】编码者卢布 技术博客深度分析 ---- 借助腾讯WorkBuddy得出的分析结果
  • 调试线程应用程序
  • 5. 最长回文子串
  • L2-025 分而治之
  • 1143. 最长公共子序列
  • 直租累、中介烦、托管香?房东出租模式“痛点热力图”实测
  • 【JAVA基础08】—— 关系运算符与逻辑运算符详解(附面试例题)