dma模式

DMA---直接存储器访问

霸气de小男生 提交于 2020-03-12 13:37:22
一、DMA简介 DMA传输实现高速数据移动过程无需任何CPU操作控制。 DMA控制器是独立于Cortex_M4内核的。 STM32F407共有2个DMA控制器,DMA1只有外设到存储器和存储器到外设的传输模式,DMA2具有外设到存储器、存储器到外设以及存储器到存储器的传输模式。 传输模式: 1》外设到存储器(P--->M):把外设数据寄存器内容转移到指定的内存空间。 2》存储器到外设(M--->P):把特定存储区内容转移到外设的数据寄存器中。 3》存储器到存储器(M--->M):把一个指定的存储区内容拷贝到另一个存储区空间。 二、功能框图 (1)外设通道选择 每个DMA控制器具有8个数据流,每个数据流对应8个外设通道,每个通道对应不同的DMA请求。 外设通道选择要解决的主要问题是决定哪一个外设作为该数据流的源地址或者目标地址。 每个外设请求都占用一个数据流通道,相同外设请求可以占用不同数据流通道。 (2)仲裁器 仲裁器用来管理判断哪个数据流的优先级高。 仲裁器管理数据流方法分为两个阶段:第一阶段数据软件阶段,在配置数据流时可以通过寄存器设定它的优先级别,可以设置为非常高、高、中和低四个级别。第二阶段数据硬件阶段,如果两个或两个以上数据流软件设置优先级一样,则它们优先级取决于数据流编号,编号越低优先级越高,比如数据流2优先级高于数据流3。 (3)FIFO

【连载】【FPGA黑金开发板】NIOS II那些事儿--NIOS II 常见问题(FAQ)

。_饼干妹妹 提交于 2020-03-06 09:55:20
为了帮助初学者快速入门NIOS II,在此建立NIOS II FAQ,希望大家把自己遇到的问题提出来,然后在这里总结起来,以帮助以后遇到同样问题的人。 首先需要声明一点,下面部分问题来自网络,如果版权问题,请及时通知,我将会将其删除 在此提几点要求和规定: 1.此贴是NIOS II FAQ,所以不收录其他相关内容; 2.大家通过回帖方式进行提问,如果有其他人可以解决,也是通过回帖方式进行解决; 3.问题解决以后,我会将其编入这个贴内,然后将问题跟帖删除,避免跟帖过多的影响。 4.禁止在回帖中涉及与NIOS II无关内容,一经发现立即删除。 -------------------------------------------华丽的分割线---------------------------------------------------------------------- 1.NIOS能做浮点运算么? 答:NIOS可以进行浮点运算,完全可以替代MCU,时钟可以跑到100Mhz,比ARM7还要快,ARM7时钟一般为72Mhz左右。 2.NIOS是否可以不使用SDRAM和并行FLASH? 答:首先说明一下,SDRAM是用来运行程序的,FLASH是用来存储程序代码的(SDRAM掉电丢失,FLASH则不会),每次上电的时候,都需要将FLASH中的程序代码放到SDRAM中,然后再运行。

289_S32K144串口的查询接收模式

余生长醉 提交于 2020-03-01 08:22:46
完整的S32K144的学习汇总如下: https://github.com/GreyZhang/g_s32k144 继续S32K144的学习,还是继续串口的学习。因为我觉得前面实现的这种阻塞收发模式虽然稳定,但是还有改进空间。尤其是DMA的使用,在这种模式下似乎是不奏效的。其实,发送功能倒还好一点,接收功能,我觉得还是得实现查询的方式。 查看接口信息,发现其实这个似乎也是已经实现了的一个功能。我找到了下面的这个接口: 使用这个做一下实现,测试代码修改如下: 做一下简单的测试。 看得出,这个接收的可靠性还是很高的。以上的测试是基于中断的传输模式实现的,切换成DMA其实也有同样的效果。切换DMA的配置之后,测试结果如下: 完整的S32K144的学习汇总如下: https://github.com/GreyZhang/g_s32k144 来源: CSDN 作者: grey_csdn 链接: https://blog.csdn.net/grey_csdn/article/details/104580702

基于stm32mini开发板的简易函数发生器和简易示波器

五迷三道 提交于 2020-02-27 11:00:48
基于stm32 mini开发板的简易函数发生器和简易示波器 前言:这是我学习完stm32基础知识后做的第一个比较综合的项目,由于本人学习时间不长,在程序设计方面能力不强,故展示的代码或者方法可能有误,还请各位大佬海涵,我也很高兴大家能在评论区提出建议和意见,谢谢。 一、项目整体思路和实现的功能 这个项目是基于正点原子stm32 mini开发板设计的,使用芯片为STM32F103RCT6,相关配置步骤和基础知识,可以在正点原子论坛找到。 (一)、简易示波器思路和功能 利用stm32强大的ADC功能,在一定时间内采集IO口电压,将采集到的一定数值保存在数组中,经过数据处理后,显示在LCD上。 能实现正电压下,0~3.3v电压的显示,以及最高10KHZ的频率显示(10K以上显示将不清晰)。能通过两个按键实现对ADC采样周期的转换,分为us级和ms级。 (二)、简易函数发生器思路和功能 利用stm32强大的DAC和DMA功能,以定时器2触发DAC转换,以DMA传送需要转换的数值,以达到目标波形的输出。 能实现正弦波,三角波,方波,锯齿波,甚至模拟噪声波等多种波形的输出,可以调节输出波形的幅值和频率。 二、程序设计和部分原理解释 (一)、外围按键设计 这部分主要涉及改变ADC采样周期,由于整个程序有延时,必须采用中断的方式读取键值并改变采样周期标志位,这样才能达到按一次改变一次的效果

利用DMA双缓冲或半完成中断实现串口不定长数据的接收

最后都变了- 提交于 2020-02-26 18:44:30
在《 HAL版本DMA循环模式串口数据收发 》中介绍了利用DMA循环模式进行串口数据的收发,STM32F4xx的DMA还提供了双缓冲的功能,采用双缓冲模式,可以在一个DMA完成接收后,对其缓冲区内数据进行处理的过程中,将此时接收到的数据放入第二个DMA缓冲区。双缓冲模式尤其对高速数据接收有着明显的优势,本文以上述循环接收方案为基础,提供实现双缓冲接收数据的实现方式。 首先,从寄存器的角度讲,要实现双缓冲,需要将CR寄存器的DBM位置1,将该位置1后,硬件会强制使用循环模式,当一个缓冲满后,会自动交换缓冲区的地址。但我们采用HAL库版本的程序时,不太需要关注这些,但是值得注意的是,HAL库的stm32f4xx_hal_uart.c中并没有提供实现双缓冲的接口,因此需要我们对HAL库的程序进行一些改写: HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) { /*省略库中起始部分的程序*/ /* Set the DMA abort callback */ huart->hdmarx->XferAbortCallback = NULL; /* Enable the DMA stream */ //HAL_DMA_Start_IT(huart-

STM32F4x系列的DMA配置

不想你离开。 提交于 2020-02-15 20:47:28
以SPI2 为例,将存储器中的数据,通过DMA方式搬运到外设,DMA配置步骤: 1、选择DMA1还是DMA2:通过图1可查看到SPI2是在DMA1表里,所以选择DMA1。   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE); 2、选择数据流:该配置应该放在所有信息配置完在使能。   DMA_Cmd(DMAX_StreamY, ENABLE);   其中X = 1、2,Y=0、1…7,有两个DMA,分别是DMA1和DMA2,每个DMA控制器有又有8个数据流。   问题1:一个外设怎么知道选哪个数据流呢?   答:先查看参考手册,找到DMA1/2请求映射表,如下图1、2 图1 图2   比如现在用到外设SPI2_TX(存储器的数据搬运到外设,所以得找发送) ,选择数据流4。   DMA_Cmd(DMA1_Stream4, ENABLE); 3、通道选择,有8个通道,不是随便选择的,得查看图1和图2,SPI2外设所对应的通道0。   DMA_InitStructure.DMA_Channel = DMA_Channel_0; 4、设置外设基地址。   DMA_InitStructure.DMA_PeripheralBaseAddr = 0Xxxxx;    问题2:怎么知道当前选用外设的基地址?看人家例子都是写好了的,到时换其他外设

RT600 I2S外设介绍及应用

穿精又带淫゛_ 提交于 2020-02-14 14:48:50
恩智浦的i.MX RT600是跨界处理器产品,同样也是i.MX RTxxx系列的开山之作。不同于i.MX RT1xxx系列单片机,i.MX RT600 采用了双核架构,将新一代Cortex-M33内核与高性能Cadence Tensilica HiFi 4 音频DSP内核相结合,适用于32位沉浸式音频播放和视频用户界面应用。i.MX RT600旨在通过安全、功率优化的嵌入式处理器充分挖掘语音辅助终端节点的潜力,因此针对音频数据的采集、传输和处理,i.MX RT600都有丰富的硬件资源进行支持。其中,针对RT600的I2S外设,本文详细地进行了介绍,并基于i.MX RT600 EVK开发板,在RT600的DSP端(HiFi4)实现了一个音频数字回环的demo。 一、I2S介绍 1.1 I2S 接口 I2S总线为数字音频流的传输提供了标准的通信接口,由飞利浦制定。I2S总线规范定义了一种3线串行总线,分别是: 1、串行时钟SCK(也称位时钟BCLK),这是SDA线上数据的位时钟。对应SDA的每一个数据位,SCLK都有产生一个脉冲。 2、帧时钟WS(也称LRCK,或FSYNC),以大多数单一立体声格式的PDM数据来说,WS用于切换左右声道的数据;在DSP或TDM模式下用作帧定界符。此外,I2S的采样频率是由WS频率决定的。 3、串行数据(SDA),就是用二进制表示的音频数据流

I2S 总线学习:2-I2S驱动WM8978

不问归期 提交于 2020-02-14 11:04:23
背景 为了了解I2S总线所对应的硬件设计,下文转载了 《STM32:I2S驱动WM8978》 。 以加深对I2S总线的了解。 正文 最近项目中使用STM32F4驱动音频IC:WM8978。 由于STM32的I2S接口只有一个数据引脚,因此在设计引脚的时候,就需要确定是录音还是放音。 WM8978为DAC+ADC芯片,本身并不具备编解码的功能。 1)WM8978可通过I2S接口接收PCM数据,转为模拟信号输出,此为DAC过程,即放音; 2)WM8978可接收模拟信号转为数字信号,通过I2S接口传输给MCU,此为ADC过程,即录音。 3)WM8978还使用I2C接口配置其工作参数,比如音量,EQ,3D环绕等。WM8978本身可直连1W/8欧的小喇叭。(在下文中没有使用) 1.GPIO配置 我使用的是I2S3,对着硬件工程师给的原理图,再使用STM32CubeMX对照各个管脚看看是否有此映射。不得不说,新版的STM32CubeMX使用起来有些不顺。我只喜欢使用STM32CubeMX查看资源,却不喜欢这个软件的代码,架构有些不合我意。 我使用的还是传统的库,版本为V1.4.0。 GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB |

STM32 hal库串口DMA模式收发定长数据

♀尐吖头ヾ 提交于 2020-02-12 00:19:32
//DMA接收定义为循环模式,只能接受定长数据 //串口DMA中断调用的回调函数和串口接收中断是同一个 uint8_t rxch [ 5 ] ; uint8_t trch [ ] = "transmit dma:\r\n" ; int main ( void ) { HAL_UART_Transmit_DMA ( & huart1 , trch , 15 ) ; HAL_UART_Receive_DMA ( & huart1 , rxch , 5 ) ; while ( 1 ) { } } //DMA接收完成回调函数和这是同一个 void HAL_UART_RxCpltCallback ( UART_HandleTypeDef * huart ) { if ( huart -> Instance == USART1 ) { printf ( "%s\r\n" , rxch ) ; HAL_UART_Transmit_DMA ( & huart1 , rxch , 5 ) ; } } //DMA传输完成回调函数和这是同一个 void HAL_UART_TxCpltCallback ( UART_HandleTypeDef * huart ) { uint8_t tx_str [ ] = "Data Transfer completed\r\n" ; HAL_UART_Transmit

STM32使用DMA控制器试验总结

偶尔善良 提交于 2020-02-11 14:32:57
在使用串口DMA试验过程中,遇到了一些问题,通过试验找到了问题所在,也对DMA的应用有了新的认识,仅以此分享给大家,不足之处请多多指教。 DMA初始化 // 串口对应的DMA请求通道 # define USART_TX_DMA_CHANNEL DMA1_Channel4 # define USART_TX_DMA_IRQ DMA1_Channel4_IRQn # define USART_TX_DMA_IRQHandler DMA1_Channel4_IRQHandler // 外设寄存器地址 # define USART_DR_ADDRESS (USART1_BASE+0x04) // 一次发送的数据量 # define SENDBUFF_SIZE 250 /** * @brief USARTx TX DMA 配置,内存到外设(USART1->DR) * @param 无 * @retval 无 */ void USARTx_DMA_Config ( void ) { DMA_InitTypeDef DMA_InitStructure ; DMA_DeInit ( USART_TX_DMA_CHANNEL ) ; // 开启DMA时钟 RCC_AHBPeriphClockCmd ( RCC_AHBPeriph_DMA1 , ENABLE ) ; // 设置DMA源地址