책부터 구입하고..
윤덕용씨의 "STM32F051 마스터"를 구입했는데.. "STM32F091 정복"이 왔다.
아마 이름이 비슷하여 옴사로 주문이 잘못 들어갔던지 배송담당자가 잘못 넣었는지 가격도 똑 같은데 그냥 쓰자.
그런데..그게 아니다.. 뭔 책이 이렇게 두껍나..
051 discovery, 030 Nucleo도 있었는데
Nucleo-F091RC 보드를 또 구입(ICBanQ) 택배비(2500원) 아낀다고 ST-LINK/V2도 같이구입
그런데 이건 살 필요 없다-Discovery, Nucleo 보드등에 내장되어있다.
거기다 Alibaba에서 J Link까지 구입.. 이넘의 장비 구입 병이 또 도졌다.
결국 J Link, ST-LINK/V2, 030 Nucleo, 051 Discovery, 091 Nucleo, STM32F091정복
책상 가득..
여기서 tip: 빵판(Bread board)로 실험하려면 051 discovery를 구입할것
외부 핀들이 일렬로 나열되어 있어 빵판에서 사용가능. 다른 보드들은 두줄로 출력되어 기판을 이용하여 납땜을 해야한다.( 물론 ST-LINK내장되어 있다.)
자 시작이다.. 맨땅에 헤딩..
EWARM설치하고.. 책 대로 구성하는데.. 와 이건 책의 두께(1058 page)만큼 이나 엄청난 압박이...
그래도 프로그램으로 밥 먹고 사는사람이.. 아자아자..
이건 장난이 아니네.. 책대로 깔고 하라는대로 config잡고.. 그런데 ER가 65개??
뭐가 없고 뭐가 없다고..
이건 ATmega128과는 차원이 다르네.. 구글신께..빌어보지만.. 모두 뜬 구름 잡는 얘기들만
네이버의 전자공작카페에서 자료를 구할까해봐도 EWARM이 아닌 무료 컴파일러 Atollic TrueSTUDIO를 사용하여 도움이 않된다.
열심히 구글신과 대화를 계속하니.. 뭔가가 보인다. 납땜..또 납땜
해냈다.. LED 끄고 켜기는 존심이 있지.. ㅎ pass..
-----------------------------------------------------------------------------------------------
/* ============================================================================ */
/* Text-LCD.c : 기본 텍스트 LCD 출력 프로그램(8MHz HSI 사용) */
// stm32f091 nucleo boar에서 Test - done! - 기본동작 확인하였다
// ST-Link이용 - compile후 Hex일때 Er, Bin으로 정상동작(주소 0x08000000)
//
// AHBENR(주변장치 clock공급(enable) - 중요
// GPIO - BRR, BSRR, MODER등 설정에 주의(BRR에서 1일때 bit reset등)
// BSRR 상위(reset),하위(set)로 나누어있어 동시에 제어가능
/* ============================================================================ */
#include "stm32f091xc.h"
void Delay_us(unsigned int time_us); /* time delay for us in 8MHz */
void Delay_ms(unsigned int time_ms); /* time delay for ms in 8MHz */
void Initialize_LCD(void); /* initialize text LCD module */
void LCD_command(unsigned char command); /* write a command(instruction) to text LCD */
void LCD_data(unsigned char data); /* display a character on text LCD */
void LCD_string(unsigned char command, char *string); /* display a string on LCD */
/* ----- 메인 프로그램 -------------------------------------------------------- */
int main(void)
{
RCC->AHBENR = 0x003E0000; // A,B,C,D,E enable
// 091 nucleo b/d port변경작업
GPIOC->MODER = 0x00005555; // set PC7~0 to output( LCD data)
GPIOA->MODER = 0x00000005; // set PA1(LCD_E), PA0(RS) to output
Delay_ms(10); // wait for system stabilization
Initialize_LCD(); // initialize text LCD module
Delay_ms(10);
while(1){
LCD_string(0x80,"TEST Nixtek LCD ");
Delay_ms(100);
LCD_string(0xC0,"TEST information");
Delay_ms(100);
// LCD_string(0x90,"TEST Co., "); // 4line*20Ch LCD ER(제위치 표시못한다)
// Delay_ms(100); // LCD module이 느려서??- 16*2line은 정상동작!
// LCD_string(0xd0," Electronix ");
Delay_ms(1000);
LCD_command(0x01); // clear display
Delay_ms(100);
}
}
/* ----- 사용자 함수 ---------------------------------------------------------- */
void SystemInit(void) /* dummy system function */
{
asm ("NOP");
}
void Delay_us(unsigned int time_us) /* time delay for us in 8MHz */
{
register unsigned int i;
for(i = 0; i < time_us; i++) // 3 cycle
{ asm ("NOP");
asm ("NOP");
asm ("NOP");
asm ("NOP"); // 4 cycle
}
}
void Delay_ms(unsigned int time_ms) /* time delay for ms in 8MHz */
{
register unsigned int i;
for(i = 0; i < time_ms; i++)
Delay_us(1000);
}
void Initialize_LCD(void) /* initialize text LCD module */
{
LCD_command(0x38); // function set(8 bit, 2 line, 5x7 dot)
Delay_ms(5);
LCD_command(0x38); // function set(8 bit, 2 line, 5x7 dot)
Delay_ms(5);
LCD_command(0x0C); // display control(display ON, cursor OFF)
LCD_command(0x06); // entry mode set(increment, not shift)
LCD_command(0x01); // clear display
Delay_ms(2);
}
void LCD_command(unsigned char command) /* write a command(instruction) to text LCD */
{
//GPIOA->BRR = 0x00000003; // E = 0, Rs = 0
GPIOA->BSRR = 0x00030000; // "
GPIOC->ODR = command; // output command
GPIOA->BSRR = 0x00000002; // E = 1
Delay_us(15); // 이 시간값들 줄이면 표시 제대로 않된다(16*2에서 10일때 Er)
//GPIOA->BRR = 0x00000003; // RS,E = 0
GPIOA->BSRR = 0x00030000; // "
Delay_us(15);
}
void LCD_data(unsigned char data) /* display a character on text LCD */
{
//GPIOA->BRR = 0x00000002; // E = 0
//GPIOA->BSRR = 0x00000001; // Rs = 1
GPIOA->BSRR = 0x00020001; // E = 0, Rs = 1 동시제어
GPIOC->ODR = data; // output data
GPIOA->BSRR = 0x00000002; // E = 1
Delay_us(15);
// GPIOA->BRR = 0x00000003; // RS,E = 0
GPIOA->BSRR = 0x00030000;
Delay_us(15);
}
void LCD_string(unsigned char command, char *string) /* display a string on LCD */
{
LCD_command(command); // start position of string
while(*string != '\0') // display string
{ LCD_data(*string);
string++;
}
}
PA0 - LCD RS
PA1 - LCD Enable
LCD RW-Ground
나머지(전원등) 기본 구성.
위 소스는 윤덕용저 "STM32F091정복"에서 인용한후 Nucleo보드와 내가 구성한것에 맞추어 수정한것이다.
-------------------------------------------------------------------------------------------------
GPIO의 MODER, BRR, BSRR 그리고 가장 중요??한
RCC->AHBENR 이었다
역시 제대로 매뉴얼을 읽어야 한다.
책에 있던 자료를 옮겨 그대로 컴파일 하면 당연히 ER나거나 동작이 않되는 상태
하루 날렸다.
ATmega128등은 입,출력으로 지정하고 맞추어 출력하면 다~ 되었는데.. 이녀석은
내부 Clock을 공급해 주어야한다.(AHBENR - 주변장치 허용 레지스터)
0: clock을 차단하여 동작하지 않도록 금지한다.
1: " 공급하여 동작을 허용한다.
-아주 중요!!
GPIO의 MODER, BRR, BSRR이 중요.
BRR과 BSRR은 같이 사용 가능하다.(빠른 동작을 할수있다고 하는데....)
------------------------------------------------------------------------------------------------
처음 안될때는 별 생각을 다 했었는데..
1) 091 chip에 Xtal연결이 않되었네.. - clock은 어떻게..(내부 RC??)
- 확인하니 ST-Link(내장)에서 공급해준다(8MHz)
2) 091은 3V동작인데.. Text LCD는 5V version이라 제대로 동작이 될까?
- 이것도 끝내고 나니 쓸데없는 걱정이 었다. - 아주 잘 된다.
-------------------------------------------------------------------------------------------------
댓글 없음:
댓글 쓰기