Мигаю диодом на STM32-P103
Oct. 10th, 2012 12:09 pmИтак, оказалось, что программатор "не видел" мою макетку из-за того, что к ней надо было подключить питание (хотя бы по USB). Хотя при подключении ST-LINK светодиод питания на макетке горел...
Для начала я стащил отсюда простенькие демо и попробовал скомпилировать и загрузить. Как ни странно, получилось.
Итак, уворованный код для морганием светодиодом был немного изменен:
Подключаем к USB нашу макетку STM32-P103, прошивалку ST-LINK/V2 и соединяем их JTAG-разъемы шлейфом (шел в комплекте с прошивалкой). Компиляем и прошиваем:
Отлично! Теперь нажатие на кнопку wakeup вызывает краткое "блымкание" светодиода.
Что ж, начало положено. Теперь надо изучать возможности контроллера и навешивать периферию.
Для начала я стащил отсюда простенькие демо и попробовал скомпилировать и загрузить. Как ни странно, получилось.
Итак, уворованный код для морганием светодиодом был немного изменен:
#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 вызывает краткое "блымкание" светодиода.
Что ж, начало положено. Теперь надо изучать возможности контроллера и навешивать периферию.