日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

歷史上的今天

今天是:2025年07月19日(星期六)

2018年07月19日 | stm32CubeMX HAL庫(kù)中延時(shí)的幾種方式解析

發(fā)布者:不懂之人 來源: eefocus關(guān)鍵字:stm32CubeMX  HAL庫(kù)  延時(shí) 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

HAL_Dalay()是毫秒級(jí)延時(shí),為了使用微秒級(jí)延時(shí)最近學(xué)習(xí)了一下,總結(jié)如下,推薦使用最后一種方式。


/*

 * 本文件包括四種延時(shí)方式:

 * 1. 原來的HAL庫(kù)函數(shù)HAL_Delay()    2. 采用定時(shí)器2設(shè)置延時(shí)函數(shù)     3. 采用系統(tǒng)滴答中斷方式的ms和us級(jí)延時(shí)

 * 4. 采用系統(tǒng)滴答非中斷方式的ms和us級(jí)延時(shí)(在一次計(jì)數(shù)值范圍內(nèi)的延時(shí))

 */

 

 

/* Includes ------------------------------------------------------------------*/

#include "stm32l1xx_hal.h"

#include "tim.h"

#include "usart.h"

#include "gpio.h"

 

/* USER CODE BEGIN Includes */

 

/* USER CODE END Includes */

 

/* Private variables ---------------------------------------------------------*/

 

/* USER CODE BEGIN PV */

/* Private variables ---------------------------------------------------------*/

 

volatile unsigned int timenum;      //必須要加volatile?。?!

volatile unsigned long time_delay; // 延時(shí)時(shí)間,注意定義為全局變量

 

/* USER CODE END PV */

 

/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

void Error_Handler(void);

 

/* USER CODE BEGIN PFP */

/* Private function prototypes -----------------------------------------------*/

HAL_StatusTypeDef delay_10us(uint32_t num);

void delay_us(volatile unsigned long nms);

void delay_ms(volatile unsigned long nms);

void delay_ms2(int32_t nms);

 

/* USER CODE END PFP */

 

/* USER CODE BEGIN 0 */

 

int fputc(int ch, FILE *f)  

{  

HAL_UART_Transmit(&huart2 , (uint8_t *)&ch, 1, 0xFFFF);  

return ch;  

}

 

/* USER CODE END 0 */

 

int main(void)

{

 

  /* USER CODE BEGIN 1 */

 

  /* USER CODE END 1 */

 

  /* MCU Configuration----------------------------------------------------------*/

 

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  HAL_Init();

 

  /* Configure the system clock */

  SystemClock_Config();

 

  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_TIM2_Init();

  MX_USART2_UART_Init();

 

  /* USER CODE BEGIN 2 */

 

     

  /*##-1- Start the TIM Base generation in interrupt mode ####################*/

  //HAL_TIM_Base_Start_IT(&htim2);

     

 

printf("Testing timer2\n");

HAL_Delay(1000);

printf("Testing timer2\n");

HAL_Delay(1000);

printf("Testing timer2\n");

HAL_Delay(1000);

printf("Testing timer2\n");

HAL_Delay(1000);

printf("Testing timer2\n");

 

 

  /* USER CODE END 2 */

 

  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

  /* USER CODE END WHILE */

 

  /* USER CODE BEGIN 3 */

//HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);

delay_ms2(500);

printf("12\n");

//HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);

 

//delay_us(500000);

 

  }

  /* USER CODE END 3 */

 

}

 

/** System Clock Configuration

*/

void SystemClock_Config(void)

{

 

  RCC_OscInitTypeDef RCC_OscInitStruct;

  RCC_ClkInitTypeDef RCC_ClkInitStruct;

 

  __HAL_RCC_PWR_CLK_ENABLE();

 

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

 

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;

  RCC_OscInitStruct.HSEState = RCC_HSE_ON;

  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12;

  RCC_OscInitStruct.PLL.PLLDIV = RCC_PLL_DIV3;

  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

  {

    Error_Handler();

  }

 

  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;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)

  {

    Error_Handler();

  }

 

  HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_SYSCLK, RCC_MCODIV_1);

 

  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);  //注意這里HAL庫(kù)重裝了系統(tǒng)計(jì)數(shù)器的值,使美1ms中斷一次?。?/p>

 

  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

 

  /* SysTick_IRQn interrupt configuration */

  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

}

 

/* USER CODE BEGIN 4 */

 

/**

  * @brief  Period elapsed callback in non blocking mode

  * @param  htim: TIM handle

  * @retval None

  */

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//定時(shí)器2中斷處理函數(shù)

{

    if (htim->Instance == htim2.Instance)

    {

HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_8);

if(timenum)

{

timenum--;

//printf("%d\n", timenum);

}

    }

}

 

HAL_StatusTypeDef delay_10us(uint32_t num)//自定義的定時(shí)器2實(shí)現(xiàn)延時(shí)的函數(shù)

{

timenum = num;

HAL_TIM_Base_Start_IT(&htim2);

while(timenum) //為什么一直停在這個(gè)循環(huán)中???3-2-1-2-3……怎么會(huì)這樣?。。?-volatile!

;

HAL_TIM_Base_Stop_IT(&htim2);

return HAL_OK;

}

 

 

 

//SysTick實(shí)現(xiàn)延時(shí)n_ms,中斷方式

void delay_ms(volatile unsigned long nms)

{

    //SYSTICK分頻--1ms的系統(tǒng)時(shí)鐘中斷

    if (SysTick_Config(HAL_RCC_GetHCLKFreq()/1000))

    {

   

        while (1);

    }

    time_delay=nms;//讀取定時(shí)時(shí)間

    while(time_delay);

    SysTick->CTRL=0x00; //關(guān)閉計(jì)數(shù)器

    SysTick->VAL =0X00; //清空計(jì)數(shù)器

}

 

 

//SysTick實(shí)現(xiàn)延時(shí)n_us,中斷方式

void delay_us(volatile unsigned long nus)

{

 //SYSTICK分頻--1us的系統(tǒng)時(shí)鐘中斷

    if (SysTick_Config(HAL_RCC_GetHCLKFreq()/1000000))

    {

   

        while (1);

    }

    time_delay=nus;//讀取定時(shí)時(shí)間

    while(time_delay);

    SysTick->CTRL=0x00; //關(guān)閉計(jì)數(shù)器

    SysTick->VAL =0X00; //清空計(jì)數(shù)器

}

 

//SysTick實(shí)現(xiàn)延時(shí)中斷方式的中斷處理函數(shù)

//在中斷中將time_delay遞減。實(shí)現(xiàn)延時(shí)

//void SysTick_Handler(void)

//{

//    if(time_delay)

//        time_delay--;

//}

 

 

//void HAL_SYSTICK_Callback(void)//原cube HAL庫(kù)中中斷處理回調(diào)函數(shù)重寫

//{

// if(time_delay)

// time_delay--;

//}

 

 

//void HAL_IncTick(void)//原cube HAL庫(kù)中,重寫

//{

// if(time_delay)

// time_delay--;

//}

 

/********************************* 優(yōu)選的方式 ***********************************************************************/

/*一次填充系統(tǒng)計(jì)時(shí)器以實(shí)現(xiàn)非中斷延遲,受限系統(tǒng)計(jì)時(shí)器stmtick只有24位,所以最長(zhǎng)計(jì)時(shí)有所限制*/

void delay_ms2(int32_t nms)

{

 int32_t temp;

 SysTick->LOAD = 8000*nms;

 SysTick->VAL=0X00;//清空計(jì)數(shù)器

 SysTick->CTRL=0X01;//使能,減到零是無動(dòng)作,采用外部時(shí)鐘源

 do

 {

  temp=SysTick->CTRL;//讀取當(dāng)前倒計(jì)數(shù)值

 }while((temp&0x01)&&(!(temp&(1<<16))));//等待時(shí)間到達(dá)

    SysTick->CTRL=0x00; //關(guān)閉計(jì)數(shù)器

    SysTick->VAL =0X00; //清空計(jì)數(shù)器

}

 

/* USER CODE END 4 */

 

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

 

 

/*********************************************************************************************************************/

/*********************************************************************************************************************/

/*********************************************************************************************************************/

 

/*如果自寫系統(tǒng)時(shí)鐘中斷處理函數(shù),需要在stml1xx_it.c中注釋掉一下函數(shù)*/

 

/**

* @brief This function handles System tick timer.

*/

#if 1

void SysTick_Handler(void)

{

  /* USER CODE BEGIN SysTick_IRQn 0 */

 

  /* USER CODE END SysTick_IRQn 0 */

  HAL_IncTick();

  HAL_SYSTICK_IRQHandler();

  /* USER CODE BEGIN SysTick_IRQn 1 */

 

  /* USER CODE END SysTick_IRQn 1 */

}

#endif

 


關(guān)鍵字:stm32CubeMX  HAL庫(kù)  延時(shí) 引用地址:stm32CubeMX HAL庫(kù)中延時(shí)的幾種方式解析

上一篇:STM32 CubeMX如何生成微秒(us)級(jí)延時(shí)
下一篇:STM32F401 SDIO HAL driver初始化SD卡

推薦閱讀

微軟正式發(fā)布了Surface Go產(chǎn)品,號(hào)稱這是有史以來最小最實(shí)惠的Surface,起價(jià)為399美元(約合人民幣2638元)的建議零售價(jià)。?外形上,Surface Go的重量?jī)H為1.15磅,厚度僅為8.3毫米,3:2寬高比顯示屏、10英寸屏幕,1800 x 1200分辨率。?配置方面,Surface Go,內(nèi)置第7代英特爾奔騰處理器4415Y,雙核四線程,采用無風(fēng)扇設(shè)計(jì),可提供長(zhǎng)達(dá)9小時(shí)的電池...
UART共有三種操作方式,輪詢方式、中斷方式以及DMA方式。芯片:STM32F103C8T6應(yīng)用管腳:輸出:PA0、PA1USART1配置界面添加中斷配置添加DMA配置代碼應(yīng)用1.實(shí)現(xiàn)printf函數(shù)/* USER CODE BEGIN 0 */#ifdef __GNUC__/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf set to &#39;Yes&#39;) calls __io_p...
7月19日,據(jù)美媒報(bào)道,一位美國(guó)官員透露,拜登政府在確認(rèn)EUV光刻機(jī)在科技產(chǎn)業(yè)中的戰(zhàn)略價(jià)值后,已與荷蘭政府進(jìn)行接觸,并以國(guó)家安全為由要求荷蘭方面限制向中國(guó)大陸出售EUV!報(bào)道披露,拜登正式就職不到一個(gè)月,其國(guó)家安全顧問沙利文已就“在先進(jìn)技術(shù)方面的密切合作”與荷蘭方面進(jìn)行交談。美國(guó)官員透露,繼續(xù)限制阿斯麥與中國(guó)大陸的合作,是沙利文的首要任...

史海拾趣

小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved