stm32使用定时器触发DMA读取引脚状态

本文介绍了如何在STM32F103ZET6上利用定时器定时500ms,通过DMA读取引脚电平并存储到数组中。详细阐述了DMA配置的请求来源和数据传输格式,并提供了实验源码。
摘要由CSDN通过智能技术生成

这里以stm32f103zet6为例。

1.程序目的

使用定时器定时500ms,每到500ms时,触发DMA,读取引脚电平,存入数组中。

2.DMA的配置

有关DMA原理的部分,请自行百度,这里只说一下具体用法。

(1)配置请求来源

各个通道的DMA1请求
以上图为例,可以看出,在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 
可以通过以下步骤实现 STM32 定时器触发 DMA: 1. 配置定时器 TIM 的计数模式和时钟源,使其能够按照一定频率产生定时中断。 2. 配置 DMA 的通道和传输方向,设置传输数据的大小和目的地址。 3. 配置 DMA触发源为定时器 TIM 的更新事件,即在 TIM 定时中断时触发 DMA 传输。 4. 在 TIM 的中断服务函数中启动 DMA 传输,将数据从源地址传输到目的地址。 以下是一个示例代码: ```c /* 配置 TIM 定时器 */ TIM_HandleTypeDef htim; htim.Instance = TIMx; htim.Init.Prescaler = xxx; htim.Init.Period = xxx; htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim.Init.CounterMode = TIM_COUNTERMODE_UP; HAL_TIM_Base_Init(&htim); HAL_TIM_Base_Start_IT(&htim); /* 配置 DMA 传输 */ DMA_HandleTypeDef hdma; hdma.Instance = DMAx_Channelx; hdma.Init.Direction = DMA_MEMORY_TO_MEMORY; hdma.Init.PeriphInc = DMA_PINC_ENABLE; hdma.Init.MemInc = DMA_MINC_ENABLE; hdma.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; hdma.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; hdma.Init.Mode = DMA_NORMAL; hdma.Init.Priority = DMA_PRIORITY_HIGH; HAL_DMA_Init(&hdma); __HAL_DMA_ENABLE_IT(&hdma, DMA_IT_TC); /* 配置 DMA 触发源为 TIM 更新事件 */ __HAL_DMA_DISABLE(&hdma); HAL_DMA_Start_IT(&hdma, (uint32_t)src_addr, (uint32_t)dst_addr, data_size); __HAL_DMA_ENABLE(&hdma); __HAL_TIM_ENABLE_DMA(&htim, TIM_DMA_UPDATE); /* 在 TIM 中断服务函数中启动 DMA 传输 */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIMx) { HAL_DMA_Start_IT(&hdma, (uint32_t)src_addr, (uint32_t)dst_addr, data_size); } } ``` 以上代码仅供参考,具体实现还需根据实际需求进行调整。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值