HAL_Dalay()是毫秒級(jí)延時(shí),為了使用微秒級(jí)延時(shí)最近學(xué)習(xí)了一下,總結(jié)如下,推薦使用最后一種方式。
/*
* 本文件包括四種延時(shí)方式:
* 1. 原來(lái)的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中斷一次??!
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;//使能,減到零是無(wú)動(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
上一篇:STM32 CubeMX如何生成微秒(us)級(jí)延時(shí)
下一篇:STM32F401 SDIO HAL driver初始化SD卡
推薦閱讀
史海拾趣
為了滿足不斷增長(zhǎng)的市場(chǎng)需求,地博電子在2017年創(chuàng)立了株洲地博光電材料有限公司,打造了第二智造基地。新基地的建設(shè)不僅進(jìn)一步提高了公司的生產(chǎn)能力和研發(fā)水平,還為公司的長(zhǎng)期發(fā)展提供了強(qiáng)有力的支持。在株洲地博高科技園一期建設(shè)完成后,地博電子的產(chǎn)能和品質(zhì)都得到了顯著提升。
在電子行業(yè)的發(fā)展歷程中,技術(shù)突破一直是推動(dòng)公司成長(zhǎng)和市場(chǎng)擴(kuò)張的關(guān)鍵因素。假設(shè)ATC在某一時(shí)期成功研發(fā)出了一種新型的陶瓷材料,這種材料在耐高溫、抗腐蝕等方面具有顯著優(yōu)勢(shì),因此被廣泛應(yīng)用于半導(dǎo)體制造和電子設(shè)備領(lǐng)域。這一技術(shù)突破使得ATC的產(chǎn)品在市場(chǎng)上獲得了極高的認(rèn)可,公司也因此實(shí)現(xiàn)了快速的收入增長(zhǎng)和市場(chǎng)占有率的提升。
在國(guó)內(nèi)市場(chǎng)取得一定成績(jī)后,Calex Mfg. Co., Inc.開(kāi)始積極拓展海外市場(chǎng)。公司制定了全球化戰(zhàn)略,通過(guò)參加國(guó)際展會(huì)、建立海外銷售網(wǎng)絡(luò)等方式,不斷開(kāi)拓國(guó)際市場(chǎng)。同時(shí),公司還根據(jù)不同地區(qū)的市場(chǎng)需求,推出定制化的產(chǎn)品和服務(wù),進(jìn)一步提升了其在國(guó)際市場(chǎng)中的競(jìng)爭(zhēng)力。
隨著全球環(huán)保意識(shí)的增強(qiáng),ABC Electronics Inc. 敏銳地捕捉到了綠色電子產(chǎn)品的市場(chǎng)潛力。公司開(kāi)始研發(fā)和生產(chǎn)符合環(huán)保標(biāo)準(zhǔn)的產(chǎn)品,如低能耗的LED照明產(chǎn)品、可循環(huán)利用的電池等。同時(shí),公司還優(yōu)化了生產(chǎn)工藝,減少了生產(chǎn)過(guò)程中的環(huán)境污染。這些環(huán)保舉措不僅贏得了消費(fèi)者的青睞,也提升了公司的社會(huì)形象。
隨著產(chǎn)品質(zhì)量的不斷提升和市場(chǎng)份額的逐步擴(kuò)大,Califia Lighting開(kāi)始積極尋求與國(guó)際市場(chǎng)的合作。他們與多個(gè)國(guó)家和地區(qū)的合作伙伴建立了穩(wěn)定的合作關(guān)系,將產(chǎn)品出口到全球各地。同時(shí),公司還參加了多個(gè)國(guó)際電子照明展會(huì),與全球同行交流學(xué)習(xí),進(jìn)一步提升了公司的國(guó)際影響力。
ECI公司深知人才是企業(yè)發(fā)展的關(guān)鍵因素。因此,公司高度重視人才的引進(jìn)、培養(yǎng)和激勵(lì)。公司建立了完善的人才選拔機(jī)制,選拔具有潛力和才華的員工進(jìn)行重點(diǎn)培養(yǎng)。同時(shí),公司還提供了豐富的培訓(xùn)和發(fā)展機(jī)會(huì),幫助員工提升自身素質(zhì)和能力。此外,ECI還建立了科學(xué)合理的薪酬制度和激勵(lì)機(jī)制,讓員工在為公司創(chuàng)造價(jià)值的同時(shí)也能獲得相應(yīng)的回報(bào)。這種對(duì)人才的重視和投入讓ECI公司匯聚了一批優(yōu)秀的員工隊(duì)伍,為公司的發(fā)展提供了有力的保障。
(畢業(yè)設(shè)計(jì))基于FPGA的數(shù)據(jù)采集系統(tǒng) 亂了 一大堆的資料 可現(xiàn)在確實(shí)不知道該從何處下手了。。 求哪個(gè)做個(gè)這個(gè)題目的大哥大姐給個(gè)參考啊 謝謝了。。 我的郵箱:wendy0109@sina.com… 查看全部問(wèn)答∨ |
請(qǐng)教關(guān)于PXA270喚醒源的設(shè)置 專家好: 我的PDA前兩天在公司測(cè)試部門發(fā)現(xiàn),按鍵進(jìn)入深度休眠后,不能馬上按鍵喚醒,只有等5~6秒(大約值)后才能馬上喚醒 我的按鍵休眠是設(shè)置的GPIO0,喚醒源也是GPIO0 具體的設(shè)置如下: &nbs ...… 查看全部問(wèn)答∨ |
關(guān)于TAPI的lineInitializeEx的困惑 Windows Embedded CE 6.0幫助文檔中介紹,Establishing a Modem Connection的流程如下: lineInitializeEx ↓ lineOpen ↓ lineMakeCall ↓ lineGetMessage & ...… 查看全部問(wèn)答∨ |
|
#include #include void main() { int i=7,j=2; float f=(float)i/j; SCON = 0x50; TMOD |= 0x20; TH1 = 0xf3; TR1 = 1; TI = 1; printf(\"%f\",f); while(1) {} } 這個(gè)程序?yàn)槭裁丛谶\(yùn)行的時(shí)候 在串口輸入串口 沒(méi)看到東西啊 ...… 查看全部問(wèn)答∨ |
$(\'swf_vSx\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://www.tudou.com/v/IJy11e9LXmk/v.swf\'), \'quality\', ...… 查看全部問(wèn)答∨ |
若我有一臺(tái)17KW 600V的無(wú)刷電機(jī),控制器的驅(qū)動(dòng)部分因該選用哪種IGBT和驅(qū)動(dòng)芯片呀,求個(gè)型號(hào)以供參考,謝謝了… 查看全部問(wèn)答∨ |
【設(shè)計(jì)工具】quartus ii中文用戶教程及配置與下載 quartus ii中文用戶教程是全中文的,利于我們快速進(jìn)入開(kāi)發(fā)流程。配置與編程下載文檔為我們開(kāi)發(fā)掃清前期障礙,順利入門。… 查看全部問(wèn)答∨ |
做一臺(tái)自己的CD機(jī)~Ver2.0 可以用了~ 上次發(fā)的CD機(jī),怎么看都是很寒酸的東西…… 沒(méi)有外殼……板子和機(jī)器分離……哎…… 改進(jìn)嘛~~總之,這一版不裸奔了~~ 先上圖~ 嗯……這一版的方案是:CD模擬輸出——放大器——聲音出來(lái)啦~~ 這樣搞,音質(zhì)還是欠佳,畢竟CD機(jī)芯不值錢。 注 ...… 查看全部問(wèn)答∨ |
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- 神經(jīng)形態(tài)芯片可能是革新機(jī)器人實(shí)時(shí)電機(jī)控制的未來(lái)
- 從三個(gè)方面理解ARM嵌入式系統(tǒng)
- 自動(dòng)報(bào)警 基于MCU的家庭防盜報(bào)警系統(tǒng)的設(shè)計(jì)
- 存儲(chǔ)控制器及其訪問(wèn)外設(shè)的原理
- 基于51系列單片機(jī)的智能照明控制系統(tǒng)設(shè)計(jì)方案
- 基于STM32的四旋翼飛行器控制系統(tǒng)
- 單片機(jī)應(yīng)用編程技巧解析
- 基于89C52的教室智能節(jié)能照明系統(tǒng)設(shè)計(jì)
- 一種新型的雨量光照傳感器的設(shè)計(jì)
- RISC-V人才該怎么培養(yǎng)?專家這樣說(shuō)
- 割草機(jī)器人,四大流派的巔峰之戰(zhàn)
- 車載顯示迎來(lái)三大革命丨“形態(tài)”革命
- 什么是“CDC+空懸”?
- 汽車電子信息安全:如何有效保護(hù)硬件Debug口?
- 新能源汽車核心技術(shù)之“大三電”、“小三電”
- 芯原如何推動(dòng)RISC-V嵌入式軟件人才發(fā)展?
- Arm 技術(shù)助力《國(guó)家地理》探險(xiǎn)家繪制地球海洋圖景
- Arm SME2 技術(shù)加速安卓 AI 升級(jí),驅(qū)動(dòng)移動(dòng)應(yīng)用下一代功能革新
- VGA接口定義、功能用途和種類
- 直播已結(jié)束|如何通過(guò)【TI MSPM0 固件示例】及【常用電機(jī)驅(qū)動(dòng)器方案和拓?fù)洹?,?0分鐘內(nèi)旋轉(zhuǎn)電機(jī)
- 快來(lái)訪問(wèn)泰克高速串行通信專題 配置您的專屬解決方案 贏好禮!
- 有獎(jiǎng)活動(dòng)“庖丁”解智能睡眠監(jiān)測(cè)儀,一波“水軍”來(lái)圍觀
- ADI有獎(jiǎng)下載活動(dòng)之20:基于NDIR和PID的ADI氣體探測(cè)器解決方案和新產(chǎn)品
- 【已結(jié)束】RIGOL直播|示波器、可編程直流電源應(yīng)用分享
- 村田在線課堂:健康篇
- 快來(lái)應(yīng)援吧!投票選出你最愛(ài)的TI培訓(xùn)課程
- Keil MDK中 ST/Link 硬件仿真的配置,解決不進(jìn)入main函數(shù)的方法
- 安富利聯(lián)合微軟免費(fèi)贈(zèng)送20000塊開(kāi)發(fā)板,加速物聯(lián)網(wǎng)安全普及
- STM32下載不成功問(wèn)題匯總
- 關(guān)于ST-Link的internal command error問(wèn)題的解決方法
- 高通公司因與Icera的價(jià)格戰(zhàn)被歐盟罰款2.42億歐元
- 科技創(chuàng)新加持下 掃地機(jī)器人即將迎來(lái)洗牌
- Imperva收購(gòu)Distil Networks 幫助企業(yè)將機(jī)器人遠(yuǎn)離其網(wǎng)站和應(yīng)用程序
- 中國(guó)三大電信運(yùn)營(yíng)商被紐約證券交易所摘牌退市了
- 中芯國(guó)際披露董事名單 梁孟松還在任、叢京生辭職
- 全球30家半導(dǎo)體巨頭總市值漲49.22%
- Pctolcd2002怎么顯示在msp上啊
- 模塊撥號(hào)上網(wǎng),要先設(shè)定模塊嗎?
- 請(qǐng)教能否通過(guò)串口控制另一個(gè)ATX電源的開(kāi)關(guān)
- 能否提供虛擬串口例程驅(qū)動(dòng)的的dll文件與操作的.h文件
- 電源
- WINCE60下基于DirectShow技術(shù)怎么寫Camera相機(jī)的應(yīng)用程序?就像在PC上通過(guò)DirectShow技術(shù)做的攝像頭的應(yīng)用程序一樣可以瀏覽,可以拍照
- 今天上午10:00開(kāi)啟 艾睿電子有獎(jiǎng)直播:英特爾?FPGA深度學(xué)習(xí)加速技術(shù)
- xilinx 的開(kāi)發(fā)軟件有哪些
- 原理圖——這個(gè)電路是如何實(shí)現(xiàn)開(kāi)關(guān)自鎖功能的?
- 電組匹配表