Cubieboard上使用U-boot通過定時器中斷控制LED
繼LED之後,學習使用A10中斷,目的是學習U-boot中如何使用中斷。
軟體環境: 筆記本一臺,安裝WindowsXP sp3
XP下軟體:Source Insight 3.5;SecureCRT;VMware Workstation7.0
虛擬機器中安裝ubuntu10.04
ubuntu中軟體:Vim;編譯工具鏈 arm-none-eabi- 版本4.7.2
硬體環境:cubieboard,淘寶自帶的串列埠線和電源線
microSD卡一隻,讀卡器一個
CB的原理圖
A10使用者手冊
一、程式碼分析進入點,釐清脈絡
從上次開啟LED控制就發現了http://blog.csdn.net/andy_wsj/article/details/8973818,檔案status_led.c檔案內的函式status_led_tick將會在定時器中斷中被
呼叫,在工程內搜尋status_led_tick,獲得4個結果,兩個在interrupts.c下。進入檢視,閱讀上下文,可以看出,這是在定時器中斷中呼叫,實現定時LED閃爍控制。
檢視檔案,希望獲得中斷處理部分程式碼。在任何平臺下,使用中斷之前都要初始化,因此在工程搜尋這個檔案裡面的函式interrupt_init,獲得很多結果。呼叫的地方暫時不理會,只看定義。A10是ARM平臺,理所當然的檢視ARM架構lib裡面的定義:
Interrupts.c (d:\share\u-boot-sunxi-sunxi\arch\arm\lib):int interrupt_init (void)
可以看到,若要使用中斷,需要定義預編譯巨集:
CONFIG_USE_IRQ
在include/configs/sunxi-common.h中定義之,然後編譯u-boot,提示兩個錯誤:
CONFIG_STACKSIZE_IRQ 未定義
CONFIG_STACKSIZE_FIQ 未定義
就是中斷的棧大小沒定義,先在include/configs/sunxi-common.h定義兩個,不知到多大合適,暫時定義10K
#define CONFIG_STACKSIZE_IRQ (10 * 1024)
#define CONFIG_STACKSIZE_FIQ (10 * 1024)
再次編譯u-boot,再次提示錯誤,start.S裡面的do_irq沒定義,開啟
\u-boot-sunxi-sunxi\arch\arm\cpu\armv7\start.S,搜尋do_irq,可以看到:
#ifdef CONFIG_USE_IRQ
.align 5
irq:
get_irq_stack
irq_save_user_regs
bldo_irq
irq_restore_user_regs
.align 5
fiq:
get_fiq_stack
/* someone ought to write a more effective fiq_save_user_regs */
irq_save_user_regs
bldo_fiq
irq_restore_user_regs
#else
.align 5
irq:
get_bad_stack
bad_save_user_regs
bldo_irq
.align 5
fiq:
get_bad_stack
bad_save_user_regs
bldo_fiq
#endif /* CONFIG_USE_IRQ */
很明顯,這就是中斷處理了。
繼續看看標號irq,fiq,在檔案start.S開頭的地方:
.globl _start
_start: breset
ldrpc, _undefined_instruction
ldrpc, _software_interrupt
ldrpc, _prefetch_abort
ldrpc, _data_abort
ldrpc, _not_used
ldrpc, _irq
ldrpc, _fiq
#ifdef CONFIG_SPL_BUILD
_undefined_instruction: .word _undefined_instruction
_software_interrupt:.word _software_interrupt
_prefetch_abort:.word _prefetch_abort
_data_abort:.word _data_abort
_not_used:.word _not_used
_irq:.word _irq
_fiq:.word _fiq
_pad:.word 0x12345678 /* now 16*4=64 */
#else
_undefined_instruction: .word undefined_instruction
_software_interrupt:.word software_interrupt
_prefetch_abort:.word prefetch_abort
_data_abort:.word data_abort
_not_used:.word not_used
_irq:.word irq
_fiq:.word fiq
_pad:.word 0x12345678 /* now 16*4=64 */
#endif/* CONFIG_SPL_BUILD */
我們已經來到整個u-boot開始的地方,即上電之後一條被執行的指令就是這裡
_start: breset
接下來幾句就是異常處理
ldrpc, _undefined_instruction
ldrpc, _software_interrupt
ldrpc, _prefetch_abort
ldrpc, _data_abort
ldrpc, _not_used
ldrpc, _irq
ldrpc, _fiq
發生什麼型別的異常就是跳到對應的位置進行處理,再看看
_irq:.word irq
_fiq:.word fiq
由此可見,假設發生一個irq,那麼首先執行
ldrpc, _irq
_irq就是irq
(_irq==irq)->do_irq,就跳到中斷處理函式去了,如何實現do_irq呢?在工程內搜尋之。結果不多,逐個檢視,發現就是各種實現方式,對於A10,我覺得自己修改一種方式有利於學習,
最後挑了Interrupts.c (d:\share\u-boot-sunxi-sunxi\arch\arm\cpu\arm720t):void do_irq (struct pt_regs *pt_regs)
我決定把這一個檔案修改成能在當前平臺下使用,並將這個檔案放在\u-boot-sunxi-sunxi\arch\arm\cpu\armv7\sunxi\下,
修改該目錄Makefile檔案,增加如下幾句:
ifdef CONFIG_USE_IRQ
COBJS += interrupts.o
endif
再增加一個檔案Interrupts.h,用來定義A10的中斷暫存器地址和中斷源,放在\u-boot-sunxi-sunxi\arch\arm\include\asm\arch-sunxi目錄下。
目的是同過timer0中斷控制LED閃爍,其他中斷暫時都不會開啟,但是會定義,為進一步學習其他模組做準備。
二、瞭解中斷機制,修改程式碼
準備寫程式碼了,應該看一看A10使用者手冊,仔細閱讀中斷和定時器相關的章節
在“intterrupt controller”這一章,所有中斷都在這裡描述
在“timer controller”這一章,也描述了與定時器相關的暫存器
1、程式碼編寫和修改。
修改\u-boot-sunxi-sunxi\arch\arm\cpu\armv7\sunxi\timmer.c裡面的timmer_init函式,使之符合中斷要求。
/*
* (C) Copyright 2007-2011
* Allwinner Technology Co., Ltd. <www.allwinnertech.com>
* Tom Cubie <
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
#include <common.h>
#include <asm/io.h>
#include <asm/arch/timer.h>
#include <asm/arch/interrupts.h>
DECLARE_GLOBAL_DATA_PTR;
#define TIMER_MODE (0 << 7) /* continuous mode */
#define TIMER_DIV (0 << 4) /* pre scale 1 */
#define TIMER_SRC (1 << 2) /* osc24m */
#define TIMER_RELOAD (1 << 1) /* reload internal value */
#define TIMER_EN (1 << 0) /* enable timer */
#define TIMER_CLOCK (24 * 1000 * 1000)
#define COUNT_TO_USEC(x)((x) / 24)
#define USEC_TO_COUNT(x)((x) * 24)
#define TICKS_PER_HZ(TIMER_CLOCK / CONFIG_SYS_HZ)
#define TICKS_TO_HZ(x)((x) / TICKS_PER_HZ)
#define TIMER_LOAD_VAL TICKS_PER_HZ
#define TIMER_NUM (0) /* we use timer 0 */
static struct sunxi_timer *timer_base =
&((struct sunxi_timer_reg *)SUNXI_TIMER_BASE)->timer[TIMER_NUM];
/* macro to read the 32 bit timer: since it decrements, we invert read value */
#define READ_TIMER() (~readl(&timer_base->val))
/* init timer register */
int timer_init(void)
{
unsigned int val;
writel(TIMER_LOAD_VAL, &timer_base->inter);
writel(TIMER_MODE | TIMER_DIV | TIMER_SRC | TIMER_RELOAD | TIMER_EN, &timer_base->ctl);
#if defined(CONFIG_USE_IRQ)
val = readl(SUNXI_TIMER_BASE + 0x04);
val |= (0x1 << 0);
writel( val, SUNXI_TIMER_BASE + 0x04); /* clear timer0 irq pending */
/* enable timer0 interrupt*/
val = readl(SUNXI_TIMER_BASE);
val |= (0x1 << 0);
writel( val, SUNXI_TIMER_BASE); /* Enable timer0 irq */
writel( (1 << (INT_TIM0 % 32)), INTC_EN_REG0 + (INT_TIM0 >> 5));
#if defined(TIMER_DEBUG)
printf("Timer init done.\n");
#endif
#endif
return 0;
}
/* timer without interrupts */
ulong get_timer(ulong base)
{
return get_timer_masked() - base;
}
ulong get_timer_masked(void)
{
/* current tick value */
ulong now = TICKS_TO_HZ(READ_TIMER());
if (now >= gd->lastinc)/* normal (non rollover) */
gd->tbl += (now - gd->lastinc);
else/* rollover */
gd->tbl += (TICKS_TO_HZ(TIMER_LOAD_VAL) - gd->lastinc) + now;
gd->lastinc = now;
return gd->tbl;
}
/* delay x useconds */
void __udelay(unsigned long usec)
{
long tmo = usec * (TIMER_CLOCK / 1000) / 1000;
ulong now, last = READ_TIMER();
while (tmo > 0) {
now = READ_TIMER();
if (now > last)/* normal (non rollover) */
tmo -= now - last;
else/* rollover */
tmo -= TIMER_LOAD_VAL - last + now;
last = now;
}
}
/*
* This function is derived from PowerPC code (read timebase as long long).
* On ARM it just returns the timer value.
*/
unsigned long long get_ticks(void)
{
return get_timer(0);
}
/*
* This function is derived from PowerPC code (timebase clock frequency).
* On ARM it returns the number of timer ticks per second.
*/
ulong get_tbclk(void)
{
ulong tbclk;
tbclk = CONFIG_SYS_HZ;
return tbclk;
}
增加\u-boot-sunxi-sunxi\arch\arm\cpu\armv7\sunxi\interrupts.c,這個是修改過來的。修改Makefile,使之可編譯到u-boot。
將status_led_tick增加到timer_isr呼叫中,若正常,板上的led將閃爍。
/*
* for sun4i A10
* by Andy 2013.5
*/
#include <common.h>
#include <asm/io.h>
#include <asm/arch/interrupts.h>
#include <asm/arch/timer.h>
#if defined(CONFIG_USE_IRQ) && defined(CONFIG_SUN4I)
static struct _irq_handler IRQ_HANDLER[N_IRQS];
static void default_isr( void *data) {
printf ("default_isr(): called for IRQ %d\n", (int)data);
}
static void timer_isr( void *data) {
unsigned int *pTime = (unsigned int *)data;
unsigned int val;
(*pTime)++;
status_led_tick ((unsigned long)(*pTime));
#if defined(TIMER_DEBUG)
printf("Timer_isr running.\n");
#endif
val = readl(SUNXI_TIMER_BASE + 0x04);
val |= (0x1 << 0);
writel( val, SUNXI_TIMER_BASE + 0x04); /* clear timer0 irq pending */
}
void do_irq (struct pt_regs *pt_regs)
{
unsigned int pending;
unsigned int vector;
unsigned int int_source;
vector = readl( INTC_VECTOR_REG);
if( (int_source = (vector >> 2)) < N_IRQS )
{
switch(int_source >> 5 ){
case 0:
pending = INTC_IRQ_PEND_REG0;
break;
case 1:
pending = INTC_IRQ_PEND_REG1;
break;
case 2:
break;
pending = INTC_IRQ_PEND_REG2;
default:
pending = INTC_IRQ_PEND_REG0;
break;
}
if( (readl(pending) >> ( int_source % 32 )) & 0x01 ){
IRQ_HANDLER[int_source].m_func( IRQ_HANDLER[int_source].m_data);
/* clear pending interrupt */
writel( ~(1 << (int_source % 32)), pending);
}
}else{
default_isr(&vector);
}
}
static ulong timestamp;
static ulong lastdec;
int arch_interrupt_init (void)
{
int i;
/* install default interrupt handlers */
for ( i = 0; i < N_IRQS; i++) {
IRQ_HANDLER[i].m_data = (void *)i;
IRQ_HANDLER[i].m_func = default_isr;
}
/* configure interrupts for IRQ mode */
writel( 0x0, INTC_IRQ_TYPE_SEL0);
writel( 0x0, INTC_IRQ_TYPE_SEL1);
writel( 0x0, INTC_IRQ_TYPE_SEL2);
/* clear any pending interrupts */
writel( 0x0, INTC_IRQ_PEND_REG0);
writel( 0x0, INTC_IRQ_PEND_REG1);
writel( 0x0, INTC_IRQ_PEND_REG2);
writel( 0x0, INTC_FIQ_PEND_REG0);
writel( 0x0, INTC_FIQ_PEND_REG1);
writel( 0x0, INTC_FIQ_PEND_REG2);
lastdec = 0;
timestamp = 0;
/* install interrupt handler for timer */
IRQ_HANDLER[INT_TIM0].m_data = (void *)×tamp;
IRQ_HANDLER[INT_TIM0].m_func = timer_isr;
#if defined(TIMER_DEBUG)
printf("Interrupts initialize done.\n");
#endif
return 0;
}
#else
#error do_irq no define for this CPU type
#endif
增加\u-boot-sunxi-sunxi\arch\arm\include\asm\arch-sunxi\interrupts.h,用來定義A10的中斷暫存器地址,中斷源和中斷資料結構。
/************************************/
/* A10 interrupt register list */
/************************************/
#define INTC_REG_BASE 0x01C20400
#define INTC_VECTOR_REG (INTC_REG_BASE + 0x0000)
#define INTC_BASE_ADDR_REG (INTC_REG_BASE + 0x0004)
#define INTC_INTCTRL_REG (INTC_REG_BASE + 0x000C)
#define INTC_IRQ_PEND_REG0 (INTC_REG_BASE + 0x0010)
#define INTC_IRQ_PEND_REG1 (INTC_REG_BASE + 0x0014)
#define INTC_IRQ_PEND_REG2 (INTC_REG_BASE + 0x0018)
#define INTC_FIQ_PEND_REG0 (INTC_REG_BASE + 0x0020)
#define INTC_FIQ_PEND_REG1 (INTC_REG_BASE + 0x0024)
#define INTC_FIQ_PEND_REG2 (INTC_REG_BASE + 0x0028)
#define INTC_IRQ_TYPE_SEL0 (INTC_REG_BASE + 0x0030)
#define INTC_IRQ_TYPE_SEL1 (INTC_REG_BASE + 0x0034)
#define INTC_IRQ_TYPE_SEL2 (INTC_REG_BASE + 0x0038)
#define INTC_EN_REG0 (INTC_REG_BASE + 0x0040)
#define INTC_EN_REG1 (INTC_REG_BASE + 0x0044)
#define INTC_EN_REG2 (INTC_REG_BASE + 0x0048)
#define INTC_MASK_REG0 (INTC_REG_BASE + 0x0050)
#define INTC_MASK_REG1 (INTC_REG_BASE + 0x0054)
#define INTC_MASK_REG2 (INTC_REG_BASE + 0x0058)
#define INTC_RESP_REG0 (INTC_REG_BASE + 0x0060)
#define INTC_RESP_REG1 (INTC_REG_BASE + 0x0064)
#define INTC_RESP_REG2 (INTC_REG_BASE + 0x0068)
#define INTC_FF_REG0 (INTC_REG_BASE + 0x0070)
#define INTC_FF_REG1 (INTC_REG_BASE + 0x0074)
#define INTC_FF_REG2 (INTC_REG_BASE + 0x0078)
#define INTC_PRIO_REG0 (INTC_REG_BASE + 0x0080)
#define INTC_PRIO_REG1 (INTC_REG_BASE + 0x0084)
#define INTC_PRIO_REG2 (INTC_REG_BASE + 0x0088)
#define INTC_PRIO_REG3 (INTC_REG_BASE + 0x008C)
#define INTC_PRIO_REG4 (INTC_REG_BASE + 0x0090)
/************************************/
/* A10 interrupt source */
/************************************/
#define INT_EXTNMI 0
#define INT_UART0 1
#define INT_UART1 2
#define INT_UART2 3
#define INT_UART3 4
#define INT_IR0 5
#define INT_IR1 6
#define INT_TWI0 7
#define INT_TWI1 8
#define INT_TWI2 9
#define INT_SPI0 10
#define INT_SPI1 11
#define INT_SPI2 12
#define INT_NC 13
#define INT_AC97 14
#define INT_TS 15
#define INT_IIS 16
#define INT_UART4 17
#define INT_UART5 18
#define INT_UART6 19
#define INT_UART7 20
#define INT_KEYPAD 21
#define INT_TIM0 22
#define INT_TIM1 23
#define INT_TIM2_ALARM_WD 24
#define INT_TIM3 25
#define INT_CAN 26
#define INT_DMA 27
#define INT_PIO 28
#define INT_TOUCHPANEL 29
#define INT_AUDIOCODEC 30
#define INT_LRADC 31
#define INT_SD_MMC0 32
#define INT_SD_MMC1 33
#define INT_SD_MMC2 34
#define INT_SD_MMC3 35
#define INT_RSVD1 36
#define INT_NAND 37
#define INT_USB0 38
#define INT_USB1 39
#define INT_USB2 40
#define INT_SCR 41
#define INT_CSI0 42
#define INT_CSI1 43
#define INT_LCD_CON0 44
#define INT_LCD_CON1 45
#define INT_MP 46
#define INT_DE_FE0_BE0 47
#define INT_DE_FE1_BE1 48
#define INT_PMU 49
#define INT_SPI3 50
#define INT_TZASC 51
#define INT_PATA 52
#define INT_VE 53
#define INT_SS 54
#define INT_EMAC 55
#define INT_RSVD2 56
#define INT_RSVD3 57
#define INT_HDMI 58
#define INT_TVE0_1 59
#define INT_ACE 60
#define INT_TVD 61
#define INT_PS2_0 62
#define INT_PS2_1 63
#define INT_USB3 64
#define INT_USB4 65
#define INT_PLE_PREFMU 66
#define INT_TIM4 67
#define INT_TIM5 68
#define INT_GPU_GP 69
#define INT_GPU_GPMMU 70
#define INT_GPU_PP0 71
#define INT_GPU_PPMMU0 72
#define INT_GPU_PMU 73
#define INT_GPU_RSV0 74
#define INT_GPU_RSV1 75
#define INT_GPU_RSV2 76
#define INT_GPU_RSV3 77
#define INT_GPU_RSV4 78
#define INT_GPU_RSV5 79
#define INT_GPU_RSV6 80
#define N_IRQS (80)
#ifndef __ASSEMBLER__
struct _irq_handler {
void *m_data;
void (*m_func)( void *data);
};
#endif
2、瞭解呼叫關係,使編譯之後的程式碼能正常執行
只要timmer0初始化和中斷初始化正常,那麼就可以產生timer0中斷。
那麼timer_init被誰呼叫了呢?工程中搜索timer_init,結果很多,逐個觀察,可以肯定初始化在board.c裡面,A10為ARM,所以一定在ARM平臺的程式碼內:
Board.c (d:\share\u-boot-sunxi-sunxi\arch\arm\lib):timer_init,/* initialize timer */
閱讀上下文,可以看到,在函式board_init_f內通過一個轉移表init_sequence呼叫了timer_init。
再來看看,中斷初始化在哪呼叫的,搜尋interrupt_init,跟timer_init在同一個檔案裡
Board.c (d:\share\u-boot-sunxi-sunxi\arch\arm\lib):interrupt_init();
這個interrupt_init就是這篇文章開始收搜尋的函式,在檔案:Interrupts.c (d:\share\u-boot-sunxi-sunxi\arch\arm\lib):int interrupt_init (void)
它呼叫了arch_interrupt_init函式,不用看,這就在我們自己寫的檔案\u-boot-sunxi-sunxi\arch\arm\cpu\armv7\sunxi\interrupts.c裡面
確定呼叫完整。
3、寫到SD卡內,測試之。
中斷週期太大,採用24M的外部時鐘,而CONFIG_SYS_HZ的值為1000,即中斷1000次為1秒鐘,每次中斷為1ms,因此timer0的過載值為 24M/1000
修改:
#define TIMER_LOAD_VAL TICKS_PER_HZ
這個巨集之後,可以獲得正確的CONFIG_SYS_HZ時間值
設定CONFIG_SYS_HZ時,LED的閃爍可以做到1秒一次
相關推薦
Cubieboard上使用U-boot通過定時器中斷控制LED
繼LED之後,學習使用A10中斷,目的是學習U-boot中如何使用中斷。 軟體環境: 筆記本一臺,安裝WindowsXP sp3 XP下軟體:Source Insight 3.5;SecureCRT;VMware Worksta
STM32之定時器中斷控制LED閃爍
上篇部落格我們是用延時函式實現了LED的閃爍,今天我們使用STM32的定時器來使LED閃爍。 關於32的定時器的種類,今天我在這先不做過多的說明,有時間我會再另寫一篇部落格來專門介紹32的定時器。今天我們使用32的定時器3來產生中斷,以實現LED的閃爍。 今
51微控制器定時器中斷控制燈1S亮的程式
#include <AT89X51.H>unsigned char i=0,j=0; void main(){ TMOD=0X01; TH0=0X4c; TL0=0X00; TR0=1;ET0=1;EA=1;P0_3=1; while(1) {};} t
Stm32定時器中斷使LED燈閃爍
知識點: Stm32共有11個定時器: 1.兩個高階定時器:TIM1、TIM8-------------------------APB2 2.四個通用定時器:TIM2~TIM5-------------------------APB1 3.兩個基本定時器:TIM6、TIM7
定時器中斷實現LED閃爍
#include <reg52.h> typedef unsigned char u8; typedef unsigned int u16; sbit led=P2^0; void T
CC2530通過定時器3中斷方式每10ms輸出一個下降沿
Request/Task: 由於專案中硬體電路遲遲未到位,故利用一個CC2530板子的P0.0口作為輸出,模擬10ms一次的下降沿中斷,給除錯電路板。 Idea 定時器3和定時器4是兩個8位定時器,一般上,控制暫存器TxCTL被用來控制定時器模式。本文選用的是自由執行模式,
stm32-定時器中斷
cmd open 兩個 typedef clock 數據手冊 濾波 重裝 fin 由於現在是在學用庫函數操作,我的目標是知道用到的每個函數的作用,需要的時候可以加以更改使用,所以關鍵是要怎麽知道stm32各函數的作用 雖然從名字上也能知道個大概,但是細節還是要查stm3
Spring 通過定時器 通過反射 Resource Dao層為空
技術分享 方法 img global getbean code oba 技術 需要 通過定時器,調用方法,方法中需要用到Dao層實體,Resource時為空 跟換Dao的註入方式: 從 Resource 改為 GlobalFunction.getBeanByName()即可
ubuntu上u-boot的編譯
復制 span ubuntu虛擬機 str 可執行文件 linu 編譯 解壓 自定義 1,下載u-boot 2,將Windows中的u-boot復制到ubuntu虛擬機中自定義目錄並解壓 3,進入該目錄cd 4,安裝dtc:sudo apt-get install devi
TI CC2530 學習筆記-7-NewBit-CC2530-Interrupt-定時器中斷
TI CC2530 學習筆記-目錄 TI CC2530 學習筆記-7-NewBit-CC2530-Interrupt-定時器中斷 設定CC2530定時器4每1ms中斷一次,在中斷裡對溢位進行計數,當計數達到1000次(1秒)時小燈狀態改變。 配置定時器和LED
51微控制器使用定時器中斷模擬PWM控制埠電壓
最近應實驗室需求寫一篇51微控制器產生PWM的文章供參考. 微控制器晶片STC89C52,晶振12MHz,編譯環境Keil5. 分析:若使微控制器埠為高電平, 則微控制器輸出電壓為恆值5V. 反之低電平輸出電壓為0V. 但是我們如果在週期為T的時間內
Broadcast基礎(使用廣播,傳送臨時廣播,註冊接收器,通過定時器設定定時廣播)
舉例場景: 碎片將資訊傳回頁面,介面卡向頁面傳回訊息 (一)Fragment提供了onAttach()方法,onAttach方法指定結合了Activity物件。定義一個回撥介面,把Activity物件強制轉換為回撥介面就可以在碎片中呼叫頁面方法 (二)Broadcast
spring boot 中定時器的使用
有時候,我們需要我們的專案定時的去執行一些方法 要想在spring boot 中使用定時器,其實非常簡單 第一步: 在spring boot的入口處新增@EnableScheduling這個註解,如下 @SpringBootApplication @EnableScheduling
[STM32F103]定時器中斷
l 使能定時器時鐘。 RCC_APB1PeriphClockCmd(); l 初始化定時器,配置ARR,PSC。 TIM_TimeBaseInit(); l 開啟定時器中斷,配置NVIC。 void TIM_ITConfig(); NVIC_Init(
微控制器MSP430 - Timer_A 定時器中斷程式
一、利用定時器定時功能,實現定時器單個溢位中斷,實現 P3.0 方波輸出 #include "cc430x613x.h" void main() { WDTCTL = WDTPW + WDTHOLD; // 停止看門狗定時器 P3DIR |=
stm32f103定時器中斷
stm32為我們提供了8個定時器,分為:通用是定時器(TIM2~TIM5),高階定時器(TIM1和TIM8),基本定時器(TIM6和TIM7)。 至於三者之間的區別可以參考以下部落格:https://blog.csdn.net/dukai392/article/details/72058041
ZYNQ-7000私有定時器中斷
轉自:https://blog.csdn.net/RZJMPB/article/details/50812579 本片文章將在ZYNQ的純PS裡實現私有定時器中斷。每個一秒中斷一次,在中斷函式裡計數加1,通過串列埠列印輸出。 *本文所使用的開發板是Miz702(相容zedb
C6678定時器中斷學習180614
第一次寫部落格,希望能夠在兩年內記錄一下自己的學習歷程。目前剛開始接觸DSP,所以在學習DSP上會對多寫點,如果有不對的地方 希望大家能夠不吝賜教! 話不多說,接觸的6678板子,所以先從6678的中斷部分開始寫起,之前寫了一個GPIO的,但是樓主發現腦子短路了,因為沒有外部中斷GPIO
C51--點亮LED燈(for迴圈、while迴圈、定時器中斷迴圈)
第一步:開啟keil4,建立工程,at89c52。 1.點亮第一個LED燈 #include<reg52.h> sbit led=P2^0; void main() { led=0;//低電平亮 } 2.利用延時來使LED 1秒閃爍,500ms變
性能測試七:jmeter進階之文件上傳下載、定時器
同步 ner 功能 get 普通 web-inf bubuko 限制 tomcat-7 一、上傳下載 上傳: 1,POST請求,勾選 use …for post 2,同請求一起發送文件裏,填寫文件名稱,參數名稱 3,MIME類型: application/octet-str