完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
众所周知,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是内存? 之前有做过实验,在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 |
|
|
|
|
只有小组成员才能发言,加入小组>>
1599 浏览 0 评论
imx6ull 和 lan8742 工作起来不正常, ping 老是丢包
4738 浏览 0 评论
4229 浏览 9 评论
3822 浏览 16 评论
4398 浏览 1 评论
4212浏览 3评论
2381浏览 0评论
3394浏览 0评论
1159浏览 0评论
2844浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 11:10 , Processed in 1.049431 second(s), Total 76, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
749