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

歷史上的今天

今天是:2025年08月12日(星期二)

2019年08月12日 | STM32-(16):Systick 系統(tǒng)時(shí)鐘

發(fā)布者:創(chuàng)意驛站 來(lái)源: eefocus關(guān)鍵字:STM32  Systick  系統(tǒng)時(shí)鐘 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

Systick的兩大作用:
1、可以產(chǎn)生精確延時(shí)(原先的Delay只是盲等)
2、可以提供給操作系統(tǒng)一個(gè)單獨(dú)的心跳(時(shí)鐘)節(jié)拍

通常實(shí)現(xiàn)Delay(N)函數(shù)的方法為:

for(i = 0; i <= x; i ++);
x…對(duì)應(yīng)于對(duì)應(yīng)于N毫秒的循環(huán)值

對(duì)于STM32系列微處理器來(lái)說(shuō),執(zhí)行一條指令只有幾十個(gè) ns,進(jìn)行for循環(huán)時(shí),要實(shí)現(xiàn)N毫秒的x值非常大,而且由于系 統(tǒng)頻率的寬廣,很難計(jì)算出延時(shí)N毫秒的精確值。針對(duì)STM32 微處理器,需要重新設(shè)計(jì)一個(gè)新的方法去實(shí)現(xiàn)該功能,以實(shí)現(xiàn)在 程序中使用Delay(N)。

Cortex-M3的內(nèi)核中包含一個(gè)SysTick時(shí)鐘。SysTick為一個(gè)24 位遞減計(jì)數(shù)器,SysTick設(shè)定初值并使能后,每經(jīng)過(guò)1個(gè)系統(tǒng)時(shí)鐘周期,計(jì)數(shù)值就減1。計(jì)數(shù)到0時(shí),SysTick計(jì)數(shù)器自動(dòng)重裝初值并繼續(xù)計(jì)數(shù),同時(shí)內(nèi)部的COUNTFLAG標(biāo)志會(huì)置位,觸發(fā)中斷(如果中斷使能)。

外部晶振為8MHz,9倍頻,系統(tǒng)時(shí)鐘為72MHz,SysTick的最高頻率為9MHz (最大為HCLK/8),在這個(gè)條件下,把SysTick效驗(yàn)值設(shè)置成9000,將SysTick時(shí)鐘設(shè)置為9MHz,就能夠產(chǎn)生1ms的時(shí)間基值,即SysTick產(chǎn)生1ms的中斷。

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
SysTick->CALIB 不常用,在這里我們也用不到,故不介紹了。

在這里插入圖片描述

初始化設(shè)置步驟:

使用ST的函數(shù)庫(kù)使用systick的方法:
1、 調(diào)用 SysTick_CounterCmd()失能 SysTick 計(jì)數(shù)器
2、 調(diào)用 SysTick_ITConfig()失能 SysTick 中斷
3、 調(diào)用 SysTick_CLKSouceConfig()設(shè)置 SysTick 時(shí)鐘源。
4、 調(diào)用 SysTick_SetReload()設(shè)置 SysTick 重裝載值。
5、 調(diào)用 SysTickJTConfig ( ) 使 能 SysTick 中斷
6、 調(diào)用 SysTick_CounterCmd()開(kāi)啟 SysTick 計(jì)數(shù)器

//示例

void SysTick_Config(void)

{

/* Disable SysTick Counter */

SysTick_CounterCmd(SysTick_Counter_Disable);

/* Disable the SysTick Interrupt */

SysTick_ITConfig(DISABLE);

/* Configure HCLK clock as SysTick clock source */

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);  //72MHz/8 = 9MHz

/* SysTick interrupt each 1000 Hz with HCLK equal to 72MHz */

SysTick_SetReload (9000);

/* Enable the SysTick Interrupt */

SysTick_ITConfig(ENABLE);

/* Enable SysTick Counter */

SysTick_CounterCmd(SysTick_Counter_Enable);

}


自己動(dòng)手編寫(xiě)一個(gè)DelayMs的程序,實(shí)現(xiàn)精確延時(shí)。

void Delay_MS(u16dly)

{

Delay = dly;

while( Delay);//這里的Delay的值受下方函數(shù)Delay值的影響

}


extern vu16 Delay;

void SysTickHandler(void) //中斷服務(wù)程序

{

Delay--; //每次COUNTFLAG標(biāo)志置位,都會(huì)觸發(fā)中斷

}


以上例子的特點(diǎn):①精準(zhǔn);②仍然是忙等(while)


那如何既精準(zhǔn)又能去忙別的呢?


實(shí)驗(yàn):利用Systick完成對(duì)分秒計(jì)時(shí)的時(shí)鐘,通過(guò)上位機(jī)觀察這個(gè)時(shí)鐘的變化

main.c

/*Include---------------------------*/

#include"stm32f10x_lib.h" //包含所有的頭文件

#include


//----------------函數(shù)聲明--------------------

void Delay_MS(u16 dly);

void RCC_Configuration(void);

void GPIO_Configuration(void);

void USART3_Configuration(void);


u8  tab[]="nHello! everyone,welcome to class!";


void SYSTICK_Configuration(void)

{

SysTick_CounterCmd(SysTick_Counter_Disable); //失能 SysTick 計(jì)數(shù)器

SysTick_ITConfig(DISABLE); //失能 SysTick 中斷

//設(shè)置 SysTick 時(shí)鐘源      

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);  //9Mhz  系統(tǒng)時(shí)鐘除以8

    //設(shè)置 SysTick 重裝載值

SysTick_SetReload(9000*1000);   //9000/9Mhz  再另外乘以1000,得到的單位時(shí)間為1s

//SysTick_ITConfig(ENABLE);  //這里不使用

    SysTick_CounterCmd(SysTick_Counter_Enable); //開(kāi)啟 SysTick 計(jì)數(shù)器

}

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

* Function Name  : main

* Description    : Main program.

* Input          : None

* Output         : None

* Return         : None

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

int main(void)

{

#ifdef DEBUG

debug();

#endif

u8 sec,min;

//u16  data;


//------------初始化------------

RCC_Configuration();

GPIO_Configuration();

USART3_Configuration();

SYSTICK_Configuration();


printf("n The Time is: ");

sec = 30;

min = 1; //從一分三十秒開(kāi)始計(jì)數(shù),實(shí)現(xiàn)當(dāng)秒數(shù)大于60,分?jǐn)?shù)進(jìn)位

//------------將秒和分的數(shù)據(jù)上傳到上位機(jī)------------

while(1)

FlagStatus Status;

Status = SysTick_GetFlagStatus(SysTick_FLAG_COUNT); 

if(Status == RESET)  //標(biāo)志位清零不做操作

 

else //標(biāo)志位置1,秒數(shù)增加

sec++;

if(sec == 60)

{

sec = 0;

min++;

}

printf("%d:%dt",min,sec);

}

}

}


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

* Function Name  : Delay_Ms

* Description    : delay 1 ms.

* Input          : dly (ms)

* Output         : None

* Return         : None

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

void Delay_MS(u16 dly)

{

u16 i,j;

for(i=0;i for(j=1000;j>0;j--);

}


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

* Function Name  : RCC_Configuration

* Description    : Configures the different system clocks.

* Input          : None

* Output         : None

* Return         : None

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

void RCC_Configuration(void)

{

//----------使用外部RC晶振-----------

RCC_DeInit(); //初始化為缺省值

RCC_HSEConfig(RCC_HSE_ON); //使能外部的高速時(shí)鐘 

while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); //等待外部高速時(shí)鐘使能就緒

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer

FLASH_SetLatency(FLASH_Latency_2); //Flash 2 wait state

RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK = SYSCLK

RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2 =  HCLK

RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK1 = HCLK/2

RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //PLLCLK 8MHZ * 9 =72MHZ(SYSCLK)

RCC_PLLCmd(ENABLE); //Enable PLLCLK


while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLLCLK is ready

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock

while(RCC_GetSYSCLKSource()!=0x08); //Wait till PLL is used as system clock source

//---------打開(kāi)相應(yīng)外設(shè)時(shí)鐘--------------------(在這里,需要打開(kāi)的都是外設(shè)時(shí)鐘,而Systick屬于內(nèi)核,會(huì)自動(dòng)開(kāi)啟)

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO,ENABLE); //使能APB2外設(shè)的GPIOA的時(shí)鐘  

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);

}


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

* Function Name  : GPIO_Configuration

* Description    : 初始化GPIO外設(shè)

* Input          : None

* Output         : None

* Return         : None

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

void GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure; //聲明一個(gè)結(jié)構(gòu)體變量


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //選擇PC.10(TXD) 和 PC.11

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管腳頻率為50MHZ

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //輸出模式為復(fù)用推挽輸出

GPIO_Init(GPIOC,&GPIO_InitStructure); //初始化GPIOC寄存器

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //選擇PC.10(TXD) 和 PC.11(RXD)

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管腳頻率為50MHZ

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //輸出模式為浮空輸入

GPIO_Init(GPIOC,&GPIO_InitStructure); //初始化GPIOA寄存器

//將USART3的TXD和RXD重映射到PC10和pc11

GPIO_PinRemapConfig(GPIO_PartialRemap_USART3,ENABLE);


void USART3_Configuration(void)

{

USART_InitTypeDef  U3;

U3.USART_BaudRate =9600;

U3.USART_WordLength = USART_WordLength_8b;

U3.USART_StopBits = USART_StopBits_1;

U3.USART_Parity = USART_Parity_No;

U3.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;

U3.USART_HardwareFlowControl = USART_HardwareFlowControl_None; 

USART_Init(USART3, &U3);


USART_Cmd(USART3,ENABLE);

}


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

* Function Name  : fputc

* Description    : 重定向這個(gè)C庫(kù)(stdio)printf函數(shù)  文件流——》串口USART1

* Input          : ch,*f

* Output         : None

* Return         : None

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


int fputc(int ch,FILE *f)

{

//ch送給USART1

USART_SendData(USART3, ch);

//等待發(fā)送完畢

while(USART_GetFlagStatus(USART3, USART_FLAG_TC)==RESET) ;

//返回ch

return(ch);

}


程序運(yùn)行結(jié)果

在這里插入圖片描述
注:下位機(jī)(ARM的Coretex芯片)發(fā)送到上位機(jī)的顯示窗口(PC機(jī)串口),這個(gè)串口工具的輸入窗口可以發(fā)送數(shù)據(jù)(圖中內(nèi)容為“源享科技”的地方),就是從上位機(jī)發(fā)送到下位機(jī)。

關(guān)鍵字:STM32  Systick  系統(tǒng)時(shí)鐘 引用地址:STM32-(16):Systick 系統(tǒng)時(shí)鐘

上一篇:STM32-(15):如何用ID號(hào)保護(hù)自己的勞動(dòng)成果
下一篇:STM32-(17):SPI與數(shù)碼管,

推薦閱讀

? ??炎炎夏季,又到了換機(jī)高峰期,國(guó)產(chǎn)手機(jī)不少品牌走的都是性價(jià)比路線,同等級(jí)別的核心配置,國(guó)外品牌可能定價(jià)5、6千以上,而國(guó)產(chǎn)品牌可能只是2-3千元。而在今年已經(jīng)發(fā)布的多款手機(jī)中,很多手機(jī)產(chǎn)品都非常的搶眼,而且在價(jià)格上相比較三星和蘋(píng)果也有很大的優(yōu)勢(shì),基本在3000元左右就可以買(mǎi)到很多品牌的旗艦手機(jī)產(chǎn)品。下面新浪手機(jī)就為大家介紹幾款3000...
164芯片的通信微處理器與外設(shè)交換數(shù)據(jù)的過(guò)程中可選擇以下兩種方式:并行通信:數(shù)據(jù)的各個(gè)數(shù)位同時(shí)傳送;串行通信:數(shù)據(jù)按照位順序一位一位傳送;通信制式:在串行通信中數(shù)據(jù)是在兩個(gè)站之間進(jìn)行傳送的,按照數(shù)據(jù)傳送方向,串行通信可分為單工、半雙工和全雙工3中制式。1、在單工制式下,數(shù)據(jù)只能從發(fā)送站向接收站傳送。2、在半雙工制式下,數(shù)據(jù)能雙向傳送,...
領(lǐng)先的電源管理、充電、AC/DC電源轉(zhuǎn)換、Wi-Fi、低功耗藍(lán)牙(BLE)技術(shù)供應(yīng)商Dialog半導(dǎo)體公司今天宣布,其收購(gòu)Adesto Technologies后新增的產(chǎn)品EcoXiP? octal xSPI非易失性存儲(chǔ)器(NVM)已經(jīng)過(guò)優(yōu)化,將與瑞薩電子基于Arm?的RZ/A2M微處理器(MPU)搭配使用。RZ/A2M是專為智能家電、服務(wù)機(jī)器人、工業(yè)機(jī)器等應(yīng)用中的嵌入式AI高速圖像處理而設(shè)計(jì),業(yè)內(nèi)功...
“如果您覺(jué)得一切都在掌握之中,那就是您的速度還不夠快。”— Mario Andretti 多年來(lái),汽車(chē)制造商不斷面臨對(duì)更大功率需求的挑戰(zhàn)。在早期,汽車(chē)使用 6V 電池供電,直到 20 世紀(jì) 50 年代中期,汽車(chē)系統(tǒng)演變?yōu)?12V 電源,以滿足對(duì)更大功率的永久需求。汽車(chē)制造商不僅需要為車(chē)窗、轉(zhuǎn)向系統(tǒng)和座椅預(yù)測(cè)新的供電需求,而且更多電源對(duì)于新型高壓發(fā)動(dòng)機(jī)...

史海拾趣

問(wèn)答坊 | AI 解惑

苦求大神們講講bios

現(xiàn)在學(xué)匯編,不知道為什么bios中斷可以提供這么多功能,感覺(jué)很強(qiáng)大,所以很好奇。 能講講bios是怎么寫(xiě)的嗎? bios的實(shí)現(xiàn)原理是什么…

查看全部問(wèn)答∨

usb通信

小弟不才,剛剛接觸usb這塊?想請(qǐng)教下如果想實(shí)現(xiàn)兩個(gè)程序(一個(gè)在pc端,一個(gè)在wince設(shè)備端)之間通信,可以上傳下載文件,應(yīng)該怎么做呢?我已經(jīng)在pc端通過(guò)GUID查到了wince的usb設(shè)備,但是不能上傳下載文件到wince設(shè)備中?還各位大俠指教?。 ?

查看全部問(wèn)答∨

求助~~

我今年剛上研一,目前還不明確對(duì)什么感興趣,但屬于那種對(duì)自己要求的都能做好的那種人,因此學(xué)習(xí)能力挺強(qiáng)的。現(xiàn)在簽到研究所了,屬于代培的那種,研究的是并行計(jì)算系統(tǒng)軟件,還有嵌入式操作系統(tǒng)開(kāi)發(fā)之類的。本科只學(xué)了些書(shū)本知識(shí),現(xiàn)在想好好深入學(xué) ...…

查看全部問(wèn)答∨

還在實(shí)習(xí),有個(gè)公司叫去復(fù)試,說(shuō)復(fù)試通過(guò)馬上要過(guò)去工作,但是現(xiàn)在的項(xiàng)目要4月中旬才能完成,怎么辦好??

還在實(shí)習(xí),有個(gè)公司叫去復(fù)試,說(shuō)復(fù)試通過(guò)馬上要過(guò)去工作,但是現(xiàn)在的項(xiàng)目要4月中旬才能完成,怎么辦好?? 好不容易等來(lái)了一個(gè)回應(yīng),還叫我回去復(fù)試,復(fù)試通過(guò)了就馬上工作了,,,心想還是把實(shí)習(xí)的項(xiàng)目做完吧,現(xiàn)在也在研究TCPMP, 做完了播放器 ...…

查看全部問(wèn)答∨

三星2410芯片的WIN CE下從USB驅(qū)動(dòng)的開(kāi)發(fā)。

哪位開(kāi)發(fā)過(guò)基于ARM 2410的WIN CE下從USB驅(qū)動(dòng)程序的,幫幫忙,哥們要做一個(gè)2410的從USB的驅(qū)動(dòng),通過(guò)該口可以訪問(wèn)PDA下的某一目錄(最好能夠設(shè)定),實(shí)現(xiàn)對(duì)該目錄的保護(hù)訪問(wèn)。 感謝大家,如果誰(shuí)開(kāi)發(fā)過(guò)的,與我聯(lián)系,定重謝之。 聯(lián)系方式: QQ:470 ...…

查看全部問(wèn)答∨

求助元件功能

求教下面的芯片是什么功能?什么名字?   MAX3232EEPE,  TPS767D318, SN74HC132D, JTAG, IS61LV12816…

查看全部問(wèn)答∨

如何使windows 2003系統(tǒng)的驅(qū)動(dòng),響應(yīng)PCI-E設(shè)備的MSI中斷

在給PCI-E設(shè)備做WDM驅(qū)動(dòng),設(shè)備采用MSI中斷,但據(jù)說(shuō)windows 2003操作系統(tǒng)不支持MSI中斷,如何能實(shí)現(xiàn)呢? 以下摘自MSDN: MSI 只在Windows Vista/2008以上的系統(tǒng)支持,在Win2003/XP下是不支持的。 Message-signaled interrupts (MSIs) were intro ...…

查看全部問(wèn)答∨

xp應(yīng)該如何響應(yīng)中斷請(qǐng)求?

我在XP下應(yīng)該怎么知道有串口中斷產(chǎn)生,然后去讀串口的數(shù)據(jù), 是否應(yīng)該要寫(xiě)個(gè)驅(qū)動(dòng)呢, 那要寫(xiě)什么類型的驅(qū)動(dòng),謝啦…

查看全部問(wèn)答∨

關(guān)于multisim仿真中修改元件標(biāo)簽的提示

本帖最后由 dontium 于 2015-1-23 13:35 編輯 碰到這個(gè)問(wèn)題很久了。在網(wǎng)上也搜不到合適的答案,來(lái)論壇向高手求助一下,請(qǐng)大家指教! 我想做的事情是:修改一個(gè)元件的參考標(biāo)識(shí),跟標(biāo)簽匹配,從而在顯示元件清單時(shí)可以清楚看到是哪些元件。因?yàn)閙ult ...…

查看全部問(wèn)答∨
小廣播
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

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

 
汽車(chē)開(kāi)發(fā)圈

 
機(jī)器人開(kāi)發(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