半生:是因为发出了数据
不熟:是因为不太理解。只是用了简单的几个东西
配置DMA操作步骤如下:
1、打开时钟。
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);
2、配置DMA数据结构
有几点明确的:通过USART1发送数据,ST的F4参考手册里边可以找打USART1说对应的通道:DMA2-Channel4-Stream7。
数据传递方向是Memory2Peripheral。即内存到外设。
不使用FIFO,要传输的数据位于数组usart_tx_buf[20]中,USART1发送数据寄存器的地址是:USART1_BASE+0x04,内存和外设的字宽都是1Byte.
单次传输,传输一次完毕需要手动重启。外设地址固定,内存地址自增。
于是:
DMA_DeInit(DMA2_Stream7);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);
DMA_StructInit(&DMA_InitStructure);
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Channel = DMA_Channel_4;
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)usart_tx_buf;
DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_BASE+0x04;
DMA_InitStructure.DMA_BufferSize = BufSize;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
之后,使用DMA_Init初始化DMA。最后用DMA_Cmd使能DMA。
以后每次发送数据都要用DMA_Cmd使能一次DMA。我没找到别的办法。。。。。
住函数中调用:
while(1)
{
while(RESET == USART_GetFlagStatus(USART1,USART_FLAG_TXE));
USART_SendData(USART1,'b');
while(RESET == USART_GetFlagStatus(USART1,USART_FLAG_TXE));
USART_SendData(USART1,'a');
delay_ms(1000);
printf("argjiarjfgio\r\n");
if(SET == DMA_GetFlagStatus(DMA2_Stream7,DMA_FLAG_TCIF7))
{
DMA_ClearFlag(DMA2_Stream7,DMA_FLAG_TCIF7);
//DMA_Cmd(DMA2_Stream7,DISABLE);
for(i = 0;i<20;i++)
usart_tx_buf[i] = i+51;
DMA_Cmd(DMA2_Stream7,ENABLE);
}
}
关键字:STM32F4 DMA USART 发送数据
引用地址:
STM32F4半生不熟的DMA/USART发送数据
推荐阅读最新更新时间:2024-03-16 15:26
STM32F407-定时器中断
1.通用定时器工作流程 2. 时钟来源 定时器有4个时钟源,分别为: 内部时钟(CK_INT) 外部时钟模式1:外部输入脚(TIx) 外部时钟模式2:外部触发输入(ETR)(仅适用TIM2,3,4) 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器 3.计数器模式 通用定时器支持3种计数模式: ①向上计数模式 时钟分频因子取1 计数器寄存器的最大值为36,因此自动装填值为36,意思是说当计数器的寄存器存满达到36之后,此时就会产生溢出事件,同时触发更新,更新中断标志因此置为1。更新完后,计数器的寄存器又从0开始重新计数,直到到达自动装填值后重复之前操作,这一过程:计数器从0计数到自
[单片机]
STM8L051之ADC+DMA两通道数据采样错位问题
程序中使用ADC1采样一个外部输入,一个内部参考电压的电压,其中出现了两通道的数据错位问题,即有时数组第一个数与该数组第二个数据交换了,在网上找了很久都没神马结果,最后只能将ADC的连续转换模式设置成单次转换 即ADC_Init(ADC1, ADC_ConversionMode_Continuous, ADC_Resolution_12Bit, ADC_Prescaler_1);改成 ADC_Init(ADC1, ADC_ConversionMode_Single, ADC_Resolution_12Bit, ADC_Prescaler_1); 在每次一组数据传 输完成产生一次DMA中断的时候再启动下一次adc转换。这样
[单片机]
第31章 STM32F429的SPI总线基础知识和HAL库API
31.1 初学者重要提示 STM32H7的SPI支持4到32bit数据传输,而STM32F1和F4系列仅支持8bit或者16bit。 STM3F429的主频168MHz时,SPI1、4、5、6最高通信时钟是42MHz,而SPI2和SPI3是21MHz。 SPI总线的片选引脚SS在单一的主从器件配置下是可选的,一般情况下可以不使用。 搜集了几篇质量比较高的SPI总线介绍帖:http://www.armbbs.cn/forum.php?mod=viewthread&tid=96788。 31.2 SPI总线基础知识 31.2.1 SPI总线的硬件框图 认识一个外设,最好的方式就是看它的框图,方便我们快速的了解SPI的基
[单片机]
第20章 STM32F429的GPIO应用之无源蜂鸣器
20.1 初学者重要提示 学习本章节前,务必保证已经学习了第13,14和15章。 注意有源蜂鸣器和无源蜂鸣器的区别,本章教程的20.2.1小节有专门说明。 开发板是采用的无源蜂鸣器,需要PWM驱动,而截至本章节还没有讲到PWM,会在第XX章节专门为大家讲解(更新到相应章节时再添),程序中是通过一个宏定义控制使能和关闭,所以对于初学者来说,当前阶段仅需了解到使能和关闭方法即可,后面学习到PWM章节了,再深入了解。 无源蜂鸣器的控制采用的非阻塞方式,实际项目中比较实用。 20.2 蜂鸣器硬件设计 蜂鸣器的硬件设计如下: 通过这个硬件设计,有如下两点需要学习: 20.2.1 蜂鸣器分类 蜂鸣器主要有电磁式和电压式两
[单片机]
基于PCI Core的链式DMA控制器设计
摘要:介绍一种基于PCI总线的高效链式DMA控制器的设计与实现,用于高速宽带的计算机外设接口。利用Altera公司的PCI核——PCI_MT32搭建基于此控制器的数据采集平台,并成功应用在DVB数据接收卡中。
关键词:PCI 链式 DMA控制器
1991年PCISIG(外围部件互连专业组)成立,提出了PCI的概念。Altera公司提供的软件包:PCI Compiler可以参数化地生成 用于PCI接口的IP核——Megacore。该IP核包含了PCI控制电路的所有功能,完成总线协议的转换,并将复杂的、
电气和时序要求高的PCI转换为易于操作的本地接口逻辑。用户可以基于其生成的IP核模块,设计自己的外部设备接口逻辑。用户可以基
[传感技术]
RS485通讯中使用STM32串口以DMA方式发送数据丢失字节的问题
1、开发平台 计算机操作系统:WIN7 64位; 开发环境:Keil MDK 5.14; MCU:STM32F407ZET6; STM32F4xx固件库:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0; 串口调试助手; 2、问题描述 在测试用STM32F4xx芯片的串口USART1以DMA方式进行RS485收发通讯时,出现数据字节丢失的现象,一般丢失1~2个字节。 出现问题时测试的简单收发机制:使能串口USART1的DMA收发功能,开启了DMA发送完成中断和USART1空闲中断。通过串口调试助手发送N个字节给MCU,当MCU产生USART1空闲中断时,在USART1空闲中断服务
[单片机]
STM32F429之IO操作
1、读引脚状态 使用HAL库函数,这两天因为不注意把自己坑了两天!是这样的,我想读PB3口的状态,调用库函数HAL_GPIO_ReadPin(),我是这样写的HAL_GPIO_ReadPin(GPIOB,3),怎么读都不对整的都快抑郁了,goto到函数里边发现GPIOx- IDR & GPIO_Pin,我赋值GPIO_Pin=3,那读的就是引脚0和1的状态啊,改成HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3)就对了。一不注意就犯错啊。 2、IO引脚的复用 看F4xx的手册没有特别的介绍引脚的复用功能和映射,F1的时候专门有寄存器AFIO对引脚的重映射进行管理,F4没有了程序下载引脚的当做普通IO时
[单片机]
stm32f407驱动山外鹰眼二值化摄像头
stm32f407芯片主程序: #include main.h uint8_t pic ; bool busy = false; void ov7725_isr(void) { uint8_t *ptr = (uint8_t*)&pic ; if(!busy) { OV7725_GetImg(ptr); busy = true; } } int main(void) { uint16_t i; GPIO_InitTypeDef GPIO_InitStruct; USART_InitTypeDef USART_InitStruct; //GPIO initialize RCC_AHB1
[单片机]