最近在使用STM32F030C8T6需要用到DMA功能,因为是第一次使用结果再坑里了,弄了两天才搞明白,发帖警示一番。
DMA的标志位有很多而且名字很像,最重要的是用错标志位,系统不报错。
下面是中断位使
void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState)
他的标志位(第二个参数)是:
#define DMA_IT_TC DMA_CCR_TCIE
#define DMA_IT_HT DMA_CCR_HTIE
#define DMA_IT_TE DMA_CCR_TEIE
接下来设计中断标志位和清除标志位
void DMA_ClearFlag(uint32_t DMA_FLAG)
FlagStatus DMA_GetFlagStatus(uint32_t DMA_FLAG)
他们的标志位(参数)是:
#define DMA1_FLAG_GL1 DMA_ISR_GIF1
#define DMA1_FLAG_TC1 DMA_ISR_TCIF1
#define DMA1_FLAG_HT1 DMA_ISR_HTIF1
#define DMA1_FLAG_TE1 DMA_ISR_TEIF
(后面还有 2 3 4 5,节省空间和时间,省略)
检查标志为发生否和清除
ITStatus DMA_GetITStatus(uint32_t DMA_IT)
void DMA_ClearITPendingBit(uint32_t DMA_IT)
他们的标志位为: ((IT) == DMA1_IT_GL1) || ((IT) == DMA1_IT_TC1) || \
((IT) == DMA1_IT_HT1) || ((IT) == DMA1_IT_TE1) || \
看吧,就这这么一堆。DMA_IT_TC DMA1_FLAG_TC1 DMA1_IT_TC1
弄得有晕头转向的,中断一直进不去。
中断函数之前要先使用 DMA_ITConfig();据顶使用哪种中断,然后中断函数用 DMA_GetITStatus()函数判断对应的标志位是否需要进入中断
|