在 L412KB Nucleo 上,我将
tiM1 配置为使用 ETR2 作为时钟源并将计数器周期设置为 1,以便每次在 TIM1_ETR 引脚上出现上升沿时,它都应该触发 DMA。我设置 DMA1/Ch6 以响应来自 GPIOA 的字节大小的外设到内存的 TIM_UP(因为我的 D0-D7 输入并行数据在这些引脚上)。
如果启用中断,我可以启动 TIM1 并验证它是否触发。这样可行。但是,当我检查目标内存时,我没有看到 DMA 发生,也没有生成 DMA 中断(它也在 NVIC 中启用)。所以我不知道失败来自哪里。(我希望看到 `byteBuffer` 填充 &GPIOA->IDR,它在外部硬连线到 0x82,但它仍然为零)。我是不是忘了打开/启用某些东西?
这是`main.c`:
/* 用户代码开始头 */
/**
****************************************************** *******************************
* @文件:main.c
* @brief : 主程序体
****************************************************** *******************************
* @注意力
*
*
© 版权所有 (c) 2022 意法半导体。
* 版权所有。
*
* 该软件组件由 ST 根据 BSD 3-Clause 许可授权,
*“许可证”;除非符合
* 执照。您可以在以下位置获得许可证副本:
*
opensource.org/licenses/BSD-3-Clause
*
****************************************************** *******************************
*/
/* 用户代码结束头 */
/* 包括-------------------------------------------- ------------------*/
#include "main.h"
/* 私有包括-------------------------------------------- ----------*/
/* 用户代码开始包括 */
/* 用户代码结束包括 */
/* 私有 typedef ------------------------------------------ --------------*/
/* 用户代码开始 PTD */
/* 用户代码结束 PTD */
/* 私有定义 ------------------------------------------ --------------*/
/* 用户代码开始 PD */
/* 用户代码结束 PD */
/* 私有宏-------------------------------------------- --------------*/
/* 用户代码开始 PM */
/* 用户代码结束 PM */
/* 私有变量-------------------------------------------- ----------*/
I2C_HandleTypeDef hi2c1;
TIM_HandleTypeDef htim1;
TIM_HandleTypeDef htim2;
DMA_HandleTypeDef hdma_tim1_up;
/* 用户代码开始 PV */
易失性 uint8_t idr = 0;
易失性 uint8_t byteBuff[256];
/* 用户代码结束 PV */
/* 私有函数原型-------------------------------------------- --*/
void SystemClock_Config(void);
静态无效 MX_GPIO_Init(无效);
静态无效 MX_I2C1_Init(无效);
静态无效 MX_TIM2_Init(无效);
静态无效 MX_DMA_Init(无效);
静态无效 MX_TIM1_Init(无效);
/* 用户代码开始 PFP */
/* 用户代码结束 PFP */
/* 私有用户代码-------------------------------------------- ----------*/
/* 用户代码从 0 开始 */
/* 用户代码结束 0 */
/**
* @brief 应用程序入口点。
* @retval 整数
*/
int 主要(无效)
{
/* 用户代码开始 1 */
/* 用户代码结束 1 */
/*
单片机配置-------------------------------------------- ----------*/
/* 重置所有外设,初始化 Flash 接口和 Systick。*/
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_I2C1_Init();
MX_TIM2_Init();
MX_DMA_Init();
MX_TIM1_Init();
idr = GPIOA->IDR;
HAL_DMA_Start_IT(&hdma_tim1_up, (uint32_t)&(GPIOA->IDR), (uint32_t)byteBuff, 0x10);
HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_MSI, RCC_MCODIV_2);
HAL_TIM_Base_Start(&htim1);
而 (1)
{
}
}
静态无效 MX_TIM1_Init(无效)
{
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
htim1.Instance = TIM1;
htim1.Init.Prescaler = 0;
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 1;
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
如果(HAL_TIM_Base_Init(&htim1)!= HAL_OK)
{
错误处理程序();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_ETRMODE2;
sClockSourceConfig.ClockPolarity = TIM_CLOCKPOLARITY_NONINVERTED;
sClockSourceConfig.ClockPrescaler = TIM_CLOCKPRESCALER_DIV1;
sClockSourceConfig.ClockFilter = 15;
如果 (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
{
错误处理程序();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
如果 (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
{
错误处理程序();
}
}
静态无效 MX_DMA_Init(无效)
{
__HAL_RCC_DMA1_CLK_ENABLE();
HAL_NVIC_SetPriority(DMA1_Channel6_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn);
}
... 这是 MSP 代码 ...
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
如果(htim_base->Instance==TIM1)
{
__HAL_RCC_TIM1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**TIM1 GPIO 配置
PA12 ------> TIM1_ETR
*/
GPIO_InitStruct.Pin = GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* TIM1 DMA 初始化 */
/* TIM1_UP 初始化 */
hdma_tim1_up.Instance = DMA1_Channel6;
hdma_tim1_up.Init.Request = DMA_REQUEST_7;
hdma_tim1_up.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_tim1_up.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_tim1_up.Init.MemInc = DMA_MINC_ENABLE;
hdma_tim1_up.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_tim1_up.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_tim1_up.Init.Mode = DMA_NORMAL;
hdma_tim1_up.Init.Priority = DMA_PRIORITY_HIGH;
如果(HAL_DMA_Init(&hdma_tim1_up)!= HAL_OK)
{
错误处理程序();
}
__HAL_LINKDMA(htim_base,hdma[TIM_DMA_ID_UPDATE],hdma_tim1_up);
/* TIM1 中断初始化 */
HAL_NVIC_SetPriority(TIM1_BRK_TIM15_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM1_BRK_TIM15_IRQn);
HAL_NVIC_SetPriority(TIM1_UP_TIM16_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn);
HAL_NVIC_SetPriority(TIM1_TRG_COM_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM1_TRG_COM_IRQn);
HAL_NVIC_SetPriority(TIM1_CC_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM1_CC_IRQn);
/* 用户代码开始 TIM1_MspInit 1 */
:
:
0