STM32F4 DAM学习笔记

1:定义一个DMA_HandleTypeDef句柄
DMA_HandleTypeDef dma2_adc1_handle;
2:初始化DMA
static void fAdc1_DMA_Init(void)
{
__HAL_RCC_DMA2_CLK_ENABLE(); //便能DMA2时钟
dma2_adc1_handle.Instance=DMA2_Stream0; //选择数据流0
dma2_adc1_handle.Init.Channel=DMA_CHANNEL_0; //选择通道0
dma2_adc1_handle.Init.Direction=DMA_PERIPH_TO_MEMORY; //传输方向 由外设到存储器
dma2_adc1_handle.Init.FIFOMode=DMA_FIFOMODE_DISABLE; //FIFO模式便能
dma2_adc1_handle.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_HALFFULL ; //FIFO阈值
dma2_adc1_handle.Init.MemBurst=DMA_MBURST_SINGLE; //存储器突发模式
dma2_adc1_handle.Init.MemDataAlignment=DMA_MDATAALIGN_HALFWORD; //半字传输
dma2_adc1_handle.Init.MemInc=DMA_MINC_ENABLE; //存储器地址增量模式
dma2_adc1_handle.Init.Mode=DMA_NORMAL; //正常模式
dma2_adc1_handle.Init.PeriphBurst= DMA_PBURST_SINGLE; //外设突发模式
dma2_adc1_handle.Init.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD; //半字传输
dma2_adc1_handle.Init.PeriphInc=DMA_PINC_DISABLE; //禁上外设地址增量
dma2_adc1_handle.Init.Priority=DMA_PRIORITY_HIGH; //DMA优先级
HAL_DMA_Init(&dma2_adc1_handle); //配置DM
__HAL_LINKDMA(&hadc1,DMA_Handle,dma2_adc1_handle); //将DMA与ADC1联系起来
/##-4- Configure the NVIC for DMA #########################################/
/* NVIC configuration for DMA transfer complete interrupt /
HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 1, 0); //设置数据流中断优先级
HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn); //使能DMA数据流中断
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef
hadc) //传输完成回调函数
{
static __IO uint8_t i;
static __IO uint32_t temp1;

if(hadc->Instance ==ADC1)
{
  temp1=0;
for(i=0;i<10;i++)
 {	
		 temp1=temp1+adc_data[i];
	 }
 temp1=temp1/10;

// printf(“temp=%d\r\n”,temp1);
printf(“MCU Temperature :%.2f度\r\n”,(temp1*(3.3/4096)-0.76)/0.0025+25);//打印内部温度值
}
}

void DMA2_Stream0_IRQHandler(void) //DMA中断处理函数,在这里面会回调HAL_ADC_ConvCpltCallback函数
{
HAL_DMA_IRQHandler(hadc1.DMA_Handle);
// printf(“in dma stream0_handler\r\n”);
}

/* ADC1 init function */
static void MX_ADC1_Init(void)
{

ADC_ChannelConfTypeDef sConfig;

/**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) 
*/

hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.ScanConvMode = DISABLE; //扫描模式
hadc1.Init.ContinuousConvMode = ENABLE; //连续转换模式
hadc1.Init.DiscontinuousConvMode = DISABLE; //常规通道不连续
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
hadc1.Init.DMAContinuousRequests = ENABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}

/**Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. 
*/

sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_84CYCLES;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
fAdc1_DMA_Init();
}

以下在MAIN函数中实现对ADC初始化,在ADC初始化函数里又初始化DMA
int main(void)
{

HAL_Init();

SystemClock_Config();

MX_ADC1_Init();

Start_Soft_TMR(0,1000,TMR_AUTO_MODE);

while (1)
{
if(HAL_ADC_Start_DMA(&hadc1,(uint32_t *)adc_data,10)!=HAL_OK) //启动一次DMA传输
{
printf(“adc_Start error!\r\n”);
}
delay_ms(1000);
}

}

记要:

1:初始化ADC
2:初始化DAM
3: __HAL_LINKDMA 将ADC与DMA进行关联 非常重要
4:在MAIN函数里开始一次DAM传输
5:当传输完成时会产生DMA中断后进入 DMA2_Stream0_IRQHandler中断服务函数
由于前面将在中断服务函数回调了void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) //传输完成回调函数
6:如上述5步完成了整个DMA传输过程

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32CubeMX是STMicroelectronics提供的一款图形化配置工具,可以帮助快速生成STM32微控制器的初始化代码和配置文件。使用STM32CubeMX可以简化STM32开发过程,并且提供了丰富的外设支持。 在使用STM32CubeMX时,我们可以通过图形界面配置各种外设,包括但不限于GPIO、UART、SPI、I2C等。配置完成后,STM32CubeMX会生成相应的初始化代码和配置文件,可以直接导入到开发环境中进行应用开发。 关于STM32CubeMX与外设的使用,以下是一些常见问题的回答: 1. 如何在STM32CubeMX中配置GPIO外设? 在STM32CubeMX的Pinout & Configuration选项卡中,选择相应的引脚,可以配置其功能、速度、上拉下拉等属性。 2. 如何在STM32CubeMX中配置UART外设? 在STM32CubeMX的Pinout & Configuration选项卡中,选择相应的引脚,将其设置为UART功能。然后在Configuration选项卡中,配置UART的波特率、数据位、停止位、校验位等参数。 3. 如何在STM32CubeMX中配置SPI外设? 在STM32CubeMX的Pinout & Configuration选项卡中,选择相应的引脚,将其设置为SPI功能。然后在Configuration选项卡中,配置SPI的工作模式、数据大小、时钟极性等参数。 4. 如何在STM32CubeMX中配置I2C外设? 在STM32CubeMX的Pinout & Configuration选项卡中,选择相应的引脚,将其设置为I2C功能。然后在Configuration选项卡中,配置I2C的速率、地址模式、ACK模式等参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值