学习安富莱的H743的定时器触发ADC DMA传输源码
/*
*********************************************************************************************************
*
* 模块名称 : ADC驱动
* 文件名称 : bsp_adc.c
* 版 本 : V1.0
* 说 明 : ADC定时器触发+DMA双缓冲的实现
* 1. 例子默认用的AHB时钟供ADC使用,大家可以通过bsp_adc.c文件开头宏定义切换到PLL2专用时钟。
* 2、使用的TIM1的OC1作为ADC的外部触发源,触发速度是100KHz,即ADC的采样率也是100KHz。
* 3、使用DMA的半传输完成中断和传输完成中断实现数据的双缓冲更新。
* 4、采集引脚使用的PC0,另外特别注意开发板上的Vref稳压基准跳线帽短接的3.3V。
*
* 修改记录 :
* 版本号 日期 作者 说明
* V1.0 2018-12-12 armfly 正式发布
*
* Copyright (C), 2018-2030, 安富莱电子 www.armfly.com
*
*********************************************************************************************************
*/
#include "bsp.h"
/* 选择ADC的时钟源 */
#define ADC_CLOCK_SOURCE_AHB /* 选择AHB时钟源 */
//#define ADC_CLOCK_SOURCE_PLL /* 选择PLL时钟源 */
/* 方便Cache类的API操作,做32字节对齐 */
#if defined ( __ICCARM__ )
#pragma location = 0x38000000
uint16_t ADCxValues[128];
#elif defined ( __CC_ARM )
ALIGN_32BYTES(__attribute__((section (".RAM_D3"))) uint16_t ADCxValues[128]);
#endif
__IO uint8_t s_DmaFlag = 0; /* 1表示进DMA半传输完成中断,2表示进入DMA传输完成中断 */
DMA_HandleTypeDef DmaHandle = {
0};
/*
*********************************************************************************************************
* 函 数 名: TIM1_Config
* 功能说明: 配置TIM1,用于触发ADC,当前配置的100KHz触发频率
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
static void TIM1_Config(void)
{
TIM_HandleTypeDef htim ={
0};
TIM_OC_InitTypeDef sConfig = {
0};
/* 使能时钟 */
__HAL_RCC_TIM1_CLK_ENABLE();
/*-----------------------------------------------------------------------
bsp.c 文件中 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
TIM12CLK = 200MHz/(Period + 1) / (Prescaler + 1) = 200MHz / 2000 / 1 = 100KHz
----------------------------------------------------------------------- */
HAL_TIM_Base_DeInit(&htim);
htim.Instance = TIM1;
htim.Init.Period = 1999;
htim.Init.Prescaler = 0;
htim.Init.ClockDivision = 0;
htim.Init.CounterMode = TIM_COUNTERMODE_UP;
htim.Init.RepetitionCounter = 0;
HAL_TIM_Base_Init(&htim);
sConfig.OCMode = TIM_OCMODE_PWM1;
sConfig.OCPolarity = TIM_OCPOLARITY_LOW;
/* 占空比50% */
sConfig.Pulse = 1000;
if(HAL_TIM_OC_ConfigChannel(&htim, &sConfig, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler<