Разгоняемся

Пробуем HSE * PLL на 72MHz (как завещал нам великий мануал) и немного похулиганим. Вобщем, алгоритм следующий:
1 мигаем 10 раз светодиодом на HSI
2 мигаем 20 раз на HSE*PLL9
3 мигаем 10 раз на HSE
4 мигаем 1000 раз на HSE*PLL16
где HSE=8MHz

Оформим все что связано с миганием, чтобы дальше не мешалось:

	macro
	blink $const
	movs r2,#$const
	bl blink
	mend

blink
	push {lr}
	ldr r0,=gpioa
metka4
	mov r1,#setp0
	str r1,[r0,#pbsrr]	;set pin A0
	bl pause
	mov r1,#resp0
	str r1,[r0,#pbsrr]	;res pin A0
	bl pause
	subs r2,#1
	it eq
	popeq {pc}
	b metka4

pause
	ldr r4,=2000000
pause_0
	subs r4,#1
	it ne
	bne pause_0
	bx lr


А теперь главная прога:

	movs r10,#0
	movs r11,#1

	setbit 	rcc, rcc_apb2enr, iopa_bit ;porta clock enable

;gpio config
	ldr r0,=gpioa
	ldr r1,[r0,#pcrl]	;read pins0-7 config
	movs r2,#cnf0m2		;push-pull 2MHz
	bfi r1,r2,#cnfpin0,#4	;pina0 - push-pull
	str r1,[r0,#pcrl]	;write pins0-7 config

	blink 10	;мигнем 10 раз
;----------------------------------------------------
	setbit rcc, rcc_cr, hse_bit	;hse on
hse_not_ready
	getbit rcc,rcc_cr, hserdy_bit	;hse ready ?
	beq hse_not_ready               ;hse ready
	setbits rcc, rcc_cfgr, sw_lbs, sw_width, sw_hse ;selected hse as system clock
	setbit flash_acr, 0, prftbs_bit	;prefetch is enabled
	setbit flash_acr, 0, latency_two_bit ;latency2

	ldr r0,=rcc
	ldr r1,[r0,#rcc_cfgr]
	movs r2,#hpre_d1
	bfi r1,r2,#hpre_lsb,#hpre_width	  ;hclk=sysclk
	movs r2,#ppre2_d1
	bfi r1,r2,#ppre2_lsb,#ppre2_width ;pclk2=hclk (72MHz max)
	movs r2,#ppre1_d2
	bfi r1,r2,#ppre1_lsb,#ppre1_width ;pclk1=hclk/2 (36MHz max)
	orr r1,#pllsrc_on       ;clock from prediv1 as pll input clock
	and r1,#pllxtpre_off	;hse clock not divided
	movs r2,#pllmul_x9
	bfi r1,r2,#pllmul_lsb,#pllmul_width	;set pll mul x9
	str r1,[r0,#rcc_cfgr]


	setbit rcc, rcc_cr, pll_bit	;pll on
rcc_config1
	getbit rcc, rcc_cr, pllrdy_bit	;pll ready ?
	beq rcc_config1			;not ready

	setbits rcc, rcc_cfgr, sw_lbs, sw_width, sw_pll	;pll selected as system clock

rcc_config2
	ldr r1,[r0,#rcc_cfgr]
	and r1,#2_1100
	cmp r1,#2_1000		;pll selected ?
	bne rcc_config2		;not

	blink 20			;мигнем 20 раз
;-----------------------------------------------------
	setbits rcc, rcc_cfgr, sw_lbs, sw_width, sw_hse	;hse selected as system clock
	resbit rcc, rcc_cr, pll_bit	;pll off

	setbits flash_acr, 0, latency_lbs, latency_width, latency_zero ;latency0
	blink 10			;мигнем 10 раз
;-------------------------------------------------------
	setbits flash_acr, 0, latency_lbs, latency_width, latency_two ;latency2

	ldr r0,=rcc
	ldr r1,[r0,#rcc_cfgr]
	movs r2,#hpre_d1
	bfi r1,r2,#hpre_lsb,#hpre_width	  ;hclk=sysclk
	movs r2,#ppre2_d2
	bfi r1,r2,#ppre2_lsb,#ppre2_width ;pclk2=hclk/2 (128/2) APB2 prescaler
	movs r2,#ppre1_d4
	bfi r1,r2,#ppre1_lsb,#ppre1_width ;pclk1=hclk/4 (128/4) APB1 prescaler
	orr r1,#pllsrc_on	;clock from prediv1 as pll input clock
	and r1,#pllxtpre_off	;hse clock not divided
	movs r2,#pllmul_x16
	bfi r1,r2,#pllmul_lsb,#pllmul_width ;set pll mul x16
	str r1,[r0,#rcc_cfgr]

	setbit rcc, rcc_cr, pll_bit	;pll on
rcc_config3
	getbit rcc, rcc_cr, pllrdy_bit	;pll ready ?
	beq rcc_config3			;not ready

	setbits rcc, rcc_cfgr, sw_lbs, sw_width, sw_pll	;pll selected as system clock

rcc_config4
	ldr r1,[r0,#rcc_cfgr]
	and r1,#2_1100
	cmp r1,#2_1000		;pll selected ?
	bne rcc_config4	        ;not

	blink 1000			;мигнем 1000 раз
;-------------------------------------------------------
m1	b m1
	END

Не загонял все в макросы для наглядности. Поигрался с латентностью. Занятно. Пауза при мигании на бооольшом количестве переходов, поэтому латентность флэша не дает правильно визуально оценить разницу между частотами. Увеличиваем частоту — увеличиваем латентность — увеличивается пауза. А разгоняется хорошо. При latency2 вроде бы полет нормальный, а при 1 уже виснет. Вобщем, как-то так.
  • +2
  • 13 апреля 2011, 12:10
  • psv

Комментарии (1)

RSS свернуть / развернуть
stm32 неплохо гонится, ага. А вот LPC нифига :(
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.