参照安富莱的H743的DAC.c和.h程序,结合野火103的DAC的,main程序,写了一个STM32H753II的DAC,TIM6触发DMA双通道采集100KHZ的程序,示波器采不到波形是什么情况呢,能改成安富莱的我都改了。包括堆栈和一些设置。怎么办才能采集到波形
DAC.C文件
#if defined ( __ICCARM__ )
#pragma location = ".RAM_D3"
ALIGN_32BYTES(uint16_t g_usWaveBuff[64]);
#elif defined ( __CC_ARM )
ALIGN_32BYTES(__attribute__((section (".RAM_D3"))) uint16_t g_usWaveBuff[64]);
#endif
static TIM_HandleTypeDef htim;
static DAC_HandleTypeDef DacHandle;
static DAC_ChannelConfTypeDef sConfig;
static DMA_HandleTypeDef hdma_dac1;
static DMA_HandleTypeDef hdma_dac2;
/**
* @brief 使能DAC的时钟,初始化GPIO
* @param 无
* @retval 无
*/
static void DAC_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
//使能时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_DAC12_CLK_ENABLE();
__HAL_RCC_DMA1_CLK_ENABLE();
//DAC的GPIO配置,模拟输入
GPIO_InitStruct.Pin = GPIO_PIN_4;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
//初始化DAC外设
DacHandle.Instance = DAC1;
HAL_DAC_DeInit(&DacHandle);
HAL_DAC_Init(&DacHandle);
//配置DAC 通道
sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE; //关闭采样保持模式,这个模式主要用于低功耗
sConfig.DAC_Trigger = DAC_TRIGGER_T6_TRGO; //采用定时器6触发
sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE; //使能输出缓冲
sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_DISABLE; //不将DAC连接到片上外设
sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY; //使用出厂校准
HAL_DAC_ConfigChannel(&DacHandle, &sConfig, DAC_CHANNEL_1);
HAL_DAC_ConfigChannel(&DacHandle, &sConfig, DAC_CHANNEL_2);
//配置DMA1
hdma_dac1.Instance = DMA1_Stream0; //使用的DAM1 Stream0
hdma_dac1.Init.Request = DMA_REQUEST_DAC1; //DAC触发DMA传输
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_HALFWORD; //外设数据以半字为单位
hdma_dac1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; //内存数据以半字为单位
hdma_dac1.Init.Mode = DMA_CIRCULAR; //循环模式
hdma_dac1.Init.Priority = DMA_PRIORITY_HIGH; //高DMA通道优先级
HAL_DMA_Init(&hdma_dac1);
__HAL_LINKDMA(&DacHandle, DMA_Handle1, hdma_dac1);
HAL_DAC_Start_DMA(&DacHandle, DAC_CHANNEL_1, (uint32_t *)g_usWaveBuff, 64, DAC_ALIGN_12B_R);
//配置DMA2
hdma_dac2.Instance = DMA1_Stream1; //使用的DAM1 Stream0
hdma_dac2.Init.Request = DMA_REQUEST_DAC2; //DAC触发DMA传输
hdma_dac2.Init.Direction = DMA_MEMORY_TO_PERIPH; //数据传输方向内存至外设
hdma_dac2.Init.PeriphInc = DMA_PINC_DISABLE; //外设数据地址固定
hdma_dac2.Init.MemInc = DMA_MINC_ENABLE; //内存数据地址自增
hdma_dac2.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; //外设数据以半字为单位
hdma_dac2.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; //内存数据以半字为单位
hdma_dac2.Init.Mode = DMA_CIRCULAR; //循环模式
hdma_dac2.Init.Priority = DMA_PRIORITY_HIGH; //高DMA通道优先级
HAL_DMA_Init(&hdma_dac2);
__HAL_LINKDMA(&DacHandle, DMA_Handle1, hdma_dac2);
HAL_DAC_Start_DMA(&DacHandle, DAC_CHANNEL_2, (uint32_t *)g_usWaveBuff, 64, DAC_ALIGN_12B_R);
}
/**
* @brief TIM6 Configuration
* @note TIM6 configuration is based on APB1 frequency
* @note TIM6 Update event occurs each TIM6CLK/256
* @param None
* @retval None
*/
void DAC_TIM_Config(void)
{
/*-----------------------------------------------------------------------
void SystemClock_Config(void) 函数对时钟的配置如下:
System Clock source = PLL (HSE)
SYSCLK(Hz) = 400000000 (CPU Clock)
HCLK(Hz) = 200000000 (AXI and AHBs Clock)
AHB Prescaler = 2
D1 APB3 Prescaler = 2 (APB3 Clock 100MHz)
D2 APB1 Prescaler = 2 (APB1 Clock 100MHz)
D2 APB2 Prescaler = 2 (APB2 Clock 100MHz)
D3 APB4 Prescaler = 2 (APB4 Clock 100MHz)
因为APB1 prescaler != 1, 所以 APB1上的TIMxCLK = APB1 x 2 = 200MHz;
因为APB2 prescaler != 1, 所以 APB2上的TIMxCLK = APB2 x 2 = 200MHz;
APB4上面的TIMxCLK没有分频,所以就是100MHz;
APB1 定时器有 TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM7, TIM12, TIM13, TIM14,LPTIM1
APB2 定时器有 TIM1, TIM8 , TIM15, TIM16,TIM17
APB4 定时器有 LPTIM2,LPTIM3,LPTIM4,LPTIM5
TIM6 更新周期是 = TIM6CLK / (Period + 1)/(Prescaler + 1)
根据如下的配置,更新周期是:
TIM6CLK /(Period + 1)/(Prescaler + 1)
= 200MHz /(30+1)/(0+1)
≈ 6.45MHz
----------------------------------------------------------------------- */
TIM_MasterConfigTypeDef sMasterConfig;
__HAL_RCC_TIM6_CLK_ENABLE();
//TIM6基本定时器配置
htim.Instance = TIM6;
htim.Init.Period = 30; //定时周期
htim.Init.Prescaler = 0; //预分频,不分频 400M / (0+1) = 400M
htim.Init.ClockDivision = 0; //时钟分频系数
htim.Init.CounterMode = TIM_COUNTERMODE_UP; //向上计数模式
htim.Init.RepetitionCounter = 0;
HAL_TIM_Base_Init(&htim);
//TIM6 TRGO selection
sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&htim, &sMasterConfig);
//使能TIM
HAL_TIM_Base_Start(&htim);
}
/**
* @brief DAC初始化函数
* @param 无
* @retval 无
*/
void DAC_Mode_Init(void)
{
uint8_t i;
//一个周期的方波
for(i =0; i < 32; i++)
{
g_usWaveBuff[i] = 0;
}
for(i =0; i < 32; i++)
{
g_usWaveBuff[i+32] = 4095;
}
DAC_Config();
DAC_TIM_Config();
}
main.c文件
int main(void)
{
MPU_Config(); //配置MPU
CPU_CACHE_Enable(); //使能L1 Cache
HAL_Init();
SystemClock_Config(); //系统时钟初始化成400MHz
LED_GPIO_Config();
UARTx_Config(); //配置串口1为:115200 8-N-1
DAC_Mode_Init();
while(1)
{
}
}