搜索
bottom↓
回复: 18

请教,stm32g070 能否通过dma把内存数据输出到gpio口

[复制链接]

出0入89汤圆

发表于 2023-2-9 17:24:03 | 显示全部楼层 |阅读模式
本帖最后由 youkebing 于 2023-2-9 17:25 编辑

前一段时间看到网上有dma输出到gpio的例子,似乎很简单,今天就写了个测试,内存到内存成功,但是内存到GPIOC->BSRR  失败!
找一下手册,似乎不行,是我搞错了吗?
从图上看,dma似乎与gpio够不上关系。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出590入992汤圆

发表于 2023-2-9 19:36:00 来自手机 | 显示全部楼层
BSRR这个寄存器好像只能设置1还是清零。
你试试到:ODR上面。

出0入89汤圆

 楼主| 发表于 2023-2-9 19:45:37 | 显示全部楼层
SUPER_CRJ 发表于 2023-2-9 19:36
BSRR这个寄存器好像只能设置1还是清零。
你试试到:ODR上面。
(引用自2楼)

试过了,不行,stm32g这个型号

出40入45汤圆

发表于 2023-2-9 20:40:52 | 显示全部楼层
图里头,没有 GPIO 到 DMA 的请求通道,外设那边才有请求通道。GPIO 直接由 M0+ 核 控制

出0入89汤圆

 楼主| 发表于 2023-2-9 20:48:51 | 显示全部楼层
矩阵时间 发表于 2023-2-9 20:40
图里头,没有 GPIO 到 DMA 的请求通道,外设那边才有请求通道。GPIO 直接由 M0+ 核 控制 ...
(引用自4楼)

看来,gpio不能用dma了

出0入362汤圆

发表于 2023-2-9 20:56:06 来自手机 | 显示全部楼层
当然可以,用m2m模式,就是比较慢
或者用spi, dac, 随便哪个不用的外设的dma触发源,目标地址写成gpio的odr,也一样能工作。
两种方式我都试过。

出0入89汤圆

 楼主| 发表于 2023-2-9 21:16:22 来自手机 | 显示全部楼层
tomzbj 发表于 2023-2-9 20:56
当然可以,用m2m模式,就是比较慢
或者用spi, dac, 随便哪个不用的外设的dma触发源,目标地址写成gpio的od ...

(引用自6楼)

你在stm32g这类处理器上测试过吗?我测试内存到内存没问题,但是到gpio不行

出0入362汤圆

发表于 2023-2-9 21:47:53 | 显示全部楼层
youkebing 发表于 2023-2-9 21:16
你在stm32g这类处理器上测试过吗?我测试内存到内存没问题,但是到gpio不行 ...
(引用自7楼)


我是用gd32f350试的, 用timer5触发dma写dac, dma的目标地址换成了gpioa.
主频超到240M, timer5设成10分频, 这样得到了一个24M时钟的dds.

stm32g我没试过, 有空试试.

出0入89汤圆

 楼主| 发表于 2023-2-9 22:00:06 | 显示全部楼层
tomzbj 发表于 2023-2-9 21:47
我是用gd32f350试的, 用timer5触发dma写dac, dma的目标地址换成了gpioa.
主频超到240M, timer5设成10分频 ...
(引用自8楼)

多谢,期待你的好消息

出0入42汤圆

发表于 2023-2-9 22:16:41 | 显示全部楼层
GD32F150验证是可以的
定时器捕获和溢出触发DMA,数据从GPIO输入寄存器到内存

出50入0汤圆

发表于 2023-2-9 22:17:10 | 显示全部楼层
stm32g我试过,不行,哪位大神搞定了帮忙说一声。
估计是为了提高GPIO的操作速度,看框图GPIO是单独拉到内核的,DMA应该无法访问,STM32F系列是可以的。

出0入46汤圆

发表于 2023-2-10 09:03:36 | 显示全部楼层
楼主可以试试DMA设置定时器触发,因为gpio没有标志位给DMA表示传输完成

出0入89汤圆

 楼主| 发表于 2023-2-10 09:43:23 | 显示全部楼层
工程师030 发表于 2023-2-10 09:03
楼主可以试试DMA设置定时器触发,因为gpio没有标志位给DMA表示传输完成
(引用自12楼)

我用的是定时器的通道1测试的,是stm32g070 ,你在这个处理器上用过吗?

出0入42汤圆

发表于 2023-2-10 16:31:28 | 显示全部楼层
LZ需要控制几个IO?从手册上看,这个系列的mcu把gpio独立出来了,连地址都不是40000000开头的,dma是访问不到gpio的寄存器的
但如果需要控制的io不大于4个,可以尝试利用定时器的输出通道,通过af方式来输出波形

出0入89汤圆

 楼主| 发表于 2023-2-10 16:35:57 | 显示全部楼层
wshtyr 发表于 2023-2-10 16:31
LZ需要控制几个IO?从手册上看,这个系列的mcu把gpio独立出来了,连地址都不是40000000开头的,dma是访问不 ...
(引用自14楼)

请问怎么通过af控制呢?能否说的详细一点?

出0入42汤圆

发表于 2023-2-10 17:42:32 | 显示全部楼层
youkebing 发表于 2023-2-10 16:35
请问怎么通过af控制呢?能否说的详细一点?
(引用自15楼)

GPIO设置成AF模式,映射到定时器的输出通道
定时器开启DMA,将内存的数据送到定时器的捕获/输出模式寄存器CCMR1, CCMR2
在输出模式下,有两种状态,叫强制高和强制低


预先把“强制高”和“强制低”对应的寄存器值存到内存里,使能定时器的UPDATE DMA,内存里的数据就可以写入CCMR寄存器,实现拉高和拉低的效果
这种方式最多可以用DMA控制4个通道

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入89汤圆

 楼主| 发表于 2023-2-10 18:03:49 | 显示全部楼层
wshtyr 发表于 2023-2-10 17:42
GPIO设置成AF模式,映射到定时器的输出通道
定时器开启DMA,将内存的数据送到定时器的捕获/输出模式寄存 ...
(引用自16楼)

多谢,我明白您的意思了,我想用dma直接驱动一个小液晶屏,这样可能就不好实现了

出125入16汤圆

发表于 2023-2-10 18:20:43 | 显示全部楼层
chatgpt回复的代码:

#include "stm32g0xx.h"

#define LED_PIN 5
#define LED_PORT GPIOA

uint32_t ledData[] = {0x00000001, 0x00000002, 0x00000004, 0x00000008, 0x00000010, 0x00000020, 0x00000040, 0x00000080};

void DMA1_Channel1_IRQHandler(void)
{
  if (DMA1->ISR & DMA_ISR_TCIF1)
  {
    DMA1->IFCR |= DMA_IFCR_CTCIF1;
    LED_PORT->ODR ^= ledData[7];
  }
}

int main(void)
{
  // Enable the peripheral clock for GPIOA
  RCC->IOPENR |= RCC_IOPENR_GPIOAEN;

  // Configure the LED pin as an output
  LED_PORT->MODER = (LED_PORT->MODER & ~(GPIO_MODER_MODE5 << (LED_PIN * 2))) | (GPIO_MODER_MODE5_0 << (LED_PIN * 2));

  // Enable the peripheral clock for DMA1
  RCC->AHB2ENR |= RCC_AHB2ENR_DMA1EN;

  // Configure the DMA
  DMA1_Channel1->CPAR = (uint32_t) &(LED_PORT->ODR);
  DMA1_Channel1->CMAR = (uint32_t) ledData;
  DMA1_Channel1->CNDTR = 8;
  DMA1_Channel1->CCR = DMA_CCR_DIR | DMA_CCR_MINC | DMA_CCR_TCIE;

  // Enable the DMA channel
  DMA1_Channel1->CCR |= DMA_CCR_EN;

  // Enable the DMA1 channel 1 interrupt in the NVIC
  NVIC_EnableIRQ(DMA1_Channel1_IRQn);

  while (1)
  {
    // Wait for the transfer to complete
  }
}

出0入89汤圆

 楼主| 发表于 2023-2-10 19:28:50 来自手机 | 显示全部楼层
rz007 发表于 2023-2-10 18:20
chatgpt回复的代码:

#include "stm32g0xx.h"

(引用自18楼)

这个代码估计不行,ai都这么牛叉了吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 15:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表