eddy_em: (hram nauki)
[personal profile] eddy_em
Итак, оказалось, что программатор "не видел" мою макетку из-за того, что к ней надо было подключить питание (хотя бы по USB). Хотя при подключении ST-LINK светодиод питания на макетке горел...
Для начала я стащил отсюда простенькие демо и попробовал скомпилировать и загрузить. Как ни странно, получилось.


Итак, уворованный код для морганием светодиодом был немного изменен:

#include "lib/stm32f10x_lib.h"
#include "lib/stm32f10x_map.h"
#include "lib/stm32f10x_rcc.h"
#include "lib/stm32f10x_gpio.h"

#include "lib/bits.h"

#define STACK_TOP 0x20000800
#define NVIC_CCR ((volatile unsigned long *)(0xE000ED14))
//Declarations
void nmi_handler(void);
void hardfault_handler(void);
int main(void);
void myDelay(unsigned long delay );
void Clk_Init(void);
void gpio_Init(void);

// Define the vector table
unsigned int * myvectors[4]
	__attribute__ ((section("vectors")))= {
	(unsigned int *)	0x20000800,	// stack pointer
	(unsigned int *) 	main,		// code entry point
	(unsigned int *)	nmi_handler,		// NMI handler (not really)
	(unsigned int *)	hardfault_handler		// hard fault handler (let's hope not)
};

int main(void){
	*NVIC_CCR = *NVIC_CCR | 0x200; /* Set STKALIGN in NVIC */
	// Init clock system
	Clk_Init();
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA, ENABLE);
	gpio_Init();
	unsigned char btn_old_state = 0, btn_state;
	while(1){
		btn_state = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
		if (btn_old_state == 0 && btn_state == 1){
			GPIO_Write(GPIOC, 0);
			myDelay(500000);
			GPIO_Write(GPIOC, GPIO_Pin_12);
		}
		btn_old_state = btn_state;
	}
}

void gpio_Init(){
	GPIO_InitTypeDef gpio;
	GPIO_StructInit(&gpio);
	GPIO_WriteBit(GPIOC,GPIO_Pin_12,Bit_SET);
	gpio.GPIO_Pin =  GPIO_Pin_12;
	gpio.GPIO_Mode = GPIO_Mode_Out_PP;
	gpio.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC, &gpio);

	gpio.GPIO_Pin =  GPIO_Pin_0;
	gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	//gpio.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &gpio);
}

void nmi_handler(void){
	return ;
}

void hardfault_handler(void){
	return ;
}
//Functions definitions
void myDelay(unsigned long delay){
  while(delay) delay--;
}

void Clk_Init (void){
	// 1. Cloking the controller from internal HSI RC (8 MHz)
	RCC_HSICmd(ENABLE);
	// wait until the HSI is ready
	while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
	RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
	// 2. Enable ext. high frequency OSC
	RCC_HSEConfig(RCC_HSE_ON);
	// wait until the HSE is ready
	while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);
	// 3. Init PLL
	RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); // 72MHz
	//  RCC_PLLConfig(RCC_PLLSource_HSE_Div2,RCC_PLLMul_9); // 72MHz
	RCC_PLLCmd(ENABLE);
	// wait until the PLL is ready
	while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
	// 4. Set system clock divders
	RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);
	RCC_ADCCLKConfig(RCC_PCLK2_Div8);
	RCC_PCLK2Config(RCC_HCLK_Div1);
	RCC_PCLK1Config(RCC_HCLK_Div2);
	RCC_HCLKConfig(RCC_SYSCLK_Div1);
	// Flash 1 wait state
	*(vu32 *)0x40022000 = 0x12;
	// 5. Clock system from PLL
	RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
}


Подключаем к USB нашу макетку STM32-P103, прошивалку ST-LINK/V2 и соединяем их JTAG-разъемы шлейфом (шел в комплекте с прошивалкой). Компиляем и прошиваем:

make && st-flash write main.bin 0x08000000
.compiling
arm-none-eabi-gcc -I./ -c -fno-common -O0 -g -mcpu=cortex-m3 -mthumb  main.c
..linking
arm-none-eabi-ld -v -Tstm_h103_blink_rom.cmd -nostartfiles -o main.out main.o stm32f10x_rcc.o stm32f10x_gpio.o
GNU ld (Sourcery CodeBench Lite 2012.03-56) 2.21.53.20110905
...copying
arm-none-eabi-objcopy -Obinary main.out main.bin
arm-none-eabi-objdump -S main.out > main.list
2012-10-10T11:58:07 INFO src/stlink-common.c: Loading device parameters....
2012-10-10T11:58:07 INFO src/stlink-common.c: Device connected is: F1 Medium-density device, id 0x20036410
2012-10-10T11:58:07 INFO src/stlink-common.c: SRAM size: 0x5000 bytes (20 KiB), Flash: 0x20000 bytes (128 KiB) in pages of 1024 bytes
2012-10-10T11:58:07 INFO src/stlink-common.c: Attempting to write 4688 (0x1250) bytes to stm32 address: 134217728 (0x8000000)
Flash page at addr: 0x08001000 erased
2012-10-10T11:58:07 INFO src/stlink-common.c: Finished erasing 5 pages of 1024 (0x400) bytes
2012-10-10T11:58:07 INFO src/stlink-common.c: Starting Flash write for VL core id
2012-10-10T11:58:07 INFO src/stlink-common.c: Successfully loaded flash loader in sram
  4/4 pages written
2012-10-10T11:58:07 INFO src/stlink-common.c: Starting verification of write complete
2012-10-10T11:58:07 INFO src/stlink-common.c: Flash written and verified! jolly good!

Отлично! Теперь нажатие на кнопку wakeup вызывает краткое "блымкание" светодиода.

Что ж, начало положено. Теперь надо изучать возможности контроллера и навешивать периферию.


This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org

October 2025

S M T W T F S
   1234
567 89 1011
121314 15161718
19202122232425
2627 28293031 

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 27th, 2026 02:54 am
Powered by Dreamwidth Studios