5. CH働NG 2: ARM STM32F1X
PHAN VN HON 11
0x4000 1000 - 0x4000 13FF TIM6 timer
0x4000 0C00 - 0x4000 0FFF TIM5 timer
0x4000 0800 - 0x4000 0BFF TIM4 timer
0x4000 0400 - 0x4000 07FF TIM3 timer
0x4000 0000 - 0x4000 03FF TIM2 timer
2.4.2 畛a ch畛 c畛a SRAM ( 畛a ch畛 n畛n 0x20000000)
C叩c vi i畛u khi畛n thu担c d嘆ng STM32F1c坦 th畛 c坦 t畛i a 64 Kbyte b畛 nh畛 RAM. B畛 nh畛
ny c坦 th畛 動董c truy xu畉t theo byte, n畛a word (16 bit) ho畉c l c畉 word (32 bit).
2.4.3 畛a ch畛 c畛a FLASH ( 畛a ch畛 n畛n 0x0800 0000)
B畛 nh畛 Flash c坦 nh畛ng 畉c i畛m sau:
畛i v畛i d嘆ng XL-density: b畛 nh畛 Flash c坦 k鱈ch th動畛c l 1Mbyte v 動畛c chia ra lm
2 bank m畛i bank 512 Kbytes.
畛i v畛i c叩c d嘆ng kh叩c th狸 b畛 nh畛 Flash c坦 k鱈ch th動畛c t畛i a l 512 Kbytes.
B畛 nh畛 Flash 動畛c chia ra lm 2 kh畛i v kh畛i ch鱈nh ( main block) v kh畛i th担ng tin
(information block).
Ngoi vi畛c l動u ch動董ng tr狸nh Flash c嘆n 動畛c s畛 d畛ng 畛 l動u c叩c th担ng tin ng動畛i d湛ng
nh動 vai tr嘆 c畛a 1 EPROM.
Cho ph辿p b畉o v畛 畛c v ghi.
B畉ng 2.2 Ph畉m vi main block c畛a c叩c d嘆ng ARM
D嘆ng ARM Dung l動董ng Flash t畛i a Ph畉m vi main block
Low-density 32 Kbytes 0x0800 0000 - 0x0800 7FFF
Medium-density 128 Kbytes 0x0800 0000 - 0x0801 FFFF
High-density 512 Kbytes 0x0800 0000 - 0x0807 FFFF
XL-density 1 Mbyte 0x0800 0000 - 0x080F FFFF
Connectivity line 256 Kbytes 0x0800 0000 - 0x0803 FFFF
Ch炭 箪: Khi mu畛n s畛 d畛ng b畛 nh畛 Flash 畛 l動u tr畛 d畛 li畛u nh動 vai tr嘆 c畛a m畛t EPROM
th狸 ta n棚n d畛a vo b畉ng 2.2 畛 bi畉t 動畛c ph畉m vi c畛a b畛 nh畛 Flash 畛ng v畛i d嘆ng ta ang s畛
d畛ng 畛 t畛 坦 c坦 th畛 ch畛n v湛ng 畛a ch畛 cu畛i b畛 nh畛 lm n董i l動u tr畛( v狸 n畉u ch畛n v湛ng 畛a ch畛
畉u c坦 th畛 d畛 li畛u s畉 竪 l棚n ch動董ng tr狸nh).
畛a ch畛 b畉t 畉u c畛a b畛 nh畛 Flash l 0x08000000 v 動畛c chia ra lm nhi畛u page. K鱈ch
th動畛c c畛a m畛t page ph畛 thu畛c vo phi棚n b畉n ARM. 畛i v畛i b畉n low v medium density th狸 m畛i
page l 1 Kbytes, b畉n high density th狸 m畛i page c坦 2 Kbytes. M畛i khi mu畛n ghi d畛 li畛u vo Flash
ta c畉n ph畉i x坦a h畉t d畛 li畛u trong page mu畛n ghi ngay c畉 khi ch畛 mu畛n ghi 1 byte.
a. C叩c l畛nh th担ng d畛ng li棚n quan 畉n FLASH
B畉ng 2.3 C叩c l畛nh c董 b畉n li棚n quan 畉n FLASH
S畛 D畛NG TH働 VI畛Nstm32f10x_flash
L畛nh
Th担ng s畛 hay d湛ng Gi畉i th鱈ch
FLASH_Unlock();
(L畛nh m畛 kh坦a 畛 cho ph辿p x坦a Flash)
6. CH働NG 2: ARM STM32F1X
12 PHAN VN HON
FLASH_ClearFlag(A);
(L畛nh x坦a c叩c c畛 b叩o tr畉ng th叩i c畛a Flash)
A:
FLASH_FLAG_PGERR
FLASH_FLAG_WRPRTERR
FLASH_FLAG_EOP
A: C畛 c畉n x坦a
L畛i n畉p ch動董ng tr狸nh
L畛i b畉o v畛 ghi
X畛 l箪 xong y棚u c畉u
FLASH_ErasePage(A);
(L畛nh x坦a 1 Page)
A: 畛a ch畛 Page c畉n x坦a A: 畛a ch畛 32 bit
FLASH_ProgramHalfWord(A, B);
(L畛nh ghi n畛a word-16 bit vo Flash)
A: 畛a ch畛 c畛a n畛a word c畉n ghi
B: Gi叩 tr畛 c畉n ghi
A: 畛a ch畛 32 bit
B: Gi叩 tr畛 16 bit
FLASH_ProgramWord(A,B);
(L畛nh ghi 1 word-32 bit vo Flash)
A: 畛a ch畛 c畛a word c畉n ghi
B: Gi叩 tr畛 c畉n ghi
A: 畛a ch畛 32 bit
B: Gi叩 tr畛 32 bit
FLASH_Lock();
(L畛nh kh坦a Flash 畛 ch畛ng x坦a d畛 li畛u)
b. V鱈 d畛 v畛 ghi v 畛c d畛 li畛u t畛 b畛 nh畛 FLASH
V鱈 d畛 2.1: Vi畉t ch動董ng tr狸nh con l動u 100 s畛 16 bit c畛a m畉ng unsigned short datasave[100]
vo page cu畛i b畛 nh畛 Flash c畛a ARM STM32F103VET6 v 畛ng th畛i vi畉t ch動董ng tr狸nh con
畛c v畛 c叩c gi叩 tr畛 達 l動u 畛 l動u l畉i vo m畉ng unsigned short dataread[100]
a. T鱈nh to叩n 畛a ch畛
ARM STM32F103VET6 l d嘆ng high density c坦 Flash 512 Kbytes, m畛i page 2 Kbytes
Page cu畛i c湛ng l page s畛: (512:2) -1=255
畛a ch畛 page cu畛i c湛ng = 255*2048+0x08000000 = 0x0807F800
b. Ch動董ng tr狸nh
void WriteFlash()
{ char i;
FLASH_Unlock();
// M畛 kh坦a Flash cho ph辿p x坦a d畛 li畛u
FLASH_ClearFlag(FLASH_FLAG_EOP
|FLASH_FLAG_PGERR
|FLASH_FLAG_WRPRTERR);
// X坦a c叩c c畛 b叩o tr畉ng th叩i c畛a Flash
FLASH_ErasePage(0x0807F800);
// X坦a page c畉n ghi
for(i =0; i<100; i++)
FLASH_ProgramHalfWord(0x0807F800 + i*2,datasave[i]);
// Ghi 100 s畛 16 bit vo Flash
FLASH_Lock();
// Kh坦a Flash 畛 c畉m x坦a
}
void ReadFlash()
{
char i;
7. CH働NG 2: ARM STM32F1X
PHAN VN HON 13
for(i=0; i<100; i++)
dataread[i] = *(unsigned int *)(0x0807F800 + i*2);
// 畛c 100 s畛 16 bit t畛 Flash v畛
}
2.5 BIT BAND C畛A ARM STM32F1X
C叩c phi棚n b畉n ARM tr動畛c ch畛 c坦 th畛 th畛c hi畛n thao t叩c bit tr棚n v湛ng nh畛 SRAM v v湛ng
nh畛 ngo畉i vi b畉ng c叩c l畛nh AND v OR. i畛u ny 嘆i h畛i CPU ph畉i t畛n nhi畛u th畛i gian cho vi畛c
畛c s畛a 畛i ghi l畉i d畛 li畛u vo b畛 nh畛.
K畛 thu畉t bit band cho ph辿p b畛 x畛 l箪 ARM STM32F1 thao t叩c bit tr畛c ti畉p m kh担ng c畉n
d湛ng ph辿p AND hay OR do 坦 gi炭p gi畉m thi畛u th畛i gian th畛c hi畛n.
Bit band ho畉t 畛ng b畉ng c叩ch 叩nh x畉 m畛i bit trong bit band region t畛i m畛t 畛a ch畛
word trong v湛ng bit band alias v b畉ng c叩ch 畉t (set) hay x坦a (clear) word ny ta c坦 th畛 畉t
ho畉c x坦a bit t動董ng 畛ng trong bit band region.
H狸nh 2.4 Bit band c畛a v湛ng nh畛 SRAM v ngo畉i vi
C担ng th畛c t鱈nh 畛a ch畛 c畛a 1 bit thu畛c Bit band region 動畛c 叩nh x畉 trong Bit band alias :
畛a ch畛 trong Bit Band Alias = Bit Band Alias Base Address + Bit Word Offset
Bit Word Offset = Byte offset from Bit Band Region Base * 32 + bit number * 4
2.5.1 V鱈 d畛 v畛 s畛 d畛ng bit band
Y棚u c畉u: S畛 d畛ng k畛 thu畉t Bit Band 畛 i畛u khi畛n s叩ng ho畉c t畉t LED 動畛c k畉t n畛i v畛i ch但n
B8. Bi畉t thanh ghi ng探 ra c畛a PORTB (GPIOB_ODR) c坦 畛a ch畛 offset l 0x0C v 畛a ch畛 n畛n
(Base Address) c畛a PORTB l 0x40010C00.
( C叩c th担ng s畛 tr棚n c坦 th畛 xem trong datasheet ho畉c xem trong file stm32f10x.h)
8. CH働NG 2: ARM STM32F1X
14 PHAN VN HON
a. T鱈nh to叩n 畛a ch畛
T狸m Bit Band Alias Base Address : Do PORTB l ngo畉i vi n棚n
Bit Band Alias Base Address = 0x42000000
T狸m Bit Word Offset :
Byte offset from Bit Band Region Base = 0x40010C0C - 0x40000000 = 0x10C0C
V畛i : 0x40000000 l Peripheral Bit Band Region Base Address
0x40010C0C l 畛a ch畛 v畉t l箪 c畛a GPIOB_ODR = 0x40010C00 + 0x0C
Bit Word Offset = 0x10C0C *32 + 8*4 = 0x2181A0
V畉y ta c坦 :
畛a ch畛 trong v湛ng Bit Band Alias c畛a Bit 8 GPIOB_ODR (GPIOB_ODR_Bit8)
GPIOB_ODR_Bit8 = 0x42000000 + 0x2181A0 = 0x422181A0
b. L畉p tr狸nh
Khi l畉p tr狸nh ta c坦 th畛 t畉o 1 con tr畛 畉n 畛a ch畛 ny b畉ng 畛nh ngh挑a sau:
#define PB8 (*(unsigned long *)0x422181A0)
Ch炭 箪: 畛 kh畛i t畛n c担ng t鱈nh to叩n nh動 tr棚n ta c坦 th畛 畛nh vi畉t nh動 sau:
#define Bitband(ad,bn) *(unsigned long*)
((ad&0xF0000000)+0x2000000+((ad&0xFFFFF)*32)+ bn*4)
#define PB8 Bitband((unsigned long)&GPIOB->ODR,8)
L炭c ny ta c坦 th畛 i畛u khi畛n t畉t m畛 LED 畛 ch但n B8 m畛t c叩ch d畛 dng b畉ng 2 l畛nh sau:
PB8 =1; // Ch但n B8 l棚n m畛c 1
PB8 =0; // Ch但n B8 xu担ng m畛c 0
2.6 C畉U HNH BOOT CHO ARM STM32 F1
D嘆ng STM32F1 c坦 3 ch畉 畛 boot 動畛c ch畛n b畛i 2 ch但n BOOT[1:0] theo b畉ng 2.4.
B畉ng 2.4 C叩c ch畉 畛 boot c畛a ARM STM32F1
Tr畉ng th叩i ch但n boot
Ch畉 畛 boot Gi畉i th鱈ch
BOOT1 BOOT1
x 0 B畛 nh畛 Flash ch鱈nh Ch畛n boot t畛 b畛 nh畛 Flash ch鱈nh
0 1 B畛 nh畛 h畛 th畛ng Ch畛n boot t畛 b畛 nh畛 h畛 th畛ng
1 1 SRAM Ch畛n boot t畛 b畛 nh畛 SRAM
Tr畉ng th叩i c畛a c叩c ch但n BOOT 動畛c c畉p nh畉t vo th畛i i畛m c坦 c畉nh l棚n th畛 4 c畛a xung
SYSCLK sau khi Reset. Vi畛c ch畛n ch畉 畛 boot ph畛 thu畛c vo vi畛c ci 畉t c畛a ng動畛i d湛ng 畛i
v畛i 2 ch但n BOOT1 v BOOT0 v tr畉ng th叩i c叩c ch但n boot ny s畉 動畛c c畉p nh畉t l畉i sau m畛i l畉n
tho叩t kh畛i ch畉 畛 Standby.
Boot loader 動畛c l畉p tr狸nh b畛i h達ng ST v m畉c 畛nh l動u trong b畛 nh畛 h畛 th畛ng. Boot
loader 動畛c s畛 d畛ng 畛 n畉p ch動董ng tr狸nh vo b畛 nh畛 Flash b畉ng m畛t s畛 chu畉n truy畛n n畛i ti畉p:
畛i v畛i c叩c d嘆ng low, medium, high density th狸 boot loader s畛 d畛ng USART1 畛 n畉p
ch動董ng tr狸nh vo Flash
畛i v畛i d嘆ng conectivity line th狸 boot loader s畛 d畛ng USART1, USART2 (remap),
CAN2 (remap) ho畉c USB OTG FS ho畉t 畛ng 畛 ch畉 畛 DFU-Device Firmware
Upgrade
Trong ch畉 畛 ny USART s畉 ho畉t 畛ng nh畛 giao 畛ng n畛i 8 Mhz (HSI) c嘆n CAN v
USB ch畛 c坦 th畛 ho畉t 畛ng nh畛 giao 畛ng ngo畉i HSE khi k畉t n畛i v畛i th畉ch anh 8 Mhz, 14.7456
MHz ho畉c 25 MHz.
9. CH働NG 2: ARM STM32F1X
PHAN VN HON 15
2.7 C畉P NGU畛N CHO ARM STM32F1
Ngu畛n cung c畉p cho ARM (VDD) ph畉i n畉m trong ph畉m vi t畛 2 畉n 3.6 V( th動畛ng c畉p
3.3V) . M畛t b畛 i畛u ch畛nh i畛n 叩p b棚n trong 動畛c s畛 d畛ng 畛 cung c畉p ngu畛n 1.8V cho l探i i畛u
khi畛n, SRAM v ngo畉i vi s畛.
畛ng h畛 th畛i gian th畛c( RTC) v c叩c thanh ghi backup 動畛c c畉p ngu畛n b畉ng Pin 3V vo
ch但n VBAT 畛 h畛 th畛ng v畉n 畛nh th畛i 炭ng khi t畉t ngu畛n VDD. N畉u kh担ng d湛ng ngu畛n Pin th狸
ch但n VBAT ph畉i 動畛c n畛i l棚n ngu畛n VDD v c畉n 動畛c l畛c nhi畛u b畉ng t畛 100 nF.
C叩c ch但n VDDA v VSSA ph畉i 動畛c k畉t n畛i t動董ng 畛ng v畛i VDD v VSS xem h狸nh 2.5
Ch但n VREF- ph畉i 動畛c n畛i v畛i VSSA n畉u vi i畛u khi畛n 動畛c d湛ng c坦 ch但n ny.
畛i v畛i c叩c phi棚n b畉n ARM 100 ch但n v 144 ch但n ch但n VREF+ c畛a ADC v DAC 動畛c
thi畉t k畉 ri棚ng, 畛 tng 畛 ch鱈nh x叩c c畛a k畉t qu畉 chuy畛n 畛i ng動畛i d湛ng n棚n n畛i ch但n ny v畛i
m畛t ngu畛n cung c畉p 畛c l畉p v畛i VDD. Gi叩 tr畛 i畛n 叩p cung c畉p cho VREF+ n畉m trong ph畉m vi t畛
2.4V t畛i VDD.
畛i v畛i c叩c phi棚n b畉n ARM 64 ch但n tr畛 xu畛ng th狸 ch但n VREF+ v VREF- kh担ng t畛n t畉i v狸
ch炭ng 達 動畛c k畉t n畛i b棚n trong v畛i ngu畛n c畉p cho ADC (VDDA v VSSA).
2.7.1 Kh畛i i畛u ch畛nh i畛n 叩p( Voltage regulator)
Kh畛i i畛u ch畛nh i畛n 叩p lu担n 動畛c m畛 ngay sau khi Reset. Kh畛i ny c坦 th畛 lm vi畛c 畛
3 ch畉 畛 kh叩c nhau:
Trong ch畉 畛 Run kh畛i i畛u ch畛nh i畛p 叩p cung c畉p ngu畛n 1.8V cho t畉t c畉 c叩c kh畛i
s畛 d畛ng ngu畛n ny nh動 l l探i x畛 l箪, b畛 nh畛 v c叩c ngo畉i vi s畛.
Trong ch畉 畛 Stop kh畛i i畛u ch畛nh i畛n 叩p ch畛 cung c畉p ngu畛n 1.8V cho SRAM 畛
b畉o v畛 d畛 li畛u c畛a c叩c thanh ghi trong SRAM.
Trong ch畉 畛 Standby kh畛i i畛u ch畛nh i畛n 叩p b畛 t畉t i do 坦 d畛 li畛u SRAM b畛 m畉t
i ch畛 tr畛 c叩c thanh ghi c畛a Standby circuitry v Backup Domain.
H狸nh 2.5 T畛ng quan v畛 c叩c l畉i ngu畛n c畉p cho STM32F1x
10. CH働NG 2: ARM STM32F1X
16 PHAN VN HON
H狸nh 2.6 S董 畛 nguy棚n l箪 m畉ch k畉t n畛i c董 b畉n cho ARM STM32F1
2.8 CC CH畉 畛 TI畉T KI畛M NNG L働畛NG
M畉c 畛nh sau khi Power Reset th狸 vi i畛u khi畛n ho畉t 畛ng 畛 ch畉 畛 Run. B棚n c畉nh ch畉
畛 Run h達ng ST c滴ng 達 thi畉t k畉 m畛t vi ch畉 畛 ti畉t ki畛m nng l動畛ng nh畉m gi畉m c担ng su畉t ti棚u
th畛 c畛a CPU khi CPU kh担ng c畉n ph畉i ho畉t 畛ng, v鱈 d畛 nh動 khi CPU ang ch畛 s畛 ki畛n t叩c 畛ng
t畛 b棚n ngoi. C叩c ch畉 畛 ti畉t ki畛m nng l動畛ng ny c坦 th畛 動畛c l畉p tr狸nh b畉ng ph畉n m畛m.
D嘆ng ARM STM32F1 c坦 3 ch畉 畛 ti畉t ki畛m nng l動畛ng sau:
Ch畉 畛 Sleep ( ng畛): T畉t ngu畛n xung clock c畛a CPU, nh動ng t畉t c畉 c叩c ngo畉i vi k畛 c畉
c叩c ngo畉i vi c畛a l探i Cortex-M3 nh動 l NVIC, SysTick, v畉n ho畉t 畛ng.
Ch畉 畛 Stop (d畛ng) : T畉t h畉t t畉t c畉 c叩c ngu畛n xung clock.
Ch畉 畛 Standby(ch畛): T畉t ngu畛n 1.8V, lm ch畉m l畉i SYSCLK, ch畉n ngu畛n xung
clock c畉p cho c叩c ngo畉i vi thu畛c APB v AHB khi kh担ng d湛ng 畉n.
2.8.1 Ch畉 畛 Sleep
a. C叩ch 動a CPU vo ch畉 畛 Sleep
動a CPU vo ch畉 畛 Sleep b畉ng c叩ch th畛c thi c叩c l畛nh WFI( Wait For Interrup- Ch畛 x畉y
ra ng畉t) ho畉c WFE( Wait For Event- Ch畛 x畉y ra s畛 ki畛n) Ch動董ng 5 s畉 tr狸nh by r探 h董n v畛
ng畉t v s畛 ki畛n.
11. CH働NG 2: ARM STM32F1X
PHAN VN HON 17
T湛y thu畛c vo tr畉ng th叩i bit SLEEPONEXIT trong thanh ghi Cortex-M3 System
Control m ta c坦 c叩c ch畉 畛:
Sleep now: Khi bit SLEEPONEXIT = 0, CPU s畉 r董i vo ch畉 畛 Sleep ngay sau khi
l畛nh WFI hay WFE 動畛c th畛c hi畛n xong.
Sleep on exit: Khi bit SLEEPONEXIT = 1, CPU s畉 r董i vo tr畉ng th叩i Sleep ngay sau
khi tho叩t kh畛i ng畉t c坦 畛 動u ti棚n th畉p nh畉t.
Trong ch畉 畛 Sleep t畉t c畉 c叩c ch但n I/O v畉n gi畛 gi叩 tr畛 c滴 nh動 khi 畛 ch棚 畛 Run.
b. C叩ch 動a CPU vo ch畉 畛 Sleep
N畉u tr動畛c 坦 s畛 d畛ng l畛nh WFI 畛 動a CPU vo ch畉 畛 Sleep th狸 畛 tho叩t kh畛i ch畉 畛
ny c畉n ph畉i x畉y ra m担t ng畉t ngo畉i vi 動畛c cho ph辿p b畛i NVIC(xem ch動董ng 5).
N畉u tr動畛c 坦 s畛 d畛ng l畛nh WFE 畛 動a CPU vo ch畉 畛 Sleep th狸 CPU s畉 tho叩t kh畛i ch畉
畛 ny ngay khi x畉y ra 1 s畛 ki畛n. S畛 ki畛n ny c坦 th畛 動畛c t畉o ra b畉ng c叩ch:
Cho ph辿p ng畉t 畛 ngo畉i vi nh動ng kh担ng cho ph辿p ng畉t 畛 NVIC v cho ph辿p bit
SEVONPEND trong thanh ghi Cortex-M3 System Control. Khi CPU tho叩t kh畛i ch畉
畛 ti畉t ki畛m nng l動畛ng t畛 WFE th狸 c畉n ph畉i x坦a c叩c bit b叩o ng畉t 畛 ngo畉i vi v NVIC.
C畉u h狸nh k棚nh ng畉t (EXTI line) 畛 ch畉 畛 s畛 ki畛n( event). Khi CPU tho叩t kh畛i ch畉 畛
ti畉t ki畛m nng l動畛ng t畛 WFE th狸 kh担ng c畉n ph畉i x坦a c叩c c畛 ng畉t.
2.8.2 Ch畉 畛 Stop
Ch畉 畛 Stop l s畛 k畉t h畛p gi畛a ch畉 畛 DeepSleep (ng畛 s但u) c畛a l探i Cortex-M3 v畛i ch畉
畛 ki畛m so叩t ngu畛n xung clock ngo畉i vi. B畛 i畛u ch畛nh ngu畛n c坦 th畛 動畛c c畉u h狸nh theo ch畉
畛 b狸nh th動畛ng ho畉t ch畉 畛 ti畉t ki畛m nng l動畛ng.
Trong ch畉 畛 ny t畉t c畉 c叩c ngu畛n xung clock trong v湛ng 1.8V 畛u t畉t, c叩c b畛 giao 畛ng
PLL, HSI, HSE c滴ng 動畛c t畉t h畉t. D畛 li畛u trong SRAM 動畛c b畉o v畛 v t畉t tr畉ng th叩i t畉t c畉
c叩c I/O kh担ng thay 畛i.
a. C叩ch 動a CPU vo ch畉 畛 Stop
畛 vo ch畉 畛 Stop ta d湛ng l畛nh ch畛 ng畉t WFI ho畉c ch畛 s畛 ki畛n WFE k竪m theo:
畉t bit SLEEPDEEP c畛a thanh ghi Cortex-M3 System Control l棚n m畛c 1.
X坦a bit PDDS c畛a thanh thi Power Control register (PWR_CR) v畛 0 .
Ch畛n ch畉 畛 ho畉t 畛ng cho b畛 i畛u ch畛nh i畛n 叩p b畉ng c叩ch c畉u h狸nh bit LPDS trong
thanh ghi Power control register (PWR_CR).
Ch炭 箪: 畛 c坦 th畛 vo 動畛c ch畉 畛 Stop th狸 t畉t c畉 c叩c bit c畛 b叩o ng畉t ngoi trong thanh
ghi EXTI_PR v c畛 b叩o 畛ng c畛a 畛ng h畛 th畛i gian th畛c( RTC Alarm flag) ph畉i 動畛c x坦a
tr動畛c 坦 n畉u kh担ng ch畉 畛 Stop s畉 b畛 b畛 qua v ch動董ng tr狸nh ti畉p t畛c ho畉t 畛ng b狸nh th動畛ng.
b. C叩ch 動a CPU tho叩t kh畛i ch畉 畛 Stop
N畉u tr動畛c 坦 s畛 d畛ng l畛nh WFI 畛 動a CPU vo ch畉 畛 Stop th狸 畛 tho叩t kh畛i ch畉 畛 ny
c畉n ph畉i x畉y ra m担t ng畉t ngo畉i vi 動畛c cho ph辿p b畛i NVIC.
N畉u tr動畛c 坦 s畛 d畛ng l畛nh WFE 畛 動a CPU vo ch畉 畛 Stop th狸 CPU s畉 tho叩t kh畛i ch畉
畛 ny ngay khi x畉y ra 1 s畛 ki畛n.
2.8.3 Ch畉 畛 Standby
Ch畉 畛 Standby l ch畉 畛 ti畉t ki畛m nng l動畛ng nh畉t, Standby ho畉t 畛ng d畛a tr棚n vi畛c
動a CPU vo ch畉 畛 ng畛 s但u 畛ng th畛i t畉t b畛 i畛u ch畛nh i畛n 叩p 1.8V. C叩c kh畛i giao 畛ng
PLL, HSI, v HSE c滴ng b畛 t畉t h畉t. D畛 li畛u trong SRAM v c叩c thanh ghi b畛 m畉t ch畛 tr畛 c叩c
thanh ghi c畛a Backup domain v Standby circuitry l kh担ng m畉t.
Trong ch畉 畛 Standby tr畉ng th叩i t畉t c畉 c叩c I/O 畛u 畛 t畛ng tr畛 cao ngo畉i tr畛 :
Ch但n Reset v畉n c嘆n t叩c 畛ng 動畛c.
Ch但n TAMPER v ch但n WKUP n畉u 動畛c cho ph辿p tr動董c 坦 th狸 v畉n ho畉t 畛ng 動畛c.
a. C叩ch 動a CPU vo ch畉 畛 Standby
12. CH働NG 2: ARM STM32F1X
18 PHAN VN HON
畛 vo ch畉 畛 Standby ta d湛ng l畛nh ch畛 ng畉t WFI ho畉c ch畛 s畛 ki畛n WFE k竪m theo:
畉t bit SLEEPDEEP c畛a thanh ghi Cortex-M3 System Control l棚n m畛c 1.
畉t bit PDDS c畛a thanh thi Power Control register (PWR_CR) l棚n m畛c 1.
X坦a bit WUF trong thanh ghi Power Control/Status register (PWR_CSR).
b. C叩ch 動a CPU tho叩t kh畛i ch畉 畛 Standby
CPU s畉 tho叩t kh畛i ch畉 畛 Standby n畉u m畛t trong c叩c i畛u ki畛n sau x畉y ra:
C坦 t鱈n hi畛u c畉nh l棚n t叩c 畛ng vo ch但n WKUP
C坦 t鱈n hi畛u b叩o 畛ng c畛a 畛ng h畛 th畛i gian th畛c( RTC alarm).
Reset b畉ng ch但n NRST.
IWDG Reset.
2.8.4 T畛 畛ng th畛c d畉y (Auto Wakeup-AWU) t畛 c叩c ch畉 畛 ti畉t ki畛m nng l動畛ng
畛ng h畛 th畛i gian th畛c c坦 th畛 動畛c s畛 d畛ng 畛 叩nh th畛c CPU kh畛i ch畉 畛 ti畉t ki畛m nng
l動畛ng m kh担ng c畉n ph畉i ch畛 x畉y ra ng畉t ngoi. Ng動畛i l畉p tr狸nh c坦 th畛 ci 畉t m畛t l動畛ng th畛i
gian no 坦 vo RTC 畛 khi h畉t th畛i gian ny th狸 RTC s畉 t畛 畛ng 叩nh th畛c CPU kh畛i ch畉 畛
Stop ho畉c Standby.
畛 叩nh th畛c CPU kh畛i ch畉 畛 Stop b畉ng s畛 ki畛n RTC alarm th狸 c畉n ph畉i:
C畉u h狸nh k棚nh ng畉t ngoi s畛 17 (EXTI Line 17) t鱈ch c畛c c畉nh l棚n.
C畉u h狸nh RTC 畛 cho ph辿p t畉o ra t鱈n hi畛u RTC alarm.
畛 叩nh th畛c CPU kh畛i ch畉 畛 Standby, th狸 kh担ng c畉n c畉u h狸nh k棚nh ng畉t ngoi s畛 17.
2.8.5 C叩c l畛nh th担ng d畛ng li棚n quan 畉n ch畉 畛 ti畉t ki畛m nng l動畛ng
B畉ng 2.5 C叩c l畛nh th担ng d畛ng li棚n quan 畉n ch畉 畛 ti畉t ki畛m nng l動畛ng
S畛 D畛NG TH働 VI畛N stm32f10x_pwr
L畛nh
Th担ng s畛 hay d湛ng Gi畉i th鱈ch
PWR_DeInit();
(L畛nh reset c叩c thanh ghi li棚n quan 畉n ch畉 畛 ti畉t ki畛m nng l動畛ng v畛 m畉c 畛nh)
PWR_WakeUpPinCmd(A);
(L畛nh cho ph辿p ho畉c c畉m ch但n WakeUp 叩nh th畛c CPU)
A:
ENABLE
DISABLE
A: Cho ph辿p ho畉c c畉m
Cho ph辿p
C畉m
PWR_EnterSTOPMode(A, B) ;
( L畛nh i畛u khi畛n CPU vo ch畉 畛 Stop )
A:
PWR_Regulator_ON
PWR_Regulator_LowPower
B:
PWR_STOPEntry_WFI
PWR_STOPEntry_WFE
A: Ch畛n ch畉 畛 ho畉t 畛ng cho b畛 i畛u
ch畛nh i畛n 叩p khi CPU vo ch畉 畛 Stop
Ch畉 畛 ho畉t 畛ng b狸nh th動畛ng
Ch畉 畛 ti畉t ki畛m nng l動畛ng
B: Ch畛n c叩ch 動a CPU vo ch畉 畛 Stop
Ch畛 x畉y ra ng畉t
Ch畛 x畉y ra s畛 ki畛n
PWR_EnterSTANDBYMode();
(L畛nh i畛u khi畛n CPU vo ch畉 畛 Standby)
C叩c v鱈 d畛 v畛 c叩c ch畉 畛 ti畉t ki畛m nng l動畛ng 動畛c tr狸nh by 畛 ch動董ng 5 sau khi
SV 達 t狸m hi畛u v畛 ng畉t v s畛 ki畛n.