STM32, не удается портирование проекта с AVR

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Открыл глаза
Аватара пользователя
Сообщения: 72
Зарегистрирован: Вт июл 05, 2011 06:04:17
Откуда: барнаул

Сообщение 6Н23П »

кароче проблему решил так, у меня в функциях передачи данных и команд по SPI были задержки,но они там были в микросекундах, а я поставил милисекунды и забыл про это кароче...
Спойлер

Код: Выделить всё

// Посылка данных дисплею (16 бит режим)
void send_data(unsigned long int dat)
{
 CS = 0;
 RS = 0;
 spi((dat >> 8));
 spi(dat);
 RS = 1;
 delay_ms(1);
 CS = 1;
}

// Посылка данных дисплею (8 бит режим)
void send_data8(int dat)
{
 CS = 0;
 RS = 0;
 spi(dat);
 RS = 1;
  delay_ms(1);
 CS = 1;
}
 // Посылка комманды дисплею
void send_cmd(unsigned long int cmd)
{
 CS = 0;
 RS = 1;
 spi((cmd >> 8));
 spi(cmd);
 RS = 0;
  delay_ms(1);
 CS = 1;
}
По поводу переброски массива, я так и не понял как его юзать. На счет передачи по SPI данных 16бит использую это
Спойлер

Код: Выделить всё

// Посылка данных дисплею (16 бит режим)
void send_data(unsigned long int dat)
{
 CS = 0;
 RS = 0;
 spi((dat >> 8));
 spi(dat);
 RS = 1;
 delay_us(1);
 CS = 1;
}
, это наверно не очень хороший вариант, как настроить на 16 бит знаю, надо установить бит DFF – формат данных (0 – 8 бит, 1 – 16 бит);....


Весь код кроме константы шрифта
Спойлер

Код: Выделить всё

#include<stm32f10x_rcc.h>
#include<stm32f10x_gpio.h>
#include "stm32f10x.h"
#include "stm32f10x_conf.h"
#include <stm32f10x_spi.h>
#include <q.c>
#define HSE_VALUE    ((uint32_t)8000000)
//#define _8_BIT_COLOR  //Если закомментировано - 16-ти битный цвет
#define _GEOMETRICAL  //Использование функций вывода геометрических фигур

#define LCD_CS0 		 GPIOB->BRR  =  1<<0;
#define LCD_RESET0       GPIOB->BRR  =  1<<1;
#define LCD_RS0 		 GPIOB->BRR  =  1<<12;

#define LCD_CS1 		 GPIOB->BSRR  =  1<<0;
#define LCD_RESET1 	     GPIOB->BSRR  =  1<<1;
#define LCD_RS1 		 GPIOB->BSRR  =  1<<12;

char RS_old;
//=========
//     			    Определение цветов
//=========
#ifdef _8_BIT_COLOR
//8-ми битовая цветовая палитра (256 цветов)
#define GREEN       0x1C
#define DARK_GREEN  0x15
#define RED         0xE0
#define BLUE        0x1F
#define DARK_BLUE   0x03
#define YELLOW      0xFC
#define ORANGE      0xEC
#define VIOLET      0xE3
#define WHITE       0xFF
#define BLAGK       0x00
#define GREY        0x6D

#else
//16-ти битовая цветовая палитра (65536 цветов)
#define    BLACK                0x0000
#define    WHITE                0xFFFF
#define    GRAY                 0xE79C
#define    GREEN                0x07E0
#define    BLUE                 0x001F
#define    RED                  0xF800
#define    SKY                  0x5d1c
#define    YELLOW               0xffe0
#define    MAGENTA              0xf81f
#define    CYAN                 0x07ff
#define    ORANGE               0xfca0
#define    PINK                 0xF97F
#define    BROWN                0x8200
#define    VIOLET               0x9199
#define    SILVER               0xa510
#define    GOLD                 0xa508
#define    BEGH                 0xf77b
#define    NAVY                 0x000F
#define    DARK_GREEN           0x03E0
#define    DARK_CYAN            0x03EF
#define    MAROON               0x7800
#define    PURPLE               0x780F
#define    OLIVE                0x7BE0
#define    LIGHT_GREY           0xC618
#define    DARK_GREY            0x7BEF
#endif


void delay_ms(uint16_t value)
{
  TIM2->ARR = value;                  //загрузить значение задержки
  TIM2->CNT = 0;
  TIM2->CR1 = TIM_CR1_CEN;	      //запустить таймер
  while((TIM2->SR & TIM_SR_UIF)==0){} //дождаться конца задержки
  TIM2->SR &= ~TIM_SR_UIF;	      //сбросить флаг
}


int random ( long int x){return rand() %x;}
int randomv ( long int v){return rand() %v;}
int main(void)
{

	 RCC->CFGR  |= RCC_CFGR_PLLSRC;         //Источником сигнала для PLL выбран HSE
	  RCC->CR   &= ~RCC_CR_PLLON;            //Отключить генератор PLL
	  RCC->CFGR &= ~RCC_CFGR_PLLMULL;        //Очистить PLLMULL
	  RCC->CFGR |=  RCC_CFGR_PLLMULL9;       //Коефициент умножения = 9
	  RCC->CR   |=  RCC_CR_PLLON;            //Включить генератор PLL
	  while((RCC->CR & RCC_CR_PLLRDY)==0) {} //Ожидание готовности PLL

	GPIO_InitTypeDef  GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	 	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_14;
	 	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
	 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC, &GPIO_InitStructure);

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	     GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_12;
		 GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
		 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);

	RCC->APB2ENR |=  RCC_APB2ENR_AFIOEN;     //включить тактирование альтернативных функций        /
	RCC->APB2ENR |=  RCC_APB2ENR_IOPAEN;     //включить тактирование порта А
	RCC_APB2PeriphClockCmd(  RCC_APB2Periph_SPI1, ENABLE);
			//вывод управления SS: выход двухтактный, общего назначения,50MHz                             /
			GPIOA->CRL   |=  GPIO_CRL_MODE4;    //
			GPIOA->CRL   &= ~GPIO_CRL_CNF4;     //
			GPIOA->BSRR   =  GPIO_BSRR_BS4;     //

			//вывод SCK: выход двухтактный, альтернативная функция, 50MHz
			GPIOA->CRL   |=  GPIO_CRL_MODE5;    //
			GPIOA->CRL   &= ~GPIO_CRL_CNF5;     //
			GPIOA->CRL   |=  GPIO_CRL_CNF5_1;   //

			//вывод MISO: вход цифровой с подтягивающим резистором, подтяжка к плюсу
			GPIOA->CRL   &= ~GPIO_CRL_MODE6;    //
			GPIOA->CRL   &= ~GPIO_CRL_CNF6;     //
			GPIOA->CRL   |=  GPIO_CRL_CNF6_1;   //
			GPIOA->BSRR   =  GPIO_BSRR_BS6;     //

			//вывод MOSI: выход двухтактный, альтернативная функция, 50MHz
			GPIOA->CRL   |=  GPIO_CRL_MODE7;    //
			GPIOA->CRL   &= ~GPIO_CRL_CNF7;     //
			GPIOA->CRL   |=  GPIO_CRL_CNF7_1;   //

			RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; //
			SPI1->CR1     = 0x0000;             //
			SPI1->CR2     = 0x0000;             //
			//SPI1->CR1    |= SPI_CR1_MSTR| SPI_CR1_BR_0|SPI_CR1_SSI | SPI_CR1_SSM| SPI_CR1_SPE;
			SPI1->CR1    |= SPI_CR1_MSTR| SPI_CR1_SSI | SPI_CR1_SSM| SPI_CR1_SPE;

//timer
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
TIM2->PSC     = 8000-1;
TIM2->CR1     = TIM_CR1_OPM;

int x=0,v ;
unsigned char buf[10];

     GPIOC->BSRR  =  1<<14; // proverka
     LCD_init();

LCD_FillScreen (GREEN);
     while(1)

     {

    	 x= x+1;
    	 v= random(65000);
    	 itoa(x,buf);
    	 LCD_Puts(buf, 0, 10,  v, WHITE,5, 5,0);
    	 LCD_Puts(buf, 0, 50,  v, RED,5, 5,0);
    	 LCD_Puts(buf, 0, 90,  v, BLUE,5, 5,0);
    	 LCD_Puts(buf, 0, 130,  v, YELLOW,5, 5,0);



    	 Delay(1000000);
    	// LCD_FillScreen (RED);
    	// Delay(10000000);
    	//LCD_FillScreen (BLUE);
    	//Delay(10000000);
    	//LCD_FillScreen (YELLOW);
    	//Delay(10000000);

     }
}
void Delay(uint32_t a)
{
    uint32_t i;
    for (i=0; i<a; i++) {};

}

uint8_t Send_to_lcd (uint8_t data)
       {

         SPI1->DR = data;
         while (!(SPI1->SR & SPI_SR_RXNE));
         return (SPI1->DR);
       }
 //=========
 //Функция записи команды/данных в LCD (RS==0 - команда, RS==1 - данные)
 //=========

     // Посылка данных дисплею (16 бит режим)
     void send_data(unsigned long int data)
     {
      LCD_CS0;
      LCD_RS1;
      Send_to_lcd((data >> 8));
      Send_to_lcd(data);
      LCD_RS0;

      LCD_CS1;
     }

     // Посылка данных дисплею (8 бит режим)
    void send_data8(int data)
    {
    LCD_CS0;
    LCD_RS1;
    Send_to_lcd(data);
    LCD_RS0;

    LCD_CS1;
    }

   // Посылка комманды дисплею
   void send_cmd(unsigned long int cmd)
    {
    LCD_CS0;
    LCD_RS0;
    Send_to_lcd((cmd >> 8));
    Send_to_lcd(cmd);
    LCD_RS1;

    LCD_CS1;
    }

   void LCD_init(void)
        {
         LCD_RESET0;
         delay_ms(100);
         LCD_RESET1;

         delay_ms(100);
         send_cmd(0x01);

         send_cmd(0x36);
         send_data8(0x00);

         send_cmd(0x11);

         delay_ms(10);

         send_cmd(0x3a);
         #ifdef _8_BIT_COLOR
         send_data8(0x02);
         #else
         send_data8(0x05);
         #endif
         delay_ms(10);
         send_cmd(0x29);
        }

        void SetArea(char x1, char x2, char y1, char y2)
        {
          //задаем область по X
         send_cmd(0x2A);
            //начальная
         send_data8(x1);
           //конечная
         send_data8(x2);
           //задаем область по Y
         send_cmd(0x2B);
             //начальная
         send_data8(y1);
             //конечная
         send_data8(y2);
           //отправляем команду на начало записи в память и начинаем посылать данные
         send_cmd(0x2C);
        }

        //=========
        //                          Рисуем точку
        //=========
        void Put_Pixel (char x, char y, unsigned int color)
        {
         signed char i;
         SetArea( x, x, y, y );
         LCD_RS1;
         #ifdef _8_BIT_COLOR	//(8-ми битовая цветовая палитра (256 цветов))

         send_data8(color);
         #else			        //(16-ти битовая цветовая палитра (65536 цветов))
         send_data(color);
         #endif
        }

        void Send_Symbol (unsigned char symbol, char x, char y, int t_color, int b_color, char zoom_width, char zoom_height, int rot)
        {
         unsigned char temp_symbol, a, b, zw, zh, mask;

         if (symbol>127) symbol-=64;    //Убираем отсутствующую часть таблицы ASCII
         for ( a = 0; a < 5; a++) //Перебираю 5 байт, составляющих символ
         {
          temp_symbol = font_5x8[symbol-32][a];
          zw = 0;
          while(zw != zoom_width) //Вывод байта выполняется zw раз
          {
           mask=0x01;
           switch(rot)
           {
            case 0: case 180: SetArea( x+zw, x+zw, y, y+(zoom_height*8)-1 ); break;
            case 90: case 270: SetArea( x, x+(zoom_height*8)-1, y+zw, y+zw ); break;
           }
           LCD_RS1; //Передаются данные
           for ( b = 0; b < 8; b++ ) //Цикл перебирания 8 бит байта
           {
            zh = zoom_height; //в zoom_height раз увеличится высота символа
            while(zh != 0) //Вывод пикселя выполняется z раз
            {
             if (temp_symbol&mask)
             {
              #ifdef _8_BIT_COLOR	//(8-ми битовая цветовая палитра (256 цветов))
              send_data8(t_color );
              #else			        //(16-ти битовая цветовая палитра (65536 цветов))
              send_data(t_color);
              #endif
             }
             else
             {
              #ifdef _8_BIT_COLOR	//(8-ми битовая цветовая палитра (256 цветов))
              send_data8(b_color );
              #else			        //(16-ти битовая цветовая палитра (65536 цветов))
              send_data(b_color );
              #endif
             }
             zh--;
            }
            mask<<=1; //Смещаю содержимое mask на 1 бит влево;
           }
           zw++;
          }
          switch(rot)
          {
           case 0: case 180: x=x+zoom_width;  break; //Получить адрес начального пикселя по оси x для вывода очередного байта
           case 90: case 270: y=y+zoom_width; break; //Получить адрес начального пикселя по оси y для вывода очередного байта
          }
         }
        }

        //=========
        // Функция вывода одного символа ASCII-кода (из файла Symbols.h)
        //=========
        void LCD_Putchar(char symbol, char x, char y, int t_color, int b_color, char zoom_width, char zoom_height, int rot)
        {
         unsigned char m;
         if(zoom_width == 0)   zoom_width = 1;
         if(zoom_height == 0)  zoom_height = 1;
         switch (rot)
         {
          case 0:  //Начальный адрес осей Х и У - левый верхний угол дисплея
          Send_Symbol( symbol, x, y, t_color, b_color, zoom_width, zoom_height, rot);
          break;
          //==============
          case 90:
          m=y; y=x; x=m;
          send_cmd(0x36);
          //Начальный адрес осей Х и У - правый верхний угол дисплея
          send_data8( 0x40);
          Send_Symbol( symbol, x, y, t_color, b_color, zoom_width, zoom_height, rot);
          send_cmd(0x36);
          send_data8( 0x00);
          break;
          //==============
          case 180:
          send_cmd(0x36);
           //Начальный адрес осей Х и У - правый нижний угол дисплея
          send_data8( 0xC0);
          Send_Symbol( symbol, x, y, t_color, b_color, zoom_width, zoom_height, rot);

          send_cmd(0x36);

          send_data8( 0x00);
          break;
          //==============
          case 270:
          m=y; y=x; x=m;

          send_cmd(0x36);
         //Начальный адрес осей Х и У - левый нижний угол дисплея
          send_data8( 0x80);
          Send_Symbol( symbol, x, y, t_color, b_color, zoom_width, zoom_height, rot);

          send_cmd(0x36);

          send_data8( 0x00);
          break;
          //==============
          default:

          send_cmd(0x36);
         //Начальный адрес осей Х и У - левый верхний угол дисплея
          send_data8( 0x00);
          Send_Symbol( symbol, x, y, t_color, b_color, zoom_width, zoom_height, rot);

          send_cmd(0x36);

          send_data8( 0x00);
          //===============
         };
        }

       void LCD_FillScreen (unsigned int color)
        {
         unsigned int x;
         signed char i;
         SetArea( 0, 131, 0, 175 );   //Область всего экрана
         LCD_RS1;

         //Данные - задаём цвет пикселя
         for (x = 0; x < 23232; x++)  // 23232 - это 132 * 176
         {
          #ifdef _8_BIT_COLOR	//(8-ми битовая цветовая палитра (256 цветов))

          send_data8( color);
          #else			//(16-ти битовая цветовая палитра (65536 цветов))

          send_data( color);
          #endif
         }
        }

        void LCD_Puts(char *str, int x, int y,  int t_color, int b_color, char zoom_width, char zoom_height, int rot)
        {
         unsigned char i=0;

         if(zoom_width == 0)   zoom_width = 1;
         if(zoom_height == 0)  zoom_height = 1;

         while (str[i]) //x и y - адрес пикселя начальной позиции; с увеличением переменной i адрес вывода очередного символа смещается на i*6 (чем организуются столбцы дисплея)
         {
          LCD_Putchar(str[i], x+(i*6*zoom_width), y, t_color, b_color, zoom_width, zoom_height, rot);
          i++;
         }
        }

       void reverse(char s[])
         {
             int i, j;
             char c;

             for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
                 c = s[i];
                 s[i] = s[j];
                 s[j] = c;
             }
         }
        void itoa(int n, char s[])
        {
            int i, sign;

            if ((sign = n) < 0)  /* записываем знак */
                n = -n;          /* делаем n положительным числом */
            i = 0;
            do {       /* генерируем цифры в обратном порядке */
                s[i++] = n % 10 + '0';   /* берем следующую цифру */
            } while ((n /= 10) > 0);     /* удаляем */
            if (sign < 0)
                s[i++] = '-';
            s[i] = '\0';
            reverse(s);
        }

   
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Например здесь .

Код: Выделить всё

 void LCD_FillScreen (unsigned int color)
        {
         unsigned int x;
         signed char i;
         LCD_CS0;
         LCD_RS1;
         SetArea( 0, 131, 0, 175 );   //Область всего экрана
       

         //Данные - задаём цвет пикселя
         for (x = 0; x < 23232; x++)  // 23232 - это 132 * 176
            {
      
         
               while(!(SPI1->SR & SPI_SR_TXE)); 
                 SPI1->DR =color;   
      
              }
                    while((SPI1->SR & SPI_SR_BSY)); 
            LCD_RS0;
           LCD_CS1;
      
        }

Или при выводе картинки.
gImage_cat[] заранее подготовленный массив(картинка)

Код: Выделить всё

void Fill_image(void)
{
	uint16_t i;
        LCD_CS0;
        LCD_RS1;
	Gotoxy( 0,0);
	for (i=0;i<LCD_MEM_SIZE;i++)
	{
		
		while(!(SPI1->SR & SPI_SR_TXE)); 
                SPI1->DR =gImage_cat[i];
		
		
	}
	
	 while((SPI1->SR & SPI_SR_BSY)); 
	LCD_RS0;
      LCD_CS1;
}
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 72
Зарегистрирован: Вт июл 05, 2011 06:04:17
Откуда: барнаул

Сообщение 6Н23П »

Понятно, буду доробатывать. Я так понимаю при таком использовании повысится быстрдействие, по сравнению если использовать обычную функцию?
спасибо
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 21
Зарегистрирован: Пн мар 12, 2012 22:24:32
Откуда: нижегородская область

Сообщение count_raven »

6Н23П, здравствуйте, тоже хочу завести такой же дисплей только на stm32f4, в мк начинающий(совсем начинающий), в коде указан #include <q.c>, где его взять? среда - coocox
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

count_raven писал(а):в коде указан #include <q.c>, где его взять? среда - coocox
Если в коде прописано

Код: Выделить всё

#include <q.c>

такой код можно выкинуть не сожалея . :)))
Реклама
Ответить

Вернуться в «ARM»