Browse Source

MX - enable DMA on DAC using TIMER6 as trigger source

Timer6 triggers the DAC. When the DAC gets triggered, it moves the hold register to the output register and fires a DMA request. So, the TIMER6 defines the sampling rate of the DAC using prescaler and period.
makefile_for_cmsis
heck 2 years ago
parent
commit
e6d3b6d95e
  1. 40
      .mxproject
  2. 8
      Core/Inc/cppmain.h
  3. 1
      Core/Inc/stm32f4xx_it.h
  4. 3
      Core/Inc/tim.h
  5. 46
      Core/Src/cppmain.cc
  6. 26
      Core/Src/dac.c
  7. 2
      Core/Src/freertos.c
  8. 8
      Core/Src/main.c
  9. 15
      Core/Src/stm32f4xx_it.c
  10. 60
      Core/Src/tim.c
  11. 2
      Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dac.c
  12. 43
      raw407cxx.ioc

40
.mxproject

File diff suppressed because one or more lines are too long

8
Core/Inc/cppmain.h

@ -13,10 +13,10 @@
extern "C" {
#endif
void irq1();
void timer_cb();
void cppmain(void);
void heck_irq1();
void heck_timer_cb();
void heck_cppmain(void);
void heck_error_handler();
#ifdef __cplusplus
};
#endif

1
Core/Inc/stm32f4xx_it.h

@ -54,6 +54,7 @@ void UsageFault_Handler(void);
void DebugMon_Handler(void);
void SysTick_Handler(void);
void EXTI0_IRQHandler(void);
void DMA1_Stream5_IRQHandler(void);
void TIM2_IRQHandler(void);
void OTG_FS_IRQHandler(void);
/* USER CODE BEGIN EFP */

3
Core/Inc/tim.h

@ -34,11 +34,14 @@ extern "C" {
extern TIM_HandleTypeDef htim2;
extern TIM_HandleTypeDef htim6;
/* USER CODE BEGIN Private defines */
/* USER CODE END Private defines */
void MX_TIM2_Init(void);
void MX_TIM6_Init(void);
/* USER CODE BEGIN Prototypes */

46
Core/Src/cppmain.cc

@ -17,6 +17,19 @@
const double pi{ std::acos(-1) };
#define NS 128
uint32_t Wave_LUT[NS] = {
2048, 2149, 2250, 2350, 2450, 2549, 2646, 2742, 2837, 2929, 3020, 3108, 3193, 3275, 3355, 3431,
3504, 3574, 3639, 3701, 3759, 3812, 3861, 3906, 3946, 3982, 4013, 4039, 4060, 4076, 4087, 4094,
4095, 4091, 4082, 4069, 4050, 4026, 3998, 3965, 3927, 3884, 3837, 3786, 3730, 3671, 3607, 3539,
3468, 3394, 3316, 3235, 3151, 3064, 2975, 2883, 2790, 2695, 2598, 2500, 2400, 2300, 2199, 2098,
1997, 1896, 1795, 1695, 1595, 1497, 1400, 1305, 1212, 1120, 1031, 944, 860, 779, 701, 627,
556, 488, 424, 365, 309, 258, 211, 168, 130, 97, 69, 45, 26, 13, 4, 0,
1, 8, 19, 35, 56, 82, 113, 149, 189, 234, 283, 336, 394, 456, 521, 591,
664, 740, 820, 902, 987, 1075, 1166, 1258, 1353, 1449, 1546, 1645, 1745, 1845, 1946, 2047
};
// Serial Logging
// --------------
@ -65,7 +78,8 @@ void led_green_off()
HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_RESET);
}
void dac1_toggle() {
void dac1_toggle()
{
static bool dac_state{ 0 };
dac_state = !dac_state;
if (dac_state) {
@ -77,15 +91,15 @@ void dac1_toggle() {
// MAIN
// ----
void irq1()
void heck_irq1()
{
led_green_toggle();
}
void timer_cb()
void heck_timer_cb()
{
dac1_toggle();
// dac1_toggle();
led_green_toggle();
log("timerUP");
}
@ -94,7 +108,6 @@ void timer_cb()
// HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
void bytebeat()
{
HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
long t{ 0 };
while (true) {
unsigned char res = t * ((t >> 12 | t >> 8) & 63 & t >> 4);
@ -105,12 +118,27 @@ void bytebeat()
}
}
void cppmain(void)
void heck_cppmain(void)
{
HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
HAL_TIM_Base_Start_IT(&htim2);
// HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
// HAL_DAC_Start(&hdac, DAC_CHANNEL_2);
// HAL_TIM_Base_Start_IT(&htim2);
// gen LUT
HAL_TIM_Base_Start(&htim6);
while (true) {
log("huhu");
HAL_Delay(1000);
// HAL_Delay(5);
HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t *)Wave_LUT, 128, DAC_ALIGN_12B_R);
}
}
void heck_error_handler()
{
log("HECK ERRRRROR HANDLER");
}

26
Core/Src/dac.c

@ -25,6 +25,7 @@
/* USER CODE END 0 */
DAC_HandleTypeDef hdac;
DMA_HandleTypeDef hdma_dac1;
/* DAC init function */
void MX_DAC_Init(void)
@ -50,7 +51,8 @@ void MX_DAC_Init(void)
/** DAC channel OUT1 config
*/
sConfig.DAC_Trigger = DAC_TRIGGER_NONE;
sConfig.DAC_Trigger = DAC_TRIGGER_T6_TRGO;
// sConfig.DAC_Trigger = DAC_TRIGGER_NONE;
sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1) != HAL_OK)
{
@ -59,6 +61,7 @@ void MX_DAC_Init(void)
/** DAC channel OUT2 config
*/
sConfig.DAC_Trigger = DAC_TRIGGER_NONE;
if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_2) != HAL_OK)
{
Error_Handler();
@ -91,6 +94,25 @@ void HAL_DAC_MspInit(DAC_HandleTypeDef* dacHandle)
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* DAC DMA Init */
/* DAC1 Init */
hdma_dac1.Instance = DMA1_Stream5;
hdma_dac1.Init.Channel = DMA_CHANNEL_7;
hdma_dac1.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_dac1.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_dac1.Init.MemInc = DMA_MINC_ENABLE;
hdma_dac1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
hdma_dac1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
hdma_dac1.Init.Mode = DMA_NORMAL;
hdma_dac1.Init.Priority = DMA_PRIORITY_LOW;
hdma_dac1.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
if (HAL_DMA_Init(&hdma_dac1) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(dacHandle,DMA_Handle1,hdma_dac1);
/* USER CODE BEGIN DAC_MspInit 1 */
/* USER CODE END DAC_MspInit 1 */
@ -114,6 +136,8 @@ void HAL_DAC_MspDeInit(DAC_HandleTypeDef* dacHandle)
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4|GPIO_PIN_5);
/* DAC DMA DeInit */
HAL_DMA_DeInit(dacHandle->DMA_Handle1);
/* USER CODE BEGIN DAC_MspDeInit 1 */
/* USER CODE END DAC_MspDeInit 1 */

2
Core/Src/freertos.c

@ -119,7 +119,7 @@ void StartDefaultTask(void *argument)
MX_USB_DEVICE_Init();
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
cppmain();
heck_cppmain();
// for(;;)
// {
// osDelay(1);

8
Core/Src/main.c

@ -20,6 +20,7 @@
#include "main.h"
#include "cmsis_os.h"
#include "dac.h"
#include "dma.h"
#include "tim.h"
#include "usb_device.h"
#include "gpio.h"
@ -90,8 +91,10 @@ int main(void)
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_DAC_Init();
MX_TIM2_Init();
MX_TIM6_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
@ -164,14 +167,14 @@ void SystemClock_Config(void)
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == BUT_BLUE_Pin) {
irq1();
heck_irq1();
} else {
__NOP();
}
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim) {
timer_cb();
// heck_timer_cb();
}
/* USER CODE END 4 */
@ -184,6 +187,7 @@ void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
heck_error_handler();
__disable_irq();
while (1)
{

15
Core/Src/stm32f4xx_it.c

@ -58,6 +58,7 @@
/* External variables --------------------------------------------------------*/
extern PCD_HandleTypeDef hpcd_USB_OTG_FS;
extern DMA_HandleTypeDef hdma_dac1;
extern TIM_HandleTypeDef htim2;
/* USER CODE BEGIN EV */
@ -197,6 +198,20 @@ void EXTI0_IRQHandler(void)
/* USER CODE END EXTI0_IRQn 1 */
}
/**
* @brief This function handles DMA1 stream5 global interrupt.
*/
void DMA1_Stream5_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Stream5_IRQn 0 */
/* USER CODE END DMA1_Stream5_IRQn 0 */
HAL_DMA_IRQHandler(&hdma_dac1);
/* USER CODE BEGIN DMA1_Stream5_IRQn 1 */
/* USER CODE END DMA1_Stream5_IRQn 1 */
}
/**
* @brief This function handles TIM2 global interrupt.
*/

60
Core/Src/tim.c

@ -25,11 +25,12 @@
/* USER CODE END 0 */
TIM_HandleTypeDef htim2;
TIM_HandleTypeDef htim6;
/* TIM2 init function */
void MX_TIM2_Init(void)
{
/* USER CODE BEGIN TIM2_Init 0 */
/* USER CODE END TIM2_Init 0 */
@ -43,7 +44,7 @@ void MX_TIM2_Init(void)
htim2.Instance = TIM2;
htim2.Init.Prescaler = 0;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 429400;
htim2.Init.Period = 429496;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
@ -65,6 +66,39 @@ void MX_TIM2_Init(void)
/* USER CODE END TIM2_Init 2 */
}
/* TIM6 init function */
void MX_TIM6_Init(void)
{
/* USER CODE BEGIN TIM6_Init 0 */
/* USER CODE END TIM6_Init 0 */
TIM_MasterConfigTypeDef sMasterConfig = {0};
/* USER CODE BEGIN TIM6_Init 1 */
/* USER CODE END TIM6_Init 1 */
htim6.Instance = TIM6;
htim6.Init.Prescaler = 0;
htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
htim6.Init.Period = 1904;
htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM6_Init 2 */
/* USER CODE END TIM6_Init 2 */
}
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
@ -85,6 +119,17 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
/* USER CODE END TIM2_MspInit 1 */
}
else if(tim_baseHandle->Instance==TIM6)
{
/* USER CODE BEGIN TIM6_MspInit 0 */
/* USER CODE END TIM6_MspInit 0 */
/* TIM6 clock enable */
__HAL_RCC_TIM6_CLK_ENABLE();
/* USER CODE BEGIN TIM6_MspInit 1 */
/* USER CODE END TIM6_MspInit 1 */
}
}
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
@ -104,6 +149,17 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
/* USER CODE END TIM2_MspDeInit 1 */
}
else if(tim_baseHandle->Instance==TIM6)
{
/* USER CODE BEGIN TIM6_MspDeInit 0 */
/* USER CODE END TIM6_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_TIM6_CLK_DISABLE();
/* USER CODE BEGIN TIM6_MspDeInit 1 */
/* USER CODE END TIM6_MspDeInit 1 */
}
}
/* USER CODE BEGIN 1 */

2
Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dac.c

@ -373,7 +373,9 @@ HAL_StatusTypeDef HAL_DAC_DeInit(DAC_HandleTypeDef *hdac)
* @param hdac pointer to a DAC_HandleTypeDef structure that contains
* the configuration information for the specified DAC.
* @retval None
*/
__weak void HAL_DAC_MspInit(DAC_HandleTypeDef *hdac)
{
/* Prevent unused argument(s) compilation warning */

43
raw407cxx.ioc

@ -2,6 +2,20 @@
CAD.formats=
CAD.pinconfig=
CAD.provider=
DAC.DAC_Trigger=DAC_TRIGGER_T6_TRGO
DAC.IPParameters=DAC_Trigger
Dma.DAC1.0.Direction=DMA_MEMORY_TO_PERIPH
Dma.DAC1.0.FIFOMode=DMA_FIFOMODE_DISABLE
Dma.DAC1.0.Instance=DMA1_Stream5
Dma.DAC1.0.MemDataAlignment=DMA_MDATAALIGN_HALFWORD
Dma.DAC1.0.MemInc=DMA_MINC_ENABLE
Dma.DAC1.0.Mode=DMA_NORMAL
Dma.DAC1.0.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD
Dma.DAC1.0.PeriphInc=DMA_PINC_DISABLE
Dma.DAC1.0.Priority=DMA_PRIORITY_LOW
Dma.DAC1.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode
Dma.Request0=DAC1
Dma.RequestsNb=1
FREERTOS.IPParameters=Tasks01,configENABLE_FPU,configUSE_NEWLIB_REENTRANT
FREERTOS.Tasks01=defaultTask,24,128,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL
FREERTOS.configENABLE_FPU=1
@ -12,20 +26,23 @@ KeepUserPlacement=false
Mcu.CPN=STM32F407VGT6
Mcu.Family=STM32F4
Mcu.IP0=DAC
Mcu.IP1=FREERTOS
Mcu.IP2=NVIC
Mcu.IP3=RCC
Mcu.IP4=TIM2
Mcu.IP5=USB_DEVICE
Mcu.IP6=USB_OTG_FS
Mcu.IPNb=7
Mcu.IP1=DMA
Mcu.IP2=FREERTOS
Mcu.IP3=NVIC
Mcu.IP4=RCC
Mcu.IP5=TIM2
Mcu.IP6=TIM6
Mcu.IP7=USB_DEVICE
Mcu.IP8=USB_OTG_FS
Mcu.IPNb=9
Mcu.Name=STM32F407V(E-G)Tx
Mcu.Package=LQFP100
Mcu.Pin0=PC14-OSC32_IN
Mcu.Pin1=PC15-OSC32_OUT
Mcu.Pin10=VP_FREERTOS_VS_CMSIS_V2
Mcu.Pin11=VP_TIM2_VS_ClockSourceINT
Mcu.Pin12=VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS
Mcu.Pin12=VP_TIM6_VS_ClockSourceINT
Mcu.Pin13=VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS
Mcu.Pin2=PH0-OSC_IN
Mcu.Pin3=PH1-OSC_OUT
Mcu.Pin4=PA0-WKUP
@ -34,13 +51,14 @@ Mcu.Pin6=PA5
Mcu.Pin7=PD12
Mcu.Pin8=PA11
Mcu.Pin9=PA12
Mcu.PinsNb=13
Mcu.PinsNb=14
Mcu.ThirdPartyNb=0
Mcu.UserConstants=
Mcu.UserName=STM32F407VGTx
MxCube.Version=6.8.1
MxDb.Version=DB.6.0.81
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
NVIC.DMA1_Stream5_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
NVIC.EXTI0_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true
NVIC.ForceEnableDMAVector=true
@ -108,7 +126,7 @@ ProjectManager.StackSize=0x400
ProjectManager.TargetToolchain=STM32CubeIDE
ProjectManager.ToolChainLocation=
ProjectManager.UnderRoot=true
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_USB_DEVICE_Init-USB_DEVICE-false-HAL-false,4-MX_DAC_Init-DAC-false-HAL-true
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_USB_DEVICE_Init-USB_DEVICE-false-HAL-false,5-MX_DAC_Init-DAC-false-HAL-true,6-MX_TIM2_Init-TIM2-false-HAL-true,7-MX_TIM6_Init-TIM6-false-HAL-true
RCC.48MHZClocksFreq_Value=48000000
RCC.AHBFreq_Value=168000000
RCC.APB1CLKDivider=RCC_HCLK_DIV4
@ -147,6 +165,9 @@ SH.COMP_DAC2_group.0=DAC_OUT2,DAC_OUT2
SH.COMP_DAC2_group.ConfNb=1
SH.GPXTI0.0=GPIO_EXTI0
SH.GPXTI0.ConfNb=1
TIM6.IPParameters=TIM_MasterOutputTrigger,Period
TIM6.Period=600
TIM6.TIM_MasterOutputTrigger=TIM_TRGO_UPDATE
USB_DEVICE.CLASS_NAME_FS=CDC
USB_DEVICE.IPParameters=VirtualMode-CDC_FS,VirtualModeFS,CLASS_NAME_FS,PRODUCT_STRING_CDC_FS,MANUFACTURER_STRING-CDC_FS
USB_DEVICE.MANUFACTURER_STRING-CDC_FS=Heck
@ -159,6 +180,8 @@ VP_FREERTOS_VS_CMSIS_V2.Mode=CMSIS_V2
VP_FREERTOS_VS_CMSIS_V2.Signal=FREERTOS_VS_CMSIS_V2
VP_TIM2_VS_ClockSourceINT.Mode=Internal
VP_TIM2_VS_ClockSourceINT.Signal=TIM2_VS_ClockSourceINT
VP_TIM6_VS_ClockSourceINT.Mode=Enable_Timer
VP_TIM6_VS_ClockSourceINT.Signal=TIM6_VS_ClockSourceINT
VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS.Mode=CDC_FS
VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS.Signal=USB_DEVICE_VS_USB_DEVICE_CDC_FS
board=custom

Loading…
Cancel
Save