Емельянов Эдуард Владимирович (eddy_em) wrote,
Емельянов Эдуард Владимирович
eddy_em

Мигаю диодом на STM32-P103

Итак, оказалось, что программатор "не видел" мою макетку из-за того, что к ней надо было подключить питание (хотя бы по 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 вызывает краткое "блымкание" светодиода.

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


Tags: stm32, железяки
Subscribe

  • Контроллер вентиляторов

    Потихоньку допиливаю контроллер. Забыл сегодня на работе взять платиновый терморезистор для аттестации терморезисторов, которые там используются…

  • "Звезды" на STM8

    Я уже писал о том, что на новогодний концерт сделал управление "звездами" на основе STM8. Сам концерт можете посмотреть на youtube (на всякий…

  • Андроидоуправлялка

    Хоть ардуина - редкостная дрянь, но благодаря ей появилась уйма приложений под андроид, позволяющих через bluetooth-uart модуль контролировать разную…

promo eddy_em august 17, 2019 12:33 3
Buy for 10 tokens
Юра намедни напечатал корпус для хронометра. Для первого блина получилось неплохо: И еще немного фотографий:
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic
  • 0 comments