这里以stm32f103zet6为例。
1.程序目的
使用定时器定时500ms,每到500ms时,触发DMA,读取引脚电平,存入数组中。
2.DMA的配置
有关DMA原理的部分,请自行百度,这里只说一下具体用法。
(1)配置请求来源
以上图为例,可以看出,在DMA1的通道二,有一个TIM2_UP,即定时器2的更新产生的DMA请求。
注:在我们的这次实验中,DMA传输方向是外设到内存,需要配置请求来源,如果传输方向是内存到内存,例如把RAM中的数组存入FLASH中,则不需要配置请求来源。
(2)配置数据传输格式
关于数据传输格式的配置,只要按照结构体的成员描述配置就行了。注意一下数据宽度要一致(不一致也行,不过数据可能会出错),DMA模式是循环(DMA_Mode_Circular)还是单次(DMA_Mode_Normal)模式。在只有一个DMA请求时,优先级可以随意设置。
3.实验源码
//本实验中,我们读取PE端口的电平
#define BUFFER_SIZE 1
uint32_t value[BUFFER_SIZE] = {
0};
void gpio_init(void)
{
/*
这里是对PE口的初始化,设置为输入模式就行,省略。
*/
}
/*
对于TIM2的配置,除了基本的分频和重装载值得配置外,只需要使能TIM2的DMA就行了,不需要使能更新中断。
*/
void