stm32 hal库tim3触发dma读取gpio状态
众所周知,GPIO不属于外设,属于内存233
最近有个东东需要频繁对IO口进行读取,虽然说可以用定时器中断,但是频繁地进入中断会影响性能,于是用DMA来处理。
cube和keil的工程在下方的链接中,这里就不展开了
配置好cube后,打开stm32f1xx_hal_msp.c文件,添加HAL_DMA_Start(htim_base->hdma[TIM_DMA_ID_UPDATE],(uint32_t)&GPIOC->IDR,(uint32_t)&gpioc_sta,1)用于启动DMA
如下图所示

在main函数中,每隔一段时间读取一次GPIO状态,并打印出来

所使用的单片机为网上常见的c8t6,PC13的硬件如下图所示

cube中设置PC13的状态为No pull-up and no pull-down,故没有外界干涉是应该返回1,但实际上返回了0

很明显返回的值不正确
我们回到stm32f1xx_hal_msp.c文件,将传输方向从DMA_PERIPH_TO_MEMORY该为DMA_MEMORY_TO_MEMORY

重新编译并下载,可以看到返回的值是1,用导线将该引脚拉到地,返回的值是0

结果正确了
emmmmm所以GPIO是内存?
工程的链接在这里:https://download.csdn.net/download/qq_40432619/15769358?spm=1001.2014.3001.5501
之前有做过实验,在ADC的触发函数中,在stm32f1xx_hal_adc.c中的HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length)函数中
将HAL_DMA_Start_IT(hadc->DMA_Handle, (uint32_t)&hadc->Instance->DR, (uint32_t)pData, Length)
改为HAL_DMA_Start_IT(hadc->DMA_Handle, (uint32_t)&GPIOx->IDR, (uint32_t)pData, Length)
DMA设置的传输方向是DMA_PERIPH_TO_MEMORY而不是DMA_MEMORY_TO_MEMORY,返回的却是正确GPIO的数据
这就搞不懂了,知道原因的dalao麻烦告诉我一下233
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
