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

STM32 для чайника


ART_ME

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

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

и какой смысл чтото выдумывать, если в любом STM уже есть стандартный таймер с миллисекундным интервалом? Называется SysTick.

С каких пор конфигурирование нескольких регистров называется выдумыванием? В чем отличие его инициирования от инициирования SysTick'a? Кроме того, последний нужно обеспечить постоянным питанием, да и системное тактирование поддерживать нужно. Это первое. Второе, миллисекунды накапливать придется через прерывание, значит дергать МК по пустякам каждую миллисекунду. А RTC независимо тикают, 3 разновидности прерывания, так что есть варианты.

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

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

У 48 точно есть, 1-й вывод.

У @Электронщик , я полагаю, именно F103C или больше, а не 36-ногий F103Т.

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

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

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

а так то да, варианты есть. Согласен. Странно было бы их не иметь при таком обширном наборе периферии и опций

5 минут назад, Zhuk72 сказал:

У 48 точно есть, 1-й вывод

я ж писал - ЕМНИП. Сейчас посмотрел, да, у 48-лапых есть. У Электронщика F103C8T6 c немного кастрированным RTC, который не умеет сам запоминать дату

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

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

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

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

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

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

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

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

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

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

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

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

50 дней

 

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

Очень удобно ней пользоваться для выполнения задач по времени от начала включения

 

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

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

Да, дней :)

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

millis() - Возвращает количество миллисекунд с момента начала выполнения текущей программы

Так что считать нужно будет всегда.

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

после отключения питания программа начинается заново. Ваш Кэп

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

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

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

 Зато после после возобновления питания RTC не придется конфигурировать по новой.

Мы двое спорим о том, что нужно третьему, который в споре не участвует. Не смешно?

:)

 

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

да ну? А куда денется код инициализации из кода программы, которая стартанет и выполнится каждый раз после рестарта? И будет ли в таком случае разница - единожды написать код под RTC и точно так же единожды под систик. Или вы каждый раз переписываете код перед рестартом?

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

Мы двое спорим о том, что нужно третьему, который в споре не участвует

это все может почитать четвертый

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

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

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

А куда денется код инициализации из кода программы

Никуда естественно.

Но инициализация часов (не считая пары команд с PWR и BDP) начинается с проверки if (RCC->BDCR & RCC_BDCR_RTCEN), и если бит выставлен, то дальнейшее пропускают. Или я не прав?

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

естественно прав. Но инитка же из кода никуда не делась. Ни та ни другая.

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

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

Спасибо mail_robot, я как раз и искал подобную функцию HAL_GetSysTick()

На счет 50 дней то мне они ни к чему, мне и и до суток хватит. Спасибо всем

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

Так ну с временем применил HAL_GetSysTick(), хорошая функция, с ШИМОм тоже разобрался и по регистрам и с применением функции, сейчас интересует такой вопрос, прошиваю свой камень через Flash loader demonstrater, а вот есть фьюзы защиты от чтения программы, но чтобы перезаливать код можно было в камень, я так делал на AVR, мне вот интересно есть ли какая - то защита от чтения моего кода с камня?

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

ну вот чисто гипотетически представь, что прочитал машинный код из камня. И что дальше? Даже самому крутому кодеру это даст гемору минимум на месяц, не говоря уже об остальных. Проще сесть и заново прошу написать. Поэтому функция защиты кода ИМХО для параноиков

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

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

Защита естественно имеется! есть возможность блокировки только необходимых страниц на выбор. Утилита STM32 ST-LINC Utility закладка Target пункт Option Bytes...

Сергей.

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

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

можно перезаливать, и клонировать твое устройство

для начала нужно суметь создать устройство достойное клонирования ))

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

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

Скрытый текст


/* 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 ---------------------------------------------------------*/


SPI_HandleTypeDef hspi1;



/* Private variables ---------------------------------------------------------*/


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

static void MX_SPI1_Init(void);



uint8_t 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 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





void LCD_CMD(uint16_t data) {
  
  RS_Low;
  CS_Low;
  SPI1->DR=data;
while (SPI1->SR&SPI_SR_BSY==1);
  CS_Hi;

}





void LCD_DATA(uint16_t data) {
  
  RS_Hi;
  CS_Low;
  SPI1->DR=data;
 while (SPI1->SR&SPI_SR_BSY==1);
  CS_Hi;

}


int x;
int y;
int bw;







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



void ris3(void){

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




void LCD_init(void) {
  


  RESET_Low;// Сброс и Окончание Сброса LCD 
  HAL_Delay(10);
  RESET_Hi;
 
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 LCDclear(bw){
for (int i=0; i<(LCD_WIDTH * LCD_HEIGHT / 8); i++)
  {
    if (bw)
      displayMap[i] = 0xFF;
    else
      displayMap[i] = 0;
  }
}





int main(void)
{


  HAL_Init();


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


  /* Initialize all configured peripherals */
  MX_GPIO_Init();

  MX_SPI1_Init();


  
  LCD_init();
      setContrast(55);
LCDclear(WHITE);
  while (1)
  {


  
    ris3();
HAL_Delay(7000);



  }
  /* 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);
}



/* 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_32;
  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__);
  }


}



/** 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****/

 

Вообщем так и не могу победить дисплей Nokia 3310 он же nokia 5110, ничего не происходит, вот код, что не так ? Помогите пожалуйста, так то SPI между собой работают на одном проце, а с дисплеем ничего не могу запустить, при том же я говорю что этот код на ардуино работает, может частота тактирования для этого дисплея 2,25МГц не подходит? Написано что частота тактирования для него до 4МГц. 

/* Includes ------------------------------------------------------------------*/

 

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

Вообщем заработал дисплей от Nokia3310 сделал осциллограф с выводом значения амплитуды и регулировкой частоты развертки, проблема была в том что начал осциллом смотреть никаких сигналов нет на выходе проца, обнаружил что define в IAR почему-то не работают, и не работает передача данных регистром SPI DR, пришлось применить функцию стандартной библиотеки SPI, частоту тактирования SPI для данного дисплея поставил 9,5МГц, будет время попробую прицепить 1602 по I2C и LS020 или другой цветной дисплей. Вопрос в том почему не работает define в IAR может что - то настроить нужно? Так же интересует почему не работает передача данных через регистр SPI DR и USART1->DR? Пришлось вікрутиться функциями стандартніх библиотек переферии

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

а просто надо не выпендриваться и юзать чистый HAL (раз уж взялся), а не дикий венегрет из хал, регистров и дефайнов. И все будет прекрасно работать

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

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

Возможно и так. Но с АЦП у меня регистр приема данных работает, а конфигурация через куб(HAL). Да и в нете я видел что конфигурацию делают в кубе или в  другом конфигураторе допустим в coox а дальше все через регистры делают и работает.

Да и вопрос с define почему не работают?

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

Столкнулся с новой проблемой, есть 1602 подключенный через переходник I2C к STM32 вот такой вот код, пытаюсь отправлять данные, смотрю осциллом, а у меня что на линии SCL что на SDA логическая 1 стоит и все, что не так, подскажите пожалуйста? 

void com(uint8_t com)
{
	com |= 0x08;			    // Р3 в единицу, дабы горела подсветка
	HAL_I2C_Master_Transmit(&hi2c1,0x3F,&com,1,100);	// Вывод данных
	com |= 0x04;				// Е в единицу
	HAL_I2C_Master_Transmit(&hi2c1,0x3F,&com,1,100);	// Вывод данных
	com &= 0xFB;				// Е в ноль
	HAL_I2C_Master_Transmit(&hi2c1,0x3F,&com,1,100);	// Вывод данных
        
}


void initdispl(void){
HAL_Delay(30);		// Пауза после подачи питания
	com(0x30);		// Переход в 4-х битный режим
	HAL_Delay(1);		// Задержка для выполнения команды
	com(0x30);		// Переход в 4-х битный режим
	HAL_Delay(1);			// Задержка для выполнения команды
	com(0x30);		// Переход в 4-х битный режим
	HAL_Delay(1);			// Задержка для выполнения команды
	com(0x20);		// Переход в 4-х битный режим
	HAL_Delay(1);			// Задержка для выполнения команды
	com(0x20);		// Установка параметров
	com(0x80);		// Установка параметров
	com(0x00);		// Выключаем дисплей
	com(0x80);		// Выключаем дисплей
	com(0x00);		// Очищаем дисплей
	com(0x10);		// Очищаем дисплей
	com(0x00);		// Устанавливаем режим ввода данных
	com(0x60);		// Устанавливаем режим ввода данных
	com(0x00);		// Включаем дисплей с выбранным курсором
	com(0xC0);		// Включаем дисплей с выбранным курсором
}


Инициализация
/* I2C1 init function */
static void MX_I2C1_Init(void)
{

  hi2c1.Instance = I2C1;
  hi2c1.Init.ClockSpeed = 100000;
  hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
  hi2c1.Init.OwnAddress1 = 0;
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c1.Init.OwnAddress2 = 0;
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

 

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

ну наверное надо резиками подтянуть. У F0xx резики подтяжки уже встроены и могут включаться по требованию кодера, F1xx такой фичи не имеют

код мэйна покаж

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

Да и вопрос с define почему не работают?

они может и работают, но точно правильно написаны? Может быть местами должен быть регистр BRR вместо BSRR?

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

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

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

Цитата

ну наверное надо резиками подтянуть. У F0xx резики подтяжки уже встроены и могут включаться по требованию кодера, F1xx такой фичи не имеют

Резисторы на линиях на самом переходнике I2C стоят по 4,7кОм

Цитата

они может и работают, но точно правильно написаны? Может быть местами должен быть регистр BRR вместо BSRR?

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

 

Вот код пока только инициализацию дисплея написал и инициализацию задержал на время чтобы увидеть курсор, но курсор не появляется, но проблема в том что при подачи питания на линиях SCL SDA только логическая 1. Получается либо как я читал куб криво I2C конфигурирует, либо проблемы с функцией I2C, либо адрес переходника не тот( но адрес тот, я просканировал через ардуино УНО адрес), либо не те адресса команд( но при не тех адресах, у меня бы и подсветка не включилась бы на дисплее, и по крайней мере передача данных бы шла и тактирование тоже, а осцил показывает лог. 1

Скрытый текст

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

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

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

I2C_HandleTypeDef hi2c1;

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_I2C1_Init(void);
static void MX_USART1_UART_Init(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */



void com(uint8_t com)
{
	com |= 0x08;			    // Р3 в единицу, дабы горела подсветка
	HAL_I2C_Master_Transmit(&hi2c1,0x3F,&com,1,100);	// Вывод данных
	com |= 0x04;				// Е в единицу
	HAL_I2C_Master_Transmit(&hi2c1,0x3F,&com,1,100);	// Вывод данных
	com &= 0xFB;				// Е в ноль
	HAL_I2C_Master_Transmit(&hi2c1,0x3F,&com,1,100);	// Вывод данных
        
}


void initdispl(void){
HAL_Delay(30);		// Пауза после подачи питания
	com(0x03);		// Переход в 4-х битный режим
	HAL_Delay(1);		// Задержка для выполнения команды
	com(0x03);		// Переход в 4-х битный режим
	HAL_Delay(1);			// Задержка для выполнения команды
	com(0x03);		// Переход в 4-х битный режим
	HAL_Delay(1);			// Задержка для выполнения команды
	com(0x02);		// Переход в 4-х битный режим
	HAL_Delay(1);			// Задержка для выполнения команды
	com(0x28);
        // Установка параметров
	com(0x0C);		// Установка параметров
	com(0x01);		// Выключаем дисплей
	com(0x06);		// Выключаем дисплей
	//com(0x00);		// Очищаем дисплей
	//com(0x10);		// Очищаем дисплей
	//com(0x00);		// Устанавливаем режим ввода данных
	//com(0x60);		// Устанавливаем режим ввода данных
	//com(0x00);		// Включаем дисплей с выбранным курсором
	//com(0xC0);		// Включаем дисплей с выбранным курсором
}


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_I2C1_Init();
  MX_USART1_UART_Init();

  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  initdispl();
  HAL_Delay(10000);
  while (1)
  {
 


  }
  /* 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_ENABLE;
  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_6;
  sConfigInjected.InjectedRank = 1;
  sConfigInjected.InjectedNbrOfConversion = 2;
  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__);
  }

    /**Configure Injected Channel 
    */
  sConfigInjected.InjectedChannel = ADC_CHANNEL_1;
  sConfigInjected.InjectedRank = 2;
  if (HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

/* I2C1 init function */
static void MX_I2C1_Init(void)
{

  hi2c1.Instance = I2C1;
  hi2c1.Init.ClockSpeed = 100000;
  hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
  hi2c1.Init.OwnAddress1 = 0;
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c1.Init.OwnAddress2 = 0;
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  
  
}

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

  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  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 Ports Clock Enable */
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

}

/* 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****/

 

 

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

А сами выводы GPIO настроены правильно? Если точно помню, то должен быть режим - альтернативная функция, открытый сток.

C #define скорее всего глюк IAR. Эта директива препроцессора - часть стандарта языка С, отключить ее нельзя.

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

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

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

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

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

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

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

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

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

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

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

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