Перейти к содержанию

STM32 для чайника


ART_ME

Рекомендуемые сообщения

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

17 часов назад, MasterElectric сказал:

На стороне МК нужно просто создать указатель на структуру, и данному указателю присвоить адрес входного буфера USART. И все теперь мы работаем с данными просто как со структурой

разумеется данные между процессорами так передавать намного удобнее. Полностью согласен. И передать структуру или массив - никакой разницы. Другое дело когда нужно смотреть в консоль. Или принимать команды из консоли. Тут конечно альтернатив тексту нет. Но случай бывают разные и задачу всегда надо решать в контексте. Решение передавать данные как есть совсем не плохое.

17 часов назад, MasterElectric сказал:

Да это сложный вариант для новичков

только для осознания и маленько с указателями поколдовать. А в целом не вижу никаких сложностей. Что массив символов, что структуру - одинаково "сложно" передавать )) Трудность тут только одна - нужно знать размер посылки. В строках терминаторы понятные и где конец посылки ясно, а вот в структурах явного окончания может и не быть, поэтому важно знать размер каждой посылки с самого начала передачи. А для этого посылка должна иметь как минимум заголовок и контрольную сумму. Это конечно несколько усложняет процесс.

15 часов назад, Darth_Vader сказал:

Тоже самое касается и использования высокоуровневых абстракций типа HAL

HAL это суть тот же SPL. Только собран более крупными макросами и функциями. Исходный код HAL прост и понятен и по сути адепты SPL его просто переписывают другими словами вручную. Оптимизация если и получается, то не великая в масштабах STM32. Я бы даже сказал в подавляющем объеме случаев околонулевая. В целом да, HAL можно назвать высокоуровневой абстракцией, так как синтаксис единый, а в базе у него CMSIS под конкретный камень

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Абсолютно точно, нужен заголовок (длина пакета, идентификатор пакета (команды)), контрольная сумма пакета (CRC8, CRC16 и т.д.). Я использую тайм аут или IDLE линии, для определения конца пакета. Ну сразу видно что вы знаете о чем пишите. 

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

В 05.06.2017 в 14:51, mail_robot сказал:

Я бы даже сказал в подавляющем объеме случаев околонулевая.

Ну я бы не сказал что нулевая. Если вы сравнивали SPL и HAL, то да.

Изменено пользователем MasterElectric
Ссылка на комментарий
Поделиться на другие сайты

Добрый день, подскажите купил радио Transmitter и Receiver, подключил их через usart к stm32, usart ловит данные из Receiver, но что отрпавлять на Transmitter? Подскажите может ссылку на мануал/пример, ничего не могу найти. Спасибо.

large_rf433link.jpg

Ссылка на комментарий
Поделиться на другие сайты

Похоже, что это достаточно простые модули, поэтому нельзя просто передавать данные из uart, необходимо их перекодировать в код, который на выходе будет обеспечивать минимум постоянной составляющей (равное количество "0" и "1" за короткий промежуток времени, избегать передачи подряд большого количества "0" или "1"). Например можно взять код манчестера (предпочтительнее) или 4b/5b. Остальные сложнее в реализации. Сначала передаётся преамбула, для синхронизации (например, 48 бит 01010101...), потом пакет с байтстафингом (т.е. уникальный признак пакета), и конечно CRC. И надо учитывать что с модуля радиоканала всегда будет идти какой то мусор, Ваша задача поймать в этом мусоре синхронизацию и байт "признак начала пакета". Посмотрите файл из вложения.
nAN400-07rev1_2.pdf

Здесь указано, что "Modulation rate:2Kbit/s", т.е. скорость будет не высокой.
http://p.globalsources.com/IMAGES/PDT/SPEC/016/K1042395016.pdf

AN43.pdf

Изменено пользователем dm37
Ссылка на комментарий
Поделиться на другие сайты

у меня валяется десяток таких же модулей, все никак руки не доходят. Покупались под какой то проект с радиоточками, но пока ехали проект загнулся. Надо будет таки испробовать

1 час назад, Anton19 сказал:

usart ловит данные из Receiver, но что отрпавлять на Transmitter?

интересно, а что у вас тогда ловит приемник, если на передатчик нихрена не отправляется?

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

4 минуты назад, mail_robot сказал:

интересно, а что у вас тогда ловит приемник, если на передатчик нихрена не отправляется?

Ловит какие-то данные из окружающего радио эфира.

Ссылка на комментарий
Поделиться на другие сайты

7 минут назад, mail_robot сказал:

интересно, а что у вас тогда ловит приемник, если на передатчик нихрена не отправляется?

 

29 минут назад, dm37 сказал:

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

будет идти случайный набор "0" и "1" (шум), а uart будет это воспринимать как байты

Изменено пользователем dm37
Ссылка на комментарий
Поделиться на другие сайты

@dm37 Подозреваю, что у вас уже есть конкретный опыт использования этих штуковин

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

делали небольшую сеть на https://www.compel.ru/infosheet/TELC/RXQ1-433
Один мастер и несколько ведомых. Правда пришлось в последствии отказаться от этой идеи, кто то по близости в 23:00 включал что-то, а в 08:00 выключал. Нас это не устраивало. Сейчас там оптика проложена.

Ссылка на комментарий
Поделиться на другие сайты

Я передавал просто USART правда вначале несколько 0x55 передавал. Да был мусор, фрейм эррор постоянно, от него, просто обрабатывал данное прерывание, и снова ждал. Данные правда такие себе ДУ для машинки. Ну и типа CRC передавал байт потом его инверсию, потом следующий. 9600 вроде бы скорость была.

Ссылка на комментарий
Поделиться на другие сайты

Я отправляю данные через USART2 PA2 (pin2) на передатчик данных, подключил usb-uart к PA2 (pin2) и посмотрел в терминале, что отправляется (AA 44 11 55 AA 44 22 66 AA 44 11 55 AA 44 22 66 ...). Все в порядке, я передаю то, что хочу.


Затем я подключил usb-uart к PA10 (pin10) и посмотрел что приходит через радио приемник, было много данных, но в основном  были (AA 44 11 55 AA 44 22 66 AA 44 11 55 AA 44 22 66 ...). Все в порядке, я получаю от приемника, то что нужно.


Затем подключил usb-uart на PA9 (pin9) (uart1 TX) и посмотрели что он передает (AA 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 ...).
Главный вопрос: что я делаю неправильно, почему USART1 TX искажает данные? Как это исправить?

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"

# define SYNC 0XAA
# define RADDR 0x44
# define LEDON 0x11 //switch led on command
# define LEDOFF 0x22 //switch led off command

void Delay(void) {
  volatile uint32_t i;
  for (i = 0; i != 100; i++)
  ;
}
void send_to_uart1(uint8_t data) {
  while (!(USART1 - > SR & USART_SR_TXE)) {}
  USART1 - > DR = data;
}

void send_to_uart2(uint8_t data) {
  while (!(USART2 - > SR & USART_SR_TXE));
  USART2 - > DR = data;
}

void Send_Packet(uint8_t addr, uint8_t cmd) {
  send_to_uart2(SYNC); //send synchro byte    
  send_to_uart2(addr); //send receiver address
  send_to_uart2(cmd); //send increment command
  send_to_uart2((addr + cmd)); //send checksum
}

uint8_t uart_data;

int main(void) {
  GPIO_InitTypeDef PORTA_init_struct;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

  PORTA_init_struct.GPIO_Pin = GPIO_Pin_9;
  PORTA_init_struct.GPIO_Speed = GPIO_Speed_2MHz;
  PORTA_init_struct.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, & PORTA_init_struct);

  PORTA_init_struct.GPIO_Pin = GPIO_Pin_10;
  PORTA_init_struct.GPIO_Speed = GPIO_Speed_50MHz;
  PORTA_init_struct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, & PORTA_init_struct);

  PORTA_init_struct.GPIO_Pin = GPIO_Pin_2;
  PORTA_init_struct.GPIO_Speed = GPIO_Speed_50MHz;
  PORTA_init_struct.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, & PORTA_init_struct);

  PORTA_init_struct.GPIO_Pin = GPIO_Pin_3;
  PORTA_init_struct.GPIO_Speed = GPIO_Speed_50MHz;
  PORTA_init_struct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, & PORTA_init_struct);

  USART_InitTypeDef uart_struct1;
  uart_struct1.USART_BaudRate = 600;
  uart_struct1.USART_WordLength = USART_WordLength_8b;
  uart_struct1.USART_StopBits = USART_StopBits_1;
  uart_struct1.USART_Parity = USART_Parity_No;
  uart_struct1.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  uart_struct1.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  USART_Init(USART1, & uart_struct1);
  USART_Cmd(USART1, ENABLE);

  USART_InitTypeDef uart_struct2;
  uart_struct2.USART_BaudRate = 600;
  uart_struct2.USART_WordLength = USART_WordLength_8b;
  uart_struct2.USART_StopBits = USART_StopBits_1;
  uart_struct2.USART_Parity = USART_Parity_No;
  uart_struct2.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  uart_struct2.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  USART_Init(USART2, & uart_struct2);
  USART_Cmd(USART2, ENABLE);

  uint8_t raddress, data, chk;

  while (1) {
    Send_Packet(RADDR, LEDON);
    Delay();
    Send_Packet(RADDR, LEDOFF);
    Delay();

    if (USART1 - > SR & USART_SR_RXNE) {
      uart_data = USART1 - > DR;
      send_to_uart1(uart_data);
    }

  }
}

 

IMG_20170613_075837.jpg

Изменено пользователем Anton19
Ссылка на комментарий
Поделиться на другие сайты

Я не большой знаток что там точно как будет работать

void send_to_uart1(uint8_t data) {
  while (!(USART1 - > SR & USART_SR_TXE)) {}
  USART1 - > DR = data;
}

 

void send_to_uart1(uint8_t data) {
  while (!(USART1 - > SR & USART_SR_TXE));
  USART1 - > DR = data;
}

может в while выполняется USART1 - > DR = data; убери фиг. скобки

попробуй

А еще укажи МК, USART1 сидит на другой шине на другой частоте (обычно), наверное делители нужно менять для Baudrate.

Изменено пользователем MasterElectric
Ссылка на комментарий
Поделиться на другие сайты

Вообщем поработал пока с SPI UART ADC прерываниями и портами ввода - вывода. И решил прикрутить дисплей без библиотеки, взял вначале LS020 но не удалось его запустить, хотя вроде инициализацию правильно делал. Но потом решил его отложить и взял дисплей от Nokia3310, и пытаюсь вывести две картинки массивами по SPI частота тактирования выставлена 2,25МГц, SPI настроен только на передачу, камень f103, но почему-то не работает, но при этой же инициализации дисплея и так само вывожу массивы, только в ардуино для Ардуино УНО, все работает, не могу понять в чем проблема. Вот код:



/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f1xx_hal.h"

#define RS_Hi GPIOB->BSRR = GPIO_BSRR_BS7;      // RS = 1 DC
#define RS_Low GPIOB->BSRR = GPIO_BSRR_BR7;;      // RS = 0
#define RESET_Hi GPIOA->BSRR = GPIO_BSRR_BS3;     // RESET = 1
#define RESET_Low GPIOA->BSRR = GPIO_BSRR_BR3;   // RESET = 0
#define CS_Hi  GPIOA->BSRR = GPIO_BSRR_BS4;       // CS = 1 SCE
#define CS_Low GPIOA->BSRR = GPIO_BSRR_BR4;       // CS = 0

#define LCD_WIDTH   84 // Note: x-coordinates go wide
#define LCD_HEIGHT  48 // Note: y-coordinates go high
#define WHITE       0  // For drawing pixels. A 0 draws white.
#define BLACK       1  // A 1 draws black.

    
/* Private variables ---------------------------------------------------------*/
ADC_HandleTypeDef hadc1;

SPI_HandleTypeDef hspi1;

UART_HandleTypeDef huart1;

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
static void MX_USART1_UART_Init(void);
static void MX_SPI1_Init(void);


char displayMap[LCD_WIDTH * LCD_HEIGHT / 8] = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (0,0)->(11,7) ~ These 12 bytes cover an 8x12 block in the left corner of the display 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (12,0)->(23,7)
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, // (24,0)->(35,7)
  0xF0, 0xF8, 0xFC, 0xFC, 0xFE, 0xFE, 0xFE, 0xFE, 0x1E, 0x0E, 0x02, 0x00, // (36,0)->(47,7)
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (48,0)->(59,7)
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (60,0)->(71,7)
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (72,0)->(83,7)
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (0,8)->(11,15)
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (12,8)->(23,15)
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // (24,8)->(35,15)
  0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xF8, // (36,8)->(47,15)
  0xF8, 0xF0, 0xF8, 0xFE, 0xFE, 0xFC, 0xF8, 0xE0, 0x00, 0x00, 0x00, 0x00, // (48,8)->(59,15)
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (60,8)->(71,15)
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (72,8)->(83,15)
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (0,16)->(11,23)
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (12,16)->(23,23)
  0x00, 0x00, 0xF8, 0xFC, 0xFE, 0xFE, 0xFF, 0xFF, 0xF3, 0xE0, 0xE0, 0xC0, // (24,16)->(35,23)
  0xC0, 0xC0, 0xE0, 0xE0, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // (36,16)->(47,23)
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3E, 0x00, 0x00, 0x00, // (48,16)->(59,23)
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (60,16)->(71,23)
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (72,16)->(83,23)
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (0,24)->(11,31)
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (12,24)->(23,31)
  0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // (24,24)->(35,31)
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // (36,24)->(47,31)
  0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, // (48,24)->(59,31)
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (60,24)->(71,31)
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (72,24)->(83,31)
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (0,32)->(11,39)
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (12,32)->(23,39)
  0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, // (24,32)->(35,39)
  0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, // (36,32)->(47,39)
  0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (48,32)->(59,39)
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (60,32)->(71,39)
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (72,32)->(83,39)
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (0,40)->(11,47)
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (12,40)->(23,47)
  0x00, 0x00, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, // (24,40)->(35,47)
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (36,40)->(47,47)
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (48,40)->(59,47)
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (60,40)->(71,47)
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (72,40)->(83,47) !!! The bottom right pixel!
};



char xkcdSandwich[504] = {
0xFF, 0x8D, 0x9F, 0x13, 0x13, 0xF3, 0x01, 0x01, 0xF9, 0xF9, 0x01, 0x81, 0xF9, 0xF9, 0x01, 0xF1,
0xF9, 0x09, 0x09, 0xFF, 0xFF, 0xF1, 0xF9, 0x09, 0x09, 0xF9, 0xF1, 0x01, 0x01, 0x01, 0x01, 0x01,
0xF9, 0xF9, 0x09, 0xF9, 0x09, 0xF9, 0xF1, 0x01, 0xC1, 0xE9, 0x29, 0x29, 0xF9, 0xF1, 0x01, 0xFF,
0xFF, 0x71, 0xD9, 0x01, 0x01, 0xF1, 0xF9, 0x29, 0x29, 0xB9, 0xB1, 0x01, 0x01, 0x01, 0xF1, 0xF1,
0x11, 0xF1, 0xF1, 0xF1, 0xE1, 0x01, 0xE1, 0xF1, 0x51, 0x51, 0x71, 0x61, 0x01, 0x01, 0xC1, 0xF1,
0x31, 0x31, 0xF1, 0xFF, 0xFF, 0x00, 0x01, 0x01, 0x01, 0x01, 0x60, 0xE0, 0xA0, 0x01, 0x01, 0x81,
0xE1, 0x61, 0x60, 0xC0, 0x01, 0xE1, 0xE1, 0x21, 0x21, 0xE0, 0xC1, 0x01, 0xC1, 0xE1, 0x20, 0x20,
0xFC, 0xFC, 0xE0, 0xE0, 0xC1, 0xE1, 0xE0, 0xC1, 0xE0, 0xE1, 0x01, 0xFC, 0xFC, 0x21, 0x21, 0xE1,
0xC1, 0xE5, 0xE4, 0x01, 0xC1, 0xE0, 0x20, 0x21, 0x20, 0x00, 0x01, 0xFD, 0xFD, 0x21, 0x20, 0xE0,
0x00, 0x00, 0x01, 0x01, 0xC0, 0x61, 0x31, 0x31, 0x21, 0x20, 0xC0, 0x81, 0x01, 0x01, 0x01, 0x00,
0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x02,
0x03, 0x01, 0x00, 0x01, 0x03, 0xF2, 0x1A, 0x0B, 0x08, 0x0B, 0x1B, 0x10, 0x60, 0xE3, 0x03, 0x00,
0x01, 0x03, 0x02, 0x02, 0x03, 0x03, 0x00, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x03,
0x03, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x00, 0x01, 0x03, 0x02, 0x02, 0x03, 0x01, 0x00, 0x03,
0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x3E, 0x63, 0x80, 0x80, 0x80, 0x80, 0x60, 0x3F, 0x07,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x01, 0x01, 0x02, 0x03, 0x3E, 0xE8, 0xF8, 0xF0, 0xD0, 0x90,
0x18, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x38, 0xFF,
0x0C, 0x38, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33,
0x5F, 0x8F, 0x84, 0x05, 0x07, 0x06, 0x0C, 0x0E, 0x0E, 0x0C, 0x14, 0x34, 0x68, 0x88, 0xD8, 0x70,
0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x10, 0x10, 0x10, 0xF0, 0xE0, 0x00, 0xF0, 0xF0, 0x00, 0x80,
0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x20, 0x38,
0x0E, 0x01, 0xC0, 0x3F, 0xE0, 0x00, 0x00, 0x03, 0x0E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xB6, 0xED, 0xC0, 0xC0,
0xC0, 0xE0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xE1, 0xE1, 0xC1,
0xEF, 0xBB, 0x83, 0x86, 0x88, 0xB0, 0x80, 0x80, 0x80, 0x8F, 0x90, 0x90, 0x90, 0x9F, 0x8F, 0x80,
0x9F, 0x9F, 0x87, 0x8D, 0x98, 0x80, 0x8C, 0x9E, 0x92, 0x92, 0x9F, 0xC0, 0xC7, 0xFF, 0xB8, 0x8F,
0x80, 0x90, 0x90, 0xC0, 0xF0, 0x8E, 0x81, 0x80, 0x81, 0x8F, 0xB8, 0xE0, 0x80, 0x80, 0x80, 0x80,
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 
};


char r[40]={0x7f, 0x09, 0x19, 0x29, 0x46, // 0x52 R
0x38, 0x44, 0x44, 0x44, 0x38,// 0x6f o
0x7c, 0x04, 0x18, 0x04, 0x78, // 0x6d m
0x20, 0x54, 0x54, 0x54, 0x78, // 0x61 a
0x7c, 0x08, 0x04, 0x04, 0x78}; // 0x6e n


char clr[502] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

};




void LCD_CMD(uint16_t data) {
  
  RS_Low;
  CS_Low;
   SPI1->DR=data;
  CS_Hi;
}





void LCD_DATA(uint16_t data) {
  
  RS_Hi;
  CS_Low;
 SPI1->DR=data;
  CS_Hi;
}


int x;
int y;
int bw;


void setPixel( x, y, bw)
{
  // First, double check that the coordinate is in range.
  if ((x >= 0) && (x < LCD_WIDTH) && (y >= 0) && (y < LCD_HEIGHT))
  {
    char shift = y % 8;
  
    if (bw) // If black, set the bit.
      displayMap[x + (y/8)*LCD_WIDTH] |= 1<<shift;
    else   // If white clear the bit.
      displayMap[x + (y/8)*LCD_WIDTH] &= ~(1<<shift);
  }
}



 void LCDclear(bw){
for (int i=0; i<(LCD_WIDTH * LCD_HEIGHT / 8); i++)
  {
    if (bw)
      displayMap[i] = 0xFF;
    else
      displayMap[i] = 0;
  }
}

void gotoXY(int x, int y)
{
 LCD_CMD(0x80 | x);  // Column.
  LCD_CMD(0x40 | y);  // Row.  ?
}

void ris(void){
gotoXY(0, 0);
  for (int i=0; i < (LCD_WIDTH * LCD_HEIGHT / 8); i++)
  {
     LCD_DATA(xkcdSandwich[i]);
  }
}

void ris3(void){

  gotoXY(0, 0);
  for (int i=0; i < (LCD_WIDTH * LCD_HEIGHT / 4); i++)
  {
    LCD_DATA(r[i]);
  }
}

void setBitmap(char * bitArray)
{
  for (int i=0; i<(LCD_WIDTH * LCD_HEIGHT / 8); i++)
    displayMap[i] = bitArray[i];
}


void clear2(void){

  gotoXY(0, 0);
  for (int i=0; i < (LCD_WIDTH * LCD_HEIGHT / 8); i++)
  {
 LCD_DATA(clr[i]);
  }
}

void LCD_init(void) {
  


  RESET_Low;// Сброс и Окончание Сброса LCD 
  HAL_Delay(10);
  RESET_Hi;
 HAL_Delay(10);
 
 
LCD_CMD(0x21); //Tell LCD extended commands follow
LCD_CMD(0xB0); //Set LCD Vop (Contrast)
LCD_CMD(0x04); //Set Temp coefficent
LCD_CMD(0x14); //LCD bias mode 1:48 (try 0x13)
              //We must send 0x20 before modifying the display control mode
 LCD_CMD(0x20); 
 LCD_CMD(0x0C); //Set display control, normal mode.
	
  
}


void setContrast(int contrast)
{  
LCD_CMD(0x21); //Tell LCD that extended commands follow
  LCD_CMD(0x80 | contrast); //Set LCD Vop (Contrast): Try 0xB1(good @ 3.3V) or 0xBF if your display is too dark
 LCD_CMD(0x20); //Set display mode
}



void updateDisplay()
{
  gotoXY(0, 0);
  for (int i=0; i < (LCD_WIDTH * LCD_HEIGHT / 8); i++)
  {
    LCD_DATA(displayMap[i]);
  }
}




int main(void)
{


  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_USART1_UART_Init();
  MX_SPI1_Init();

  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  
  LCD_init();
     

  while (1)
  {

  //gotoXY(0, 0);
  // LCD_DATA(0x1);
  // gotoXY(1, 1);
  // LCD_DATA(0x1);
 //  gotoXY(2, 2);
 //  LCD_DATA(0x1);
  // gotoXY(3, 3);
  // LCD_DATA(0x1);
  // gotoXY(4, 4);
  // LCD_DATA(0x1);
    ris3();
HAL_Delay(7000);
clear2();
HAL_Delay(1000);


  }
  /* USER CODE END 3 */

}

/** System Clock Configuration
*/
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_PeriphCLKInitTypeDef PeriphClkInit;

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
  PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure the Systick interrupt time 
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick 
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

/* ADC1 init function */
static void MX_ADC1_Init(void)
{

  ADC_InjectionConfTypeDef sConfigInjected;

    /**Common config 
    */
  hadc1.Instance = ADC1;
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc1.Init.ContinuousConvMode = ENABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 1;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure Injected Channel 
    */
  sConfigInjected.InjectedChannel = ADC_CHANNEL_1;
  sConfigInjected.InjectedRank = 1;
  sConfigInjected.InjectedNbrOfConversion = 1;
  sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  sConfigInjected.ExternalTrigInjecConv = ADC_INJECTED_SOFTWARE_START;
  sConfigInjected.AutoInjectedConv = DISABLE;
  sConfigInjected.InjectedDiscontinuousConvMode = DISABLE;
  sConfigInjected.InjectedOffset = 0;
  if (HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

/* SPI1 init function */
static void MX_SPI1_Init(void)
{

  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 10;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

/* USART1 init function */
static void MX_USART1_UART_Init(void)
{

  huart1.Instance = USART1;
  huart1.Init.BaudRate = 250000;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

/** Configure pins as 
        * Analog 
        * Input 
        * Output
        * EVENT_OUT
        * EXTI
*/
static void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3|GPIO_PIN_4, GPIO_PIN_RESET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);

  /*Configure GPIO pins : PA3 PA4 */
  GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pin : PB7 */
  GPIO_InitStruct.Pin = GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @param  None
  * @retval None
  */
void _Error_Handler(char * file, int line)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  while(1) 
  {
    
 
  }
  /* USER CODE END Error_Handler_Debug */ 
}

#ifdef USE_FULL_ASSERT

/**
   * @brief Reports the name of the source file and the source line number
   * where the assert_param error has occurred.
   * @param file: pointer to the source file name
   * @param line: assert_param error line source number
   * @retval None
   */
void assert_failed(uint8_t* file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
    ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */

}

#endif

/**
  * @}
  */ 

/**
  * @}
*/ 

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

 

Ссылка на комментарий
Поделиться на другие сайты

Вот тут, например

void LCD_CMD(uint16_t data) {
  
  RS_Low;
  CS_Low;
   SPI1->DR=data;
  CS_Hi;
}

 

после SPI1->DR=data; только-только началась передача байта по SPI, но тут же сигнал CS_Hi выключил приём у дисплея, не дожидаясь окончания передачи! Поэтому, конечно, дисплей проигнорировал эту команду.

Надо дождаться окончания передачи и только потом уже выдавать CS_Hi.

например вот так

while(!(SPI1->SR & SPI_SR_TXE)); // ждём окончания передачи

 

Изменено пользователем Yurkin2015
Ссылка на комментарий
Поделиться на другие сайты

Та вставлял проверку этого регистра, и пробовал обмен данными между двумя SPI тогда нету обмена данными, а как убираю проверку  этого регистра так обмен данными между двумя SPI идет, поэтому и убрал эту проверку

А теперь ругаться стало на проверку этого регистра, что за ерунда

 

void LCD_CMD(uint16_t data) {
  
  RS_Low;
  CS_Low;
   SPI1->DR=data;
while (!(SPI1->SR&SPI_SR_TXE));  
  CS_Hi;
}

 

Ссылка на комментарий
Поделиться на другие сайты

Вообщем то IAR глюканул был, поэтому и начал ругаться на while (!(SPI1->SR&SPI_SR_TXE)); , ну вот поставил проверку регистра буфера передатчика while (!(SPI1->SR&SPI_SR_TXE)); как я раньше и делал, и теперь даже инициализация не проходит, я просто уже ж говорю до этого между двумя аппаратными SPI на одном STM32 когда прописывал проверку регистра  состояния передатчика на первом SPI и проверку регистра состояния приемника на втором SPI у меня пропадал обмен данными.

Ссылка на комментарий
Поделиться на другие сайты

Может попробовать ЮАРТОм в синхронном режиме слать команды и данные, и посмотреть что будет? Хоть в скорости я потеряю, но читал кто-то вроде так делал.

Ссылка на комментарий
Поделиться на другие сайты

Попробовал, синхронный режим ЮАРТ и с проверкой регистра состояния передатчика, ничего, дисплей не работает, бред какой-то, на ардуино все работает.

Ссылка на комментарий
Поделиться на другие сайты

Вопрос такой в ардуино есть функция 

millis() - Возвращает количество миллисекунд с момента начала выполнения текущей программы на плате Arduino. Это количество сбрасывается на ноль, в следствие переполнения значения, приблизительно через 50 дней.

Очень удобно ней пользоваться для выполнения задач по времени от начала включения, ну или в других своих функциях, при этом она не останавливает программный код как delay, есть ли подобная функция для STM32?

Ссылка на комментарий
Поделиться на другие сайты

RTC. Настройте предделитель на миллисекунды и у вас будет счетчик на 4294967295 мс. Естественно батарейка для подпитки нужна будет.

Изменено пользователем Zhuk72
Ссылка на комментарий
Поделиться на другие сайты

6 часов назад, Электронщик сказал:

есть ли подобная функция для STM32?

Сами сделайте.
Возьмите любой таймер (лучше coretimer, или как он там называется в STM'ах ...), настройте его на 1 мс. и считайте их.

 

Ссылка на комментарий
Поделиться на другие сайты

и какой смысл чтото выдумывать, если в любом STM уже есть стандартный таймер с миллисекундным интервалом? Называется SysTick. Встроен непосредственно в ядро ARM. Если используете SPL, то инитится вручную и прерывание счетчика запускается тоже вручную. Если создаете конфиг через куб, то все это делается автоматически, вне зависимости от конфигурации, в стандартном шаблоне. Естественно на HAL. Но зато можно пользоваться функциями HAL_Delay() (аналог Delay_ms()) и HAL_GetSysTick() (аналог mills())

В ручную можно этот таймер запускать и на другие интервалы, но тогда могут быть глюки с отладкой. Да и прерывание слишком часто дергать тоже не очень здорово

2 часа назад, Zhuk72 сказал:

RTC. Настройте предделитель на миллисекунды и у вас будет счетчик на 4294967295 мс. Естественно батарейка для подпитки нужна будет

возможность подключения батарейки далеко не у каждого камня есть. емнип такая функция присутствует только начиная с 64 лапых корпусов

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...