精华内容
下载资源
问答
  • STM32L0系列例程.zip

    2020-04-24 11:57:16
    STM32L0系列官方例程库,包含了所有外设的例程 包含有Freertos操作系统,方便二次开发移植。。 该例程库支持以下型号 STM32L053xx,STM32L052xx,STM32L051xx and STM32L063xx,STM32L062xx,STM32L061xx STM32L073xx,...
  • STM32L0系列驱动库文件

    2021-01-02 13:51:26
    STM32L0系列驱动库文件,STM32开发设计
  • STM32L0系列Keil Pack包

    2020-12-21 09:58:30
    STM32L0系列Keil Pack包,最新可用,亲测。
  • STM32L0系列DAC输出

    2019-01-26 16:22:32
    这是本人自己写的一个STM32L0系列的DAC输出电压程序,分享给大家参考,使用的HAL库
  • STM32L0系列编程手册

    2018-08-15 08:26:15
    STM32L0系列编程手册,文档很详细,有相应的寄存器介绍和使用方式,英文版
  • STM32L0系列-dataSheet.zip

    2020-07-18 09:45:45
    STM32L0系列中文参考手册与STM32L051C8T6英文手册,对应博客“基于STM32HAL库ADC+DMA模式,高精度采集电池电量与芯片内部温度方法 (48脚 使用内部参考电压方案)”
  • STM32L0系列数据手册中文翻译版分享赚积分.
  • STM32L0系列产品简介

    2015-02-13 13:10:59
    STM32L0系列单片机简介,该系列单片机使用了最新的ARM Cortex M0+ 内核,集成了低功耗串口和低功耗定时器。很适合做低功耗和电池应用。
  • STM32L0系列.zip

    2020-07-21 14:24:27
    STM32L051系列资料,包括L0中文参考手册。英文参考手册和L051C8T6数据手册
  • STM32L0系列之ADC采集

    千次阅读 2019-06-11 13:27:32
    STM32L0系列之ADC采集 前言 使用芯片:STM32L051C8T6 软件平台:KEIL V5、STM32CubeL0 库函数:HAL 一、原理图 本文介绍在STM32上使用ADC1的第1通道,对电池电量进行采集。 二、ADC通道与引脚对应关系 ...

    STM32L0开发系列——01 ADC采集

    前言

    使用芯片:STM32L051C8T6
    软件平台:KEIL V5、STM32CubeL0
    库函数:HAL

    一、原理图

    本文介绍在STM32上使用ADC1的第1通道,对电池电量进行采集。
    在这里插入图片描述

    二、ADC通道与引脚对应关系

    通道 引脚
    PA0 ADC_IN0
    PA1 ADC_IN1
    PA2 ADC_IN2
    PA3 ADC_IN3
    PA4 ADC_IN4
    PA5 ADC_IN5
    PA6 ADC_IN6
    PA7 ADC_IN7
    PB0 ADC_IN8
    PB1 ADC_IN9
    PC0 ADC_IN10
    PC1 ADC_IN11
    PC2 ADC_IN12
    PC3 ADC_IN13
    PC4 ADC_IN14
    PC5 ADC_IN15
    PC5 ADC_IN15
    PC5 ADC_IN15
    内部温度传感器 (VSENSE) ADC_IN16
    内部参考电压 (VREFINT) ADC_IN17
    监视外部 VLCD 电源针脚 ADC_IN18

    三、ADC相关

    1、 ADC 可由 APB 时钟或 HSI16 时钟提供。
    2、 ADC 转换时间: 12 位分辨率对应的转换时间为 0.87 µs (1.14 MHz), 10 位分辨率
    对应的转换时间为 0.81 µs,若降低分辨率,可进一步缩短转换时间。

    四、实验步骤

    1、系统时钟配置

    //******************************************************************************            
    //name:             SystemClock_Config           
    //introduce:       	系统时钟配置        
    //parameter:        none  
    //return:           none         
                     
    //changetime:       2019.05.21                      
    //******************************************************************************
    void SystemClock_Config(void)
    {
    
      RCC_ClkInitTypeDef RCC_ClkInitStruct;
      RCC_PeriphCLKInitTypeDef PeriphClkInit;
      RCC_OscInitTypeDef RCC_OscInitStruct;
    
      __PWR_CLK_ENABLE();
    
      __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
    
      RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE;
    
    	RCC_OscInitStruct.HSEState = RCC_HSE_ON;
      RCC_OscInitStruct.HSIState = RCC_HSI_ON; //ADC的时钟源
      RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
      RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
      RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_8;
      RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2;
      HAL_RCC_OscConfig(&RCC_OscInitStruct);
    
      RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                                  |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
      RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
      RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
      RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
      RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
      HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);
    
      PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
      PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
      HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
    
      __SYSCFG_CLK_ENABLE();
    
    }
    

    注意:一开始程序中没有配置HSI时钟,采集不到电压

    2、ADC文件

    
    #include "main.h"
    
    ADC_HandleTypeDef hadc;
    GPIO_InitTypeDef GPIO_InitStruct;
    ADC_ChannelConfTypeDef sConfig;
    
    
    //******************************************************************************            
    //name:             ADC_Init           
    //introduce:       	ADC初始化       
    //parameter:        none  
    //return:           none         
                     
    //changetime:       2019.05.21                      
    //******************************************************************************
    void ADC_Init(void)
    {
    	uint32_t Calibration=0;
    	
    	__HAL_RCC_ADC1_CLK_ENABLE();
    	__HAL_RCC_GPIOB_CLK_ENABLE();
    	
    	GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
    	GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    	GPIO_InitStruct.Pull = GPIO_NOPULL;
    	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    	
    	hadc.Instance = ADC1;
      hadc.Init.OversamplingMode = DISABLE;
      hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2;
      hadc.Init.Resolution = ADC_RESOLUTION_12B;
      hadc.Init.SamplingTime = ADC_SAMPLETIME_79CYCLES_5;
      hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
      hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
      hadc.Init.ContinuousConvMode = DISABLE;
      hadc.Init.DiscontinuousConvMode = DISABLE;
      hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
      hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
      hadc.Init.DMAContinuousRequests = DISABLE;
      hadc.Init.EOCSelection = ADC_EOC_SEQ_CONV;
      hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED;
      hadc.Init.LowPowerAutoWait = DISABLE;
      hadc.Init.LowPowerFrequencyMode = DISABLE;
      hadc.Init.LowPowerAutoPowerOff = DISABLE;
      HAL_ADC_Init(&hadc) ;
    	
    	//启动ADC校验功能
    	HAL_ADCEx_Calibration_Start(&hadc,ADC_SINGLE_ENDED);
    	//获取校验值
    	Calibration = HAL_ADC_GetValue(&hadc);
    	
    	// 清除之前通道
    	sConfig.Channel = ADC_CHANNEL_1|ADC_CHANNEL_2|ADC_CHANNEL_3;
      	sConfig.Rank = ADC_RANK_NONE;	// 清除通道属性
    	HAL_ADC_ConfigChannel(&hadc, &sConfig);
      
    }
    
    //******************************************************************************            
    //name:             GET_ADC           
    //introduce:       	单通道采集ADC的值       
    //parameter:        CH:ADC采集通道 
    //return:           ADC采集值         
                     
    //changetime:       2019.05.21                      
    //******************************************************************************
    uint32_t GET_ADC(uint32_t CH)
    {
    	uint32_t adc_conv_var;
    	sConfig.Channel = CH;
    	sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;	// 设置通道
    	HAL_ADC_ConfigChannel(&hadc, &sConfig);
    
    	// 启动转换
    	HAL_ADC_Start(&hadc);
    	
    	// 等待转换结束
    	HAL_ADC_PollForConversion(&hadc,20);// 超时20ms
    	
    	// 读取结果
    	adc_conv_var = HAL_ADC_GetValue(&hadc);
    	
    	// 清除通道
    	sConfig.Rank = ADC_RANK_NONE;	// 清除通道
    	HAL_ADC_ConfigChannel(&hadc, &sConfig);
    	
    	return adc_conv_var;
    }
    
    //******************************************************************************            
    //name:             Get_Adc_Average          
    //introduce:       	多次采集求平均值       
    //parameter:        CH:ADC采集通道 
    //return:           ADC采集值         
                     
    //changetime:       2019.05.21                      
    //******************************************************************************
    
    void Get_Adc_Average(uint32_t *ch,uint32_t *adcx,uint8_t times)
    {
    	uint32_t temp_val[9]={0};
    	uint8_t t,i;
    	for(t=0;t<times;t++)
    	{
    		for(i=0;i<9;i++)
    		{
    			temp_val[i]+=GET_ADC(ch[i]);
    		  HAL_Delay(5);
    		}
    		
    	}
    	
    	for(i=0;i<9;i++)
    		{
    			adcx[i] = temp_val[i]/times;
    		}
    
    } 	 
    
    

    3、main中测试

    while(1)
    {
    	BATTER_VALUE = GET_ADC(ADC_CHANNEL_1);
    	temp=(float)BATTER_VALUE*(3.3/4096)*2;	
    	printf("temp=%0.2f\r\n",temp);
    			
    	HAL_Delay(100);
    }
    
    

    四、实验结果

    在这里插入图片描述
    由于ADC的精度是12bit(4096)、参考电压为3.3V,因此实际读出的电量值为BATTER_VALUE3.3/40962.

    试验成功

    展开全文
  • 上一章:STM32L0系列之【EEPROM读写】 下一章:STM32L0系列之【串口收发】

    上一章:STM32L0系列之【EEPROM读写】


    频率2.097Mhz , TIM2定时1s触发一次中断

    1.TIM2初始化

    HAL_TIM_Base_Init>HAL_TIM_ConfigClockSource>HAL_TIMEx_MasterConfigSynchronization

    /**
      * @brief TIM2 Initialization Function
      * @param None
      * @retval None
      */
    TIM_HandleTypeDef htim2;
    void MX_TIM2_Init(uint16_t time)
    {
      TIM_ClockConfigTypeDef sClockSourceConfig = {0};
      TIM_MasterConfigTypeDef sMasterConfig = {0};
      
      htim2.Instance = TIM2;
      htim2.Init.Prescaler = 2000;
      htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
      htim2.Init.Period = time - 1;
      htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
      htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
      if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
      {
        Error_Handler();
      }
      sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
      if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
      {
        Error_Handler();
      }
      sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
      sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
      if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
      {
        Error_Handler();
      }
    }
    

    2.TIM2 中断处理函数

    /**
      * @brief This function handles TIM2 global interrupt.
      */
    void TIM2_IRQHandler(void)
    {
      HAL_TIM_IRQHandler(&htim2);
    }
    

    3.主函数main

    int main(void)
    {
    	 HAL_Init();
        /* Configure the system clock */
        SystemClock_Config();
        LED_Init();//LED初始化
    	MX_TIM2_Init(1001); //1s一次
    	HAL_TIM_Base_Stop_IT(&htim2);
    	HAL_TIM_Base_Start_IT(&htim2);
    
    	while(1)
    	{}
    }
    

    4.TIM中断回调处理函数

    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
        if(htim == &htim2)
        {
        	HAL_GPIO_TogglePin(GPIOB,GPIO_PIN8);
        }
    }
    

    下一章:STM32L0系列之【串口收发】

    展开全文
  • STM32L0系列之【LPTIM定时器】

    千次阅读 2019-11-27 13:57:27
    上一章:STM32L0系列之【串口收发】

    上一章:STM32L0系列之【串口收发】

    1.LPTIM介绍

    STM32L0系列有个LPTIM定时器,即lowpowertimer,低功耗定时器
    在这里插入图片描述
    可以看到可供LPTIM使用时钟源分为如下:
    内部时钟源:LSE,LSI,HSI或APB时钟
    外部时钟源:LPTIM输入的外部时钟源
    ps:如果以LSE,LSI或外部时钟为时钟源时,能够从停止模式唤醒设备

    本文记录使用LSI为时钟源使用LPTIM

    2.配置时钟源并且启动

    /**
      * @brief System Clock Configuration
      * @retval None
      */
    void SystemClock_Config(void)
    {
      RCC_OscInitTypeDef RCC_OscInitStruct = {0};
      RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
      RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
    
      /** Configure the main internal regulator output voltage 
      */
      __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
      /** Initializes the CPU, AHB and APB busses clocks 
      */
      RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_MSI;
      RCC_OscInitStruct.LSIState = RCC_LSI_ON;
      RCC_OscInitStruct.MSIState = RCC_MSI_ON;
      RCC_OscInitStruct.MSICalibrationValue = 0;
      RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6;
      RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
      if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
      {
        Error_Handler();
      }
      /** Initializes the CPU, AHB and APB busses clocks 
      */
      RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                                  |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
      RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
      RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
      RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
      RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
    
      if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
      {
        Error_Handler();
      }
    
        PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_LPTIM1;
        PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
        PeriphClkInit.LptimClockSelection = RCC_LPTIM1CLKSOURCE_LSI;
    
        if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
        {
        Error_Handler();
        }
    }
    

    以上是完整的时钟配置函数,使用LPTIM最主要的配置由如下构成:

    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI;
    RCC_OscInitStruct.LSIState = RCC_LSI_ON;
    HAL_RCC_OscConfig(&RCC_OscInitStruct);
    
    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_LPTIM1;
    PeriphClkInit.LptimClockSelection = RCC_LPTIM1CLKSOURCE_LSI;
    HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
    

    3.初始化配置LPTIM

    /**
      * @brief LPTIM1 Initialization Function
      * @param None
      * @retval None
      */
    void MX_LPTIM1_Init(void)  //0.037Mhz  (1+period / 0.037(37000)) = 1s period=36999
    {
      hlptim1.Instance = LPTIM1;
      hlptim1.Init.Clock.Source = LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC;
      hlptim1.Init.Clock.Prescaler = LPTIM_PRESCALER_DIV1;
      hlptim1.Init.Trigger.Source = LPTIM_TRIGSOURCE_SOFTWARE;
      hlptim1.Init.OutputPolarity = LPTIM_OUTPUTPOLARITY_HIGH;
      hlptim1.Init.UpdateMode = LPTIM_UPDATE_IMMEDIATE;
      hlptim1.Init.CounterSource = LPTIM_COUNTERSOURCE_INTERNAL;
      if (HAL_LPTIM_Init(&hlptim1) != HAL_OK)
      {
        Error_Handler();
      }
    }
    

    4.LPTIM中断处理函数

    void LPTIM1_IRQHandler(void)
    {
      HAL_LPTIM_IRQHandler(&hlptim1);
    }
    

    5.启用LPTIM,中断触发回调函数

    启用LPTIM分为多种方式:如脉冲,PWM,计数等。
    具体可参考HAL_LPTIM_IRQHandler函数的实现。

    /**
      * @brief  Handle LPTIM interrupt request.
      * @param  hlptim LPTIM handle
      * @retval None
      */
    void HAL_LPTIM_IRQHandler(LPTIM_HandleTypeDef *hlptim)
    {
      /* Compare match interrupt */
      if (__HAL_LPTIM_GET_FLAG(hlptim, LPTIM_FLAG_CMPM) != RESET)
      {
        if (__HAL_LPTIM_GET_IT_SOURCE(hlptim, LPTIM_IT_CMPM) != RESET)
        {
          /* Clear Compare match flag */
          __HAL_LPTIM_CLEAR_FLAG(hlptim, LPTIM_FLAG_CMPM);
    
          /* Compare match Callback */
    #if (USE_HAL_LPTIM_REGISTER_CALLBACKS == 1)
          hlptim->CompareMatchCallback(hlptim);
    #else
          HAL_LPTIM_CompareMatchCallback(hlptim);
    #endif /* USE_HAL_LPTIM_REGISTER_CALLBACKS */
        }
      }
    
      /* Autoreload match interrupt */
      if (__HAL_LPTIM_GET_FLAG(hlptim, LPTIM_FLAG_ARRM) != RESET)
      {
        if (__HAL_LPTIM_GET_IT_SOURCE(hlptim, LPTIM_IT_ARRM) != RESET)
        {
          /* Clear Autoreload match flag */
          __HAL_LPTIM_CLEAR_FLAG(hlptim, LPTIM_FLAG_ARRM);
    
          /* Autoreload match Callback */
    #if (USE_HAL_LPTIM_REGISTER_CALLBACKS == 1)
          hlptim->AutoReloadMatchCallback(hlptim);
    #else
          HAL_LPTIM_AutoReloadMatchCallback(hlptim);
    #endif /* USE_HAL_LPTIM_REGISTER_CALLBACKS */
        }
      }
    
      /* Trigger detected interrupt */
      if (__HAL_LPTIM_GET_FLAG(hlptim, LPTIM_FLAG_EXTTRIG) != RESET)
      {
        if (__HAL_LPTIM_GET_IT_SOURCE(hlptim, LPTIM_IT_EXTTRIG) != RESET)
        {
          /* Clear Trigger detected flag */
          __HAL_LPTIM_CLEAR_FLAG(hlptim, LPTIM_FLAG_EXTTRIG);
    
          /* Trigger detected callback */
    #if (USE_HAL_LPTIM_REGISTER_CALLBACKS == 1)
          hlptim->TriggerCallback(hlptim);
    #else
          HAL_LPTIM_TriggerCallback(hlptim);
    #endif /* USE_HAL_LPTIM_REGISTER_CALLBACKS */
        }
      }
    
      /* Compare write interrupt */
      if (__HAL_LPTIM_GET_FLAG(hlptim, LPTIM_FLAG_CMPOK) != RESET)
      {
        if (__HAL_LPTIM_GET_IT_SOURCE(hlptim, LPTIM_IT_CMPOK) != RESET)
        {
          /* Clear Compare write flag */
          __HAL_LPTIM_CLEAR_FLAG(hlptim, LPTIM_FLAG_CMPOK);
    
          /* Compare write Callback */
    #if (USE_HAL_LPTIM_REGISTER_CALLBACKS == 1)
          hlptim->CompareWriteCallback(hlptim);
    #else
          HAL_LPTIM_CompareWriteCallback(hlptim);
    #endif /* USE_HAL_LPTIM_REGISTER_CALLBACKS */
        }
      }
    
      /* Autoreload write interrupt */
      if (__HAL_LPTIM_GET_FLAG(hlptim, LPTIM_FLAG_ARROK) != RESET)
      {
        if (__HAL_LPTIM_GET_IT_SOURCE(hlptim, LPTIM_IT_ARROK) != RESET)
        {
          /* Clear Autoreload write flag */
          __HAL_LPTIM_CLEAR_FLAG(hlptim, LPTIM_FLAG_ARROK);
    
          /* Autoreload write Callback */
    #if (USE_HAL_LPTIM_REGISTER_CALLBACKS == 1)
          hlptim->AutoReloadWriteCallback(hlptim);
    #else
          HAL_LPTIM_AutoReloadWriteCallback(hlptim);
    #endif /* USE_HAL_LPTIM_REGISTER_CALLBACKS */
        }
      }
    
      /* Direction counter changed from Down to Up interrupt */
      if (__HAL_LPTIM_GET_FLAG(hlptim, LPTIM_FLAG_UP) != RESET)
      {
        if (__HAL_LPTIM_GET_IT_SOURCE(hlptim, LPTIM_IT_UP) != RESET)
        {
          /* Clear Direction counter changed from Down to Up flag */
          __HAL_LPTIM_CLEAR_FLAG(hlptim, LPTIM_FLAG_UP);
    
          /* Direction counter changed from Down to Up Callback */
    #if (USE_HAL_LPTIM_REGISTER_CALLBACKS == 1)
          hlptim->DirectionUpCallback(hlptim);
    #else
          HAL_LPTIM_DirectionUpCallback(hlptim);
    #endif /* USE_HAL_LPTIM_REGISTER_CALLBACKS */
        }
      }
    
      /* Direction counter changed from Up to Down interrupt */
      if (__HAL_LPTIM_GET_FLAG(hlptim, LPTIM_FLAG_DOWN) != RESET)
      {
        if (__HAL_LPTIM_GET_IT_SOURCE(hlptim, LPTIM_IT_DOWN) != RESET)
        {
          /* Clear Direction counter changed from Up to Down flag */
          __HAL_LPTIM_CLEAR_FLAG(hlptim, LPTIM_FLAG_DOWN);
    
          /* Direction counter changed from Up to Down Callback */
    #if (USE_HAL_LPTIM_REGISTER_CALLBACKS == 1)
          hlptim->DirectionDownCallback(hlptim);
    #else
          HAL_LPTIM_DirectionDownCallback(hlptim);
    #endif /* USE_HAL_LPTIM_REGISTER_CALLBACKS */
        }
      }
    }
    

    这里示例TimeOut的方式回调。
    开启LPTIM定时器需要调用 HAL_LPTIM_TimeOut_Start_IT

    //HAL_LPTIM_TimeOut_Start_IT  <=> HAL_LPTIM_CompareMatchCallback
    void HAL_LPTIM_CompareMatchCallback(LPTIM_HandleTypeDef *hlptim)
    {
        HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
    }
    

    6.main.c 主函数

    int main(void) 
    {
        HAL_Init();
        /* Configure the system clock */
        SystemClock_Config();
        
        MX_LPTIM1_Init();
        //(1+period / 0.037(37000)) = 1s period=36999  1s触发一次
        HAL_LPTIM_TimeOut_Start_IT(&hlptim1,36999,1000);
        while(1){
            HAL_Delay(1000);
        }
    
    

    下一章:

    展开全文
  • STM32L0系列之【串口收发】

    千次阅读 2019-11-25 15:35:40
    上一章:STM32L0系列之【TIM通用定时器】 下一章:

    上一章:STM32L0系列之【TIM通用定时器】

    1.串口1 USART1初始化 [注意使能接收中断]

    /**
      * @brief USART1 Initialization Function
      * @param None
      * @retval None
      */
    UART_HandleTypeDef huart1;
    void MX_USART1_UART_Init(void)
    {
      huart1.Instance = USART1;
      huart1.Init.BaudRate = 115200;
      huart1.Init.WordLength = UART_WORDLENGTH_8B;
      huart1.Init.StopBits = UART_STOPBITS_1;
      huart1.Init.Parity = UART_PARITY_NONE;
      huart1.Init.Mode = UART_MODE_TX_RX;
      huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
      huart1.Init.OverSampling = UART_OVERSAMPLING_16;
      huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
      huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
      if (HAL_UART_Init(&huart1) != HAL_OK)
      {
        Error_Handler();
      }
      //使能接收中断
      HAL_UART_Receive_IT(&huart1,usart1_RxBuf_temp,1);          // Enable the USART1 Interrupt
    }
    

    2.串口接收中断

    /**
      * @brief This function handles USART1 global interrupt / USART1 wake-up interrupt through EXTI line 25.
      */
    void USART1_IRQHandler(void)
    {
      HAL_UART_IRQHandler(&huart1);
    }
    

    3.串口接收中断完成回调函数

    /**
      * @brief  Rx Transfer completed callback
      * @param  UartHandle: UART handle
      * @note   This example shows a simple way to report end of IT Rx transfer, and 
      *         you can add your own implementation.
      * @retval None
      */
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
    {
        if(UartHandle->Instance == USART1)
        {
            Netctrlp_Receive(usart1_RxBuf_temp[0]);
            HAL_UART_Receive_IT(&huart1,usart1_RxBuf_temp,1);      // 重新使能串口1接收中断
        }
    }
    

    4.重定向输入输出,将输出重定向至printf

    uint8_t ch;
    uint8_t ch_r;
    //重写这个函数,重定向printf函数到串口,意思就是说printf直接输出到串口,其默认输出到控制台的
    /*fputc*/
    int fputc(int c, FILE * f)
    {
        ch=c;
    //    HAL_UART_Transmit_IT(&huart1,&ch,1);//发送串口
        HAL_UART_Transmit(&huart1,&ch,1,100);//发送串口
        return ch;
    }
    
    //重定向scanf函数到串口 意思就是说接受串口发过来的数据,其默认是接受控制台的数据
    /*fgetc*/
    int fgetc(FILE * F)    
    {
        HAL_UART_Receive_IT(&huart1,&ch_r,1);//接收
        return ch_r;
    }
    

    5.main.c 主函数

    int main(void) //SLAVE
    {
        HAL_Init();
        /* Configure the system clock */
        SystemClock_Config();
        MX_USART1_UART_Init();
        
     	while(1){
          DBG_print(DBG_DEBUG, " A.");
          HAL_Delay(100);
        }
    }
    

    下一章:STM32L0系列之【LPTIM定时器】

    展开全文
  • stm32l0系列HAL库

    2017-11-17 21:33:28
    这是stm32l0 hal库的串口例程,自己通过cubemx生成配置工程文件,供大家学习交流
  • Keil.STM32L0xx_DFP.1.6.0,Keil.STM32L0xx_DFP.1.6.1,Keil.STM32L0xx_DFP.2.0.0,keil5 STM32L0xx新旧版本芯片支持包
  • 因项目需求 所以选择了STM公司这款低功耗STM32L0系列芯片,之前买了一块学习板自己学习了一下,后来用自己项目的板子进行了调试,会持续更新的~~ 刚开始是自己看官网的例程,学习库知识,后来知道了STM32CubeMX芯片...
  • 基于Cortex M0+的STM32L0系列简介

    千次阅读 2015-02-21 16:54:22
    简单介绍了ST新推出的STM32L0xx系列。介绍其与STM8L,STML1的对比,stm32L0系列三个子系列x1,x2,x3的不同,还有stm32L0芯片的命令规则。
  • STM32L0系列串口重定义的方法 芯片型号:STM32L071RBT6 本篇重点:将printf( ) 函数重定义到USART1 集成开发工具(IDE):IAR #ifdef __GNUC__ /* With GCC/RAISONANCE, small uartPrintf (option LD Linker...
  • 文章目录上一章:[STM32L0系列之【工程开始】](https://blog.csdn.net/qq_23327993/article/details/103233414) 上一章:STM32L0系列之【工程开始】
  • STM32L0系列手册&Demo.zip

    2020-08-17 11:54:01
    STM32L053学习过程中所用的资料,包括中英文参考手册,L051、L053数据手册,L503例程。
  • 文章目录1.前言2.开发工具3.简述开发工具生成的代码结构3.1 main.c简析3.2 代码运行流程以及HAL库的调用结构...趁着这次11月份的新项目的开端需要用到stm32L0系列的单片机,搭载lora模块进行项目开发。这里开个系...
  • 横跨多重电子应用领域、... 作为穿戴式装置、医用监视器、工业传感器、智能生活设备等能源敏感应用的理想微控制器,STM32L0系列拥有同级领先的能效,ULPMarkTM-C认证测试取得135分,配合一个直流转换器,ULPMark-C 成
  • STM32L0系列低功耗产品开发的那些坑

    千次阅读 2019-08-13 08:40:04
    STM32L0系列的芯片提供了一系列的低功耗的外设,比如使用32.768KHz外部晶振,驱动低功耗串口可以采集最高9600波特率的串口,而且在停止和低功耗运行模式下均不丢数据。低功耗的计数器,RTC等外设资源,设备平均功耗...
  • 意法半导体(STMicroelectronics)的超低功耗MCU系列采用低泄漏技术和优化设计,以实现出色的低电流消耗,使其非常适合电池供电和...但是,由于该系列的低功耗模式相同,因此可以使用任何STM32L0器件。 STM32L1系列和S...
  • Ultra Librarian® - Ultra Librarian® 提供了一个基于云的库,该库中有超过 8 百万种符号、封装,以及带有供货商 ECAD 中性数据输出选择的 3D 模型。该库以业内最大的 ECAD 元器件库为后盾,代表了 400 多家制造商...
  • STM32L0系列的ADC用法

    千次阅读 2018-11-16 20:23:03
    下面我介绍下STM32L0系列调用库函数来实现AD转换。  首先最基本的AD转换模式,即单次单通道检测,且不用到DMA。L0系列一共有19个AD口对应19个AD通道,其中16到18为检测内部模拟信号的通道。下面代码中用到是PA0...
  • stm32L0系列学习(一)

    2019-02-22 09:57:00
    stm32L0总体特性,定位: 可见容量是比较少的,功耗很低,adc12位,7种低功耗模式 jlink和sdk的引脚关系图: HAL的库框图 官方给出的HAL库的包含结构: 转载于:...
  • STM32L0xx微控制器具有两个内部RC振荡器,可以选择作为系统 时钟源。这些被称为HSI16(高速内部)和MSI(多速度内部) 振荡器。 HSI16振荡器的典型频率为16 MHz。 MSI振荡器较低 高速,低功耗时钟源。 STM32L0xx微...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 245
精华内容 98
关键字:

stm32l0系列