当前位置:网站首页>CubeMx DMA笔记
CubeMx DMA笔记
2022-07-02 04:53:00 【@残梦】
定时器开DMA:

关于DMA初始代码:
static void TIM1_CH4_DMA2_TransferComplete_Callback(DMA_HandleTypeDef *hdma)
{
//printf("TIM1_CH4_DMA2_TransferComplete_Callback\r\n");
//_LED_TURN;
}
uint32_t gpiosta[2] = {
0xFFFF0000,0x0000FFFF};
void TIM1_DMA2_Init(void)
{
HAL_NVIC_DisableIRQ(TIM1_UP_TIM10_IRQn);
HAL_NVIC_DisableIRQ(DMA2_Stream5_IRQn);
HAL_NVIC_DisableIRQ(DMA2_Stream1_IRQn);//禁止中断更新
#if 0//TIM1_UP的DMA
htim1.hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM1_CH1_DMA2_TransferComplete_Callback;
HAL_DMA_Start_IT(&hdma_tim1_up,(uint32_t)(&gpiosta[0]), (uint32_t)(&(GPIOC->BSRR)),2);//(uint32_t)(&(GPIOC->BSRR))
__HAL_TIM_ENABLE_DMA(&htim1, TIM_DMA_UPDATE);
#else//TIM1_CH1 + TIM1_CH4 的DMA
htim1.hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM1_CH1_DMA2_TransferComplete_Callback;
HAL_DMA_Start_IT(&hdma_tim1_ch1,(uint32_t)(&gpiosta[0]), (uint32_t)(&(GPIOB->BSRR)),2);
__HAL_TIM_ENABLE_DMA(&htim1, TIM_DMA_CC1);
htim1.hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM1_CH4_DMA2_TransferComplete_Callback;//传输完成回调函数
HAL_DMA_Start_IT(&hdma_tim1_ch4_trig_com,(uint32_t)(&gpiosta[0]), (uint32_t)(&(GPIOC->BSRR)),2);//将gpiosta的数据搬移到GPIOC->BSRR
__HAL_TIM_ENABLE_DMA(&htim1, TIM_DMA_CC4);//使能定时器更新DMA请求
#endif
}
主函数启动:
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_4);
TIM1_DMA2_Init();
while(1)
{
HAL_Delay(3000);
}
关于tim.c全部代码:
/** ****************************************************************************** * @file tim.c * @brief This file provides code for the configuration * of the TIM instances. ****************************************************************************** * @attention * * <h2><center>© Copyright (c) 2022 STMicroelectronics. * All rights reserved.</center></h2> * * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */
/* Includes ------------------------------------------------------------------*/
#include "tim.h"
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
TIM_HandleTypeDef htim1;
DMA_HandleTypeDef hdma_tim1_ch1;
DMA_HandleTypeDef hdma_tim1_ch4_trig_com;
/* TIM1 init function */
void MX_TIM1_Init(void)
{
/* USER CODE BEGIN TIM1_Init 0 */
/* USER CODE END TIM1_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {
0};
TIM_MasterConfigTypeDef sMasterConfig = {
0};
TIM_OC_InitTypeDef sConfigOC = {
0};
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {
0};
/* USER CODE BEGIN TIM1_Init 1 */
/* USER CODE END TIM1_Init 1 */
htim1.Instance = TIM1;
htim1.Init.Prescaler = 1-1;
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 168/2-1;
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = htim1.Init.Period/2;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
{
Error_Handler();
}
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
sBreakDeadTimeConfig.DeadTime = 0;
sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM1_Init 2 */
/* USER CODE END TIM1_Init 2 */
HAL_TIM_MspPostInit(&htim1);
}
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{
if(tim_baseHandle->Instance==TIM1)
{
/* USER CODE BEGIN TIM1_MspInit 0 */
/* USER CODE END TIM1_MspInit 0 */
/* TIM1 clock enable */
__HAL_RCC_TIM1_CLK_ENABLE();
/* TIM1 DMA Init */
/* TIM1_CH1 Init */
hdma_tim1_ch1.Instance = DMA2_Stream1;
hdma_tim1_ch1.Init.Channel = DMA_CHANNEL_6;
hdma_tim1_ch1.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_tim1_ch1.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_tim1_ch1.Init.MemInc = DMA_MINC_ENABLE;
hdma_tim1_ch1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
hdma_tim1_ch1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
hdma_tim1_ch1.Init.Mode = DMA_CIRCULAR;
hdma_tim1_ch1.Init.Priority = DMA_PRIORITY_VERY_HIGH;
hdma_tim1_ch1.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
if (HAL_DMA_Init(&hdma_tim1_ch1) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(tim_baseHandle,hdma[TIM_DMA_ID_CC1],hdma_tim1_ch1);
/* TIM1_CH4_TRIG_COM Init */
hdma_tim1_ch4_trig_com.Instance = DMA2_Stream4;
hdma_tim1_ch4_trig_com.Init.Channel = DMA_CHANNEL_6;
hdma_tim1_ch4_trig_com.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_tim1_ch4_trig_com.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_tim1_ch4_trig_com.Init.MemInc = DMA_MINC_ENABLE;
hdma_tim1_ch4_trig_com.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
hdma_tim1_ch4_trig_com.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
hdma_tim1_ch4_trig_com.Init.Mode = DMA_CIRCULAR;
hdma_tim1_ch4_trig_com.Init.Priority = DMA_PRIORITY_VERY_HIGH;
hdma_tim1_ch4_trig_com.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
if (HAL_DMA_Init(&hdma_tim1_ch4_trig_com) != HAL_OK)
{
Error_Handler();
}
/* Several peripheral DMA handle pointers point to the same DMA handle. Be aware that there is only one stream to perform all the requested DMAs. */
__HAL_LINKDMA(tim_baseHandle,hdma[TIM_DMA_ID_CC4],hdma_tim1_ch4_trig_com);
__HAL_LINKDMA(tim_baseHandle,hdma[TIM_DMA_ID_TRIGGER],hdma_tim1_ch4_trig_com);
__HAL_LINKDMA(tim_baseHandle,hdma[TIM_DMA_ID_COMMUTATION],hdma_tim1_ch4_trig_com);
/* USER CODE BEGIN TIM1_MspInit 1 */
/* USER CODE END TIM1_MspInit 1 */
}
}
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {
0};
if(timHandle->Instance==TIM1)
{
/* USER CODE BEGIN TIM1_MspPostInit 0 */
/* USER CODE END TIM1_MspPostInit 0 */
__HAL_RCC_GPIOA_CLK_ENABLE();
/**TIM1 GPIO Configuration PA8 ------> TIM1_CH1 PA11 ------> TIM1_CH4 */
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USER CODE BEGIN TIM1_MspPostInit 1 */
/* USER CODE END TIM1_MspPostInit 1 */
}
}
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
{
if(tim_baseHandle->Instance==TIM1)
{
/* USER CODE BEGIN TIM1_MspDeInit 0 */
/* USER CODE END TIM1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_TIM1_CLK_DISABLE();
/* TIM1 DMA DeInit */
HAL_DMA_DeInit(tim_baseHandle->hdma[TIM_DMA_ID_CC1]);
HAL_DMA_DeInit(tim_baseHandle->hdma[TIM_DMA_ID_CC4]);
HAL_DMA_DeInit(tim_baseHandle->hdma[TIM_DMA_ID_TRIGGER]);
HAL_DMA_DeInit(tim_baseHandle->hdma[TIM_DMA_ID_COMMUTATION]);
/* USER CODE BEGIN TIM1_MspDeInit 1 */
/* USER CODE END TIM1_MspDeInit 1 */
}
}
/* USER CODE BEGIN 1 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM1)
{
//_LED_TURN;
//printf("HAL_TIM_PeriodElapsedCallback\r\n");
}
}
static void TIM1_CH1_DMA2_TransferComplete_Callback(DMA_HandleTypeDef *hdma)
{
//printf("TIM1_CH1_DMA2_TransferComplete_Callback\r\n");
//_LED_TURN;
}
static void TIM1_CH4_DMA2_TransferComplete_Callback(DMA_HandleTypeDef *hdma)
{
//printf("TIM1_CH4_DMA2_TransferComplete_Callback\r\n");
//_LED_TURN;
}
uint32_t gpiosta[2] = {
0xFFFF0000,0x0000FFFF};
void TIM1_DMA2_Init(void)
{
HAL_NVIC_DisableIRQ(TIM1_UP_TIM10_IRQn);
HAL_NVIC_DisableIRQ(DMA2_Stream5_IRQn);
HAL_NVIC_DisableIRQ(DMA2_Stream1_IRQn);//禁止中断更新
#if 0//TIM1_UP的DMA
htim1.hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM1_CH1_DMA2_TransferComplete_Callback;
HAL_DMA_Start_IT(&hdma_tim1_up,(uint32_t)(&gpiosta[0]), (uint32_t)(&(GPIOC->BSRR)),2);//(uint32_t)(&(GPIOC->BSRR))
__HAL_TIM_ENABLE_DMA(&htim1, TIM_DMA_UPDATE);
#else//TIM1_CH1 + TIM1_CH4 的DMA
htim1.hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM1_CH1_DMA2_TransferComplete_Callback;
HAL_DMA_Start_IT(&hdma_tim1_ch1,(uint32_t)(&gpiosta[0]), (uint32_t)(&(GPIOB->BSRR)),2);
__HAL_TIM_ENABLE_DMA(&htim1, TIM_DMA_CC1);
htim1.hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM1_CH4_DMA2_TransferComplete_Callback;//传输完成回调函数
HAL_DMA_Start_IT(&hdma_tim1_ch4_trig_com,(uint32_t)(&gpiosta[0]), (uint32_t)(&(GPIOC->BSRR)),2);//将gpiosta的数据搬移到GPIOC->BSRR
__HAL_TIM_ENABLE_DMA(&htim1, TIM_DMA_CC4);//使能定时器更新DMA请求
#endif
}
/* USER CODE END 1 */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
关于DMA使用的外设地址一定需要满足DMA的传输限制:比如此图中的DMA1是不能访问AHB1外设的,也就是比如不能DMA1搬移GPIOC\GPIOB等外设的数据传输

边栏推荐
- The core idea of performance optimization, dry goods sharing
- [Yu Yue education] autumn 2021 reference materials of Tongji University
- Gin framework learning code
- How to configure PostgreSQL 12.9 to allow remote connections
- Knowledge arrangement about steam Education
- 06 decorator mode
- TypeScript类的使用
- Detailed process of DC-1 range construction and penetration practice (DC range Series)
- Learn AI safety monitoring project from zero [attach detailed code]
- Analyzing the hands-on building tutorial in children's programming
猜你喜欢

Typescript function details

June book news | 9 new books are listed, with a strong lineup and eyes closed!

Promise all()

win11安装pytorch-gpu遇到的坑

Orthogonal test method and function diagram method for test case design

06 decorator mode

Interview question: do you know the difference between deep copy and shallow copy? What is a reference copy?

Ognl和EL表达式以及内存马的安全研究

The core idea of performance optimization, dry goods sharing

LeetCode-对链表进行插入排序
随机推荐
Mysql database learning
Detailed process of DC-1 range construction and penetration practice (DC range Series)
Thinkphp Kernel wo system source Commercial Open source multi - user + multi - Customer Service + SMS + email notification
Change deepin to Alibaba image source
How do I interview for a successful software testing position? If you want to get a high salary, you must see the offer
Embedded-c language-9-makefile/ structure / Consortium
oracle 存储过程与job任务设置
A new attribute value must be added to the entity entity class in the code, but there is no corresponding column in the database table
06 decorator mode
Record the bug of unity 2020.3.31f1 once
C # picture display occupancy problem
Cache consistency solution - how to ensure the consistency between the cache and the data in the database when changing data
Learn what definitelytyped is through the typescript development environment of SAP ui5
Ognl和EL表达式以及内存马的安全研究
CY7C68013A之keil编译代码
Go GC garbage collection notes (three color mark)
Solution of DM database unable to open graphical interface
洛谷入门3【循环结构】题单题解
geotrust ov多域名ssl证书一年两千一百元包含几个域名?
Mysql重点难题(2)汇总