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

STM32 для чайника


ART_ME

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

Вопрос такой какие STM32 имеют встроенное видеоядро? Слышал вроде 400 серия, такие как в Дискавери с дисплеем, там якобы дисплей чисто пиксельная матрица без контроллера на нем, а используется видеоядро которое управляет синхронизацией и как то там пикселями.

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

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

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

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

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

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

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

Ясно. спасибо, но там по ходу во всей 4-й и 7-й сериях, или нужно смотреть?

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

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

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

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

нужно смотреть. Контроллер сам занимаеться ногодрыгом и т.д. вы просто пишите данные в память и все. В теории я не пробовал еще. Там уже навороченно можно и код из внешней флэшки выполнять)

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

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

они вам нужны эти навороты?

да пока что нет, мне и 64кБ хватает, я ж на CMSIS пишу))

Кто-нибудь пробовал настроить работу FMC stm32f746 на работу с SDRAM, вначале хочу в кубе настроить, потом буду глубже вопрос изучать.

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

могут. Только если плата заводская будет, иначе замучаешься разводить

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

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

Все нормально, все получилось, пока детально не изучал вопрос заработало в кубе, всю память не проверял, просто записал кусок 60кБ, потом сравнил. Выложу проект потом как подчищу, может что подправлю, делал по видеоуроку. Размер проекта вышел 7кБ, что чрезмерно много для практически пустого проекта.

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

  • 3 недели спустя...

Прошу не пинать "Чайника".Разрядность STM32 32  бита. ОН может адресовать FFFFFFFF ячеек памяти тоже 32 разрядных. Это получается 4294967295 ячеек. И не важно они 1 битные , 2 битные и т .д. У нас 32  разряда ячейка -это 4 байта. Получаетс я память STM32  не 4 гигабайта, именно приставка байта( я понимаю что вся память исчисляется  в байтах) ,а 16 гигабайт. В чём я не прав.

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

Добавлю- правильнее говорить память STM32-128гигабита, 16 гигабайт, 8гигаслов и 4гигадвухслов

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

Ну и что что он может столько адресовать, ну может да. Только вы посмотрите на организацию этой памяти, это же не просто память куда хочу туда и пишу. А в плане асма да, тут нет гемора как на 8 битках.

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

Вопрос такой, кто - нибудь пробовал настроить 1wire STM32? Решил попробовать как с ним работать без библиотек тот же 1820 подкинуть, но пока дома нашел DHT11 и пытаюсь подкинуть DHT11 к STM, но считываю байт влажности и байт температуры, а у меня по нулям, вопрос такой, как правильно настроить выход и вход на 1wire, я вначале настраиваю пин на выход альтернативной функции с открытым стоком, а потом этот выход настраиваю как вход с открытым стоком, так нужно? За основу взял этот пример, правда тут для AVR  http://www.ap-impulse.ru/datchik-vlazhnosti-dht11-shag-20/

 void send_to_uart(int16_t data) {
//while(!(USART1->SR & USART_SR_TC)); //Ждем пока бит TC в регистре SR станет 1
 while(!(USART1->SR & USART_SR_TXE));
USART1->DR=data; //Отсылаем байт через UART
}
 
 uint16_t data11;
 void GPIOout(void){
 RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;//|RCC_APB2ENR_AFIOEN;//включаем тактирование GPIO
GPIOB->CRL |= (GPIO_CRL_CNF4_1 |GPIO_CRL_CNF4_0 | GPIO_CRL_MODE4_1| GPIO_CRL_MODE4_0);// настроены на 50МГц альтернативная функция с открытым стоком  

}


void GPIOin(void){
 RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;//|RCC_APB2ENR_AFIOEN;//включаем тактирование GPIO
GPIOB->CRL &=~(GPIO_CRL_CNF4_1 |GPIO_CRL_CNF4_0 | GPIO_CRL_MODE4_1| GPIO_CRL_MODE4_0);// настроены на 50МГц альтернативная функция с открытым стоком  

}
 

uint8_t datadht[5]; /* массив для значений датчика*/
 
  void dhtread(){ //опрос датчика
     uint8_t j = 0, i = 0; /*локальные переменные*/
       datadht[0] = datadht[1] = datadht[2] = datadht[3] = datadht[4] = 0 ;   
               GPIOout();
  GPIOB->BSRR = GPIO_BSRR_BR4;// начало считывания
 
      HAL_Delay(20); /*18 мс по условиям документации. В принципе в ходе экспериментов я ставил задержку 30 мс, то существенной разницы не почувствовал. */
      GPIOB->BSRR = GPIO_BSRR_BS4;/*отпускаем линию*/
     HAL_Delay(0.4); /*задержка по условию*/
    
       GPIOin();
       if (GPIOB->IDR & GPIO_IDR_IDR4==1) //считываем вход датчик должен ответить 0
                       { return; }
         HAL_Delay(0.8); // задержка
        if (GPIOB->IDR & GPIO_IDR_IDR4==0) /*по истечению 80 мкс, датчик должен отпустить шину*/
                       { return; }
/*Высокий сигнал на линии продлится также приблизительно 80 мкс*/
        
          while (GPIOB->IDR & GPIO_IDR_IDR4==1); /* ждем пока контроллер датчика начнет передавать данные*/
        //передача начинается с нуля
         
        for (j=0; j<5; j++)
          {
                 datadht[j]=0;
                 for (i=0; i<8; i++)
                 {
                           //cli (); // запрещаем прерывания 
                           while (GPIOB->IDR & GPIO_IDR_IDR4==0);   /* ждем когда датчик отпустит шину */
                          HAL_Delay(0.3); /*задержка высокого уровня при 0 30 мкс*/
                          if (GPIOB->IDR & GPIO_IDR_IDR4==1) /*если по истечению времени сигнал на линии высокий, значит передается 1*/
                                       datadht[j]|=1<<(7-i); /*тогда i-й бит устанавливаем 1*/
                          while (GPIOB->IDR & GPIO_IDR_IDR4==0);  // ждем окончание 1 
                        //sei ();// разрешаем общее прерывание
                  }
          }
          return;
        }


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

  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  

 
 
  while (1)
  {

dhtread();
send_to_uart(datadht[2]);
HAL_Delay(2000);

}




  /* USER CODE END 3 */

}

 

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

Попробоавал так, тоже по нулям, за пример взято это 

 

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

 /* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f1xx_hal.h"
#define DHT11_ERROR 255
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

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

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);

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

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

 uint8_t i=0;
void send_to_uart(int16_t data) {
 while(!(USART1->SR & USART_SR_TXE));
USART1->DR=data; //Отсылаем байт через UART
}
 
 uint16_t data11;
 void GPIOout(void){
 RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;//|RCC_APB2ENR_AFIOEN;//включаем тактирование GPIO
GPIOB->CRL |= (GPIO_CRL_MODE4_1| GPIO_CRL_MODE4_0);// настроены на 50МГц 
GPIOB->CRL &=~(GPIO_CRL_CNF4_0 | GPIO_CRL_CNF4_1);//  двухтактный выход обычного назначения
}


void GPIOin(void){
 RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;//|RCC_APB2ENR_AFIOEN;//включаем тактирование GPIO
GPIOB->CRL &=~(GPIO_CRL_CNF4_0| GPIO_CRL_MODE4_1| GPIO_CRL_MODE4_0);// цифровой вход с подтягивающим резистором 
GPIOB->CRL |= (GPIO_CRL_CNF4_1);
}
  uint8_t dht11_getdata(uint8_t select) {
uint8_t bits[5];
uint8_t i,j = 0;
memset(bits, 0, sizeof(bits));
//reset port
GPIOout(); //output
 GPIOB->BSRR = GPIO_BSRR_BS4;//high
HAL_Delay(100);
//send request
GPIOB->BSRR = GPIO_BSRR_BR4; //low
HAL_Delay(18);
 GPIOB->BSRR = GPIO_BSRR_BS4;//high
HAL_Delay(0.01);
GPIOin(); //input
HAL_Delay(0.39);
//check start condition 1
if(GPIOB->IDR & GPIO_IDR_IDR4==1) {
return DHT11_ERROR;
}
HAL_Delay(0.8);
//check start condition 2
if(GPIOB->IDR & GPIO_IDR_IDR4==0) {
return DHT11_ERROR;
}
HAL_Delay(0.8);
//read the data
for (j=0; j<5; j++) { //read 5 byte
uint8_t result=0;
for(i=0; i<8; i++) {//read every bit
while(GPIOB->IDR & GPIO_IDR_IDR4==0); //wait for an high input
HAL_Delay(0.3);
if(GPIOB->IDR & GPIO_IDR_IDR4==1) //if input is high after 30 us, get result
result |= (1<<(7-i));
while(GPIOB->IDR & GPIO_IDR_IDR4==1); //wait until input get low
}
bits[j] = result;
}
//reset port
GPIOout(); //output
GPIOB->BSRR = GPIO_BSRR_BR4; //low
HAL_Delay(100);
//check checksum
if (bits[0] + bits[1] + bits[2] + bits[3] == bits[4]) {
if (select == 0) { //return temperature
return(bits[2]);
} else if(select == 1){ //return humidity
return(bits[0]);
}
}
return DHT11_ERROR;
}
/*
* get temperature (0..50C)
*/
int8_t dht11_gettemperature() {
uint8_t ret = dht11_getdata(0);
if(ret == DHT11_ERROR)
return -1;
else
return ret;
}
/*
* get humidity (20..90%)
*/
int8_t dht11_gethumidity() {
uint8_t ret = dht11_getdata(1);
if(ret == DHT11_ERROR)
return -1;
else
return ret;
}
  
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();

  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  

 
 
  while (1)
  {

int temperature=dht11_gettemperature();
char data6[2];
sprintf(data6,"%d",temperature);
for(int i=0; i<2; i++){
send_to_uart(data6[i]);
}

HAL_Delay(2000);

}





  /* 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_1;
  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_6;
  sConfigInjected.InjectedRank = 2;
  if (HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected) != 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;
  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 : PB6 */
  GPIO_InitStruct.Pin = GPIO_PIN_6;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  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****/

 

 

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

Вообщем такой же код набросал на AVR все работает, а на STM32 нет

Подправил все, но у меня в COM - порт печатает ERORR, думаю проблема либо в неправильности переключения вход-выход, этот кусок, либо в нем же не правильно что я настроил выход как альтернативную функцию с открытым истоком, хотя думаю для 1wire, это должно быть нормально, либо проблема в том что я использую задержки с помощью HAL_Delay, а мне там нужны микросекунды, и допустим 30мкс, я прописываю как HAL_Delay(0.03); другого как по моему не дано, подскажите в чем проблема 

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

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



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

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);

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

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */


void send_to_uart(int16_t data) {
//while(!(USART1->SR & USART_SR_TC)); //Ждем пока бит TC в регистре SR станет 1
 while(!(USART1->SR & USART_SR_TXE));
USART1->DR=data; //Отсылаем байт через UART
}
 
 void GPIOout(void){
 RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;//|RCC_APB2ENR_AFIOEN;//включаем тактирование GPIO
GPIOB->CRL |= (GPIO_CRL_CNF4_1 |GPIO_CRL_CNF4_0 | GPIO_CRL_MODE4_1| GPIO_CRL_MODE4_0);// настроены на 50МГц альтернативная функция с открытым стоком  

}


void GPIOin(void){
 RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;//|RCC_APB2ENR_AFIOEN;//включаем тактирование GPIO
GPIOB->CRL &=~(GPIO_CRL_CNF4_0 | GPIO_CRL_MODE4_1| GPIO_CRL_MODE4_0);// настроены на 50МГц, вход
GPIOB->CRL |= (GPIO_CRL_CNF4_1);
               
}
 

  
uint8_t datadht[5]; /* массив для значений датчика*/
  
  
int dhtread ()// функция чтения датчика
{
        uint8_t j = 0, i = 0; /*локальные переменные*/
        datadht[0] = datadht[1] = datadht[2] = datadht[3] = datadht[4] = 0;             
         /*Шаг №1*/
     GPIOout();// выход
        
        GPIOB->BSRR = GPIO_BSRR_BR4; /*низкий уровень — подтягиваем линию-       разбудим датчик*/
        HAL_Delay(18); /*18 мс по условиям документации. В принципе в ходе экспериментов я ставил задержку 30 мс, то существенной разницы не почувствовал. */
       GPIOB->BSRR = GPIO_BSRR_BS4; /*отпускаем линию*/
         HAL_Delay(0.04); /*задержка по условию*/
  /*Шаг №2*/
         GPIOin(); // вход
      
        if (HAL_GPIO_ReadPin (GPIOB, GPIO_PIN_4)==1) //датчик должен ответить 0
                       { return 0; }
         HAL_Delay(0.08); // задержка
        if (HAL_GPIO_ReadPin (GPIOB, GPIO_PIN_4)==0) /*по истечению 80 мкс, датчик должен отпустить шину*/
                       { return 0; }
/*Высокий сигнал на линии продлится также приблизительно 80 мкс*/
/*Шаг№3*/

         while (HAL_GPIO_ReadPin (GPIOB, GPIO_PIN_4)==1); /* ждем пока контроллер датчика начнет передавать данные*/
//передача начинается с нуля
         for (j=0; j<5; j++)
          {
                 datadht[j]=0;
                 for (i=0; i<8; i++)
                 {
                         
                           while (HAL_GPIO_ReadPin (GPIOB, GPIO_PIN_4)==0);   /* ждем когда датчик отпустит шину */
                          HAL_Delay(0.03); /*задержка высокого уровня при 0 30 мкс*/
                          if (HAL_GPIO_ReadPin (GPIOB, GPIO_PIN_4)==1) /*если по истечению времени сигнал на линии высокий, значит передается 1*/
                                       datadht[j]|=1<<(7-i); /*тогда i-й бит устанавливаем 1*/
                          while (HAL_GPIO_ReadPin (GPIOB, GPIO_PIN_4)==1);  // ждем окончание 1 
                         
                  }
          }
          return 1;
}
 
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();

  

 
  while (1)
  {
     HAL_Delay(1000); 
            
                HAL_Delay(1000); 
               dhtread (); //опрос датчика
               /*Проверка датчика на ошибки*/
              if (datadht[0]==0 && datadht[1]==0 && datadht[2]==0 && datadht[3]==0)
              { char data11[]={"ERORR"};
                 for(int i=0; i<5; i++){
              send_to_uart(data11[i]);} }
               /* Проверка контрольной суммы*/
              else if (datadht[0] + datadht[1] + datadht[2] + datadht[3] == datadht[4])
             { /* Если сумма совпадает, то ок*/
                    char data5[2];
                     for(int i=0; i<2; i++){
                    sprintf(data5,"%d",datadht[0]);
                     send_to_uart(data5[i]);// передаем показания влажности
                      }
                      HAL_Delay(2000);
                     char data6[2];
                     for(int i=0; i<2; i++){
                    sprintf(data6,"%d",datadht[0]);
                      send_to_uart(data6[i]);// передаем показания температуры
                       }
                      HAL_Delay(2000);
              }
              else
             { char data11[]={"No equal"};
                 for(int i=0; i<9; i++){
              send_to_uart(data11[i]);}}

    
    
    

}





  /* 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_1;
  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_6;
  sConfigInjected.InjectedRank = 2;
  if (HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected) != 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;
  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();
  



}

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

 

 

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

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

HAL_Delay(0.03)

возможно в этом вся и проблема. Аргумент этой функции всегда типа uint, а вы ему float суете. Естественно при вызове компилятор передаст туда 0 и задержки никакой не будет. Надо свою задержку писать на такие мелкие интервалы

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

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

Я это уже понял, когда осциллом посмотрел, что как опускаю значение ниже 0,1мс, в этой функции, так частота дерганья пина уходит вверх.

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

Не могу только найти пример как миллисекундные задержки сделать, я так понял настраиваем таймер на one pulse mode, и ставим предделитель частоты, а дальше инкремент или декремент, вот только не найду хорошей инфы по этому поводу, и какой лучше таймер использовать?

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

очень просто. чисто как пример

void MT_WH1602_Delay(uint32_t us) 
{
  volatile uint32_t i = (HAL_RCC_GetSysClockFreq()/10000000)*us;	
  for (; i != 0; i--);
}

 

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

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

Вообщем микросекундные задержки сделаны, а датчик так и не считывается, ERORR в COM-порте и все

Значить проблема в настройке этого 

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

void GPIOout(void){
 RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;//|RCC_APB2ENR_AFIOEN;//включаем тактирование GPIO
GPIOB->CRL |= (GPIO_CRL_CNF4_1 |GPIO_CRL_CNF4_0 | GPIO_CRL_MODE4_1| GPIO_CRL_MODE4_0);// настроены на 50МГц альтернативная функция с открытым стоком  

}


void GPIOin(void){
 RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;//|RCC_APB2ENR_AFIOEN;//включаем тактирование GPIO
GPIOB->CRL &=~(GPIO_CRL_CNF4_0 | GPIO_CRL_MODE4_1| GPIO_CRL_MODE4_0);// настроены на 50МГц, вход
GPIOB->CRL |= (GPIO_CRL_CNF4_1);
               
}

 

 

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

По 1 wire не так давно возился с DS18b20 задержку делал на аппаратном таймере... Так вот пока не включил оптимизацию компилятора (-O2), часто контрольные суммы не сходились, пользуюсь HAL, видать сама функция считывания порта выполняется относительно долго, с оптимизацией заработало, дальше не копал особо...

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

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

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

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

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

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

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

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

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

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

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

  • Сообщения

    • Все предложенные к рассмотрению источники питания работают примерно по одному принципу: сетевое напряжение выпрямляется, фильтруется (получаем чуть больше 300 вольт постоянного), затем преобразуется снова в переменное, но уже на частотах в несколько десятков килогерц, понижается на трансформаторе и снова выпрямляется. За счёт высокой частоты преобразования используется трансформатор на ферритовом, а не на стальном, сердечнике, гораздо меньших габаритов и стоимости. Минусы: значительное усложнение схемы блока и вероятность возникновения различных помех от него. Модули управления (кроме первого) также являются импульными преобразователями, с теми же достоинствами и недостатками. Если нужно по быстрому собрать некое подобие ЛБП, то уж лучше брать модуль вроде этого. Ну и блок питания к нему соответствующий. Но не очень понятно, какой практический опыт можно получить от соединения готовых модулей парой проводов.  
    • У меня больше всего вопросов вызвала необычная схема обеспечения отрицательного питания. Автор этой обстоятельной заметки пишет: For this supply to work correctly, the transformer must have a secondary voltage of at least 18V RMS.  Почему? Что будет не так с отрицательным питанием, если напряжение на трансформаторе будет меньше 18В?   https://tinyurl.com/23mlwxtt - я в простейшей эмуляции ставлю 12В пикового напряжения для трансформатора и на стабилитроне все как положено: -5.6В.
    • Согласен, очень криво объяснил. Это работа трёх вольтовой линии, просто на диод шотки сдвоенный, на один анод приходит сигнал напрямую с трансформатора, а на второй через дроссель. Вольт/деление 5 вольт в клетке, тайминг по моему 10 МС. Третья фотография это сигнал на катодах уровень земли ровно по центру экрана. Но все линии по итогу в порядке 3.3 в, 5, в, 12 в и -12 в. Нагрузить все линии не могу сразу ,так как тут же выгорают транзисторы (имеется нагрузка 250 ватт по 10 ампер на каждую линию за исключением-12в), поэтому нагружаю 3.3 вольтовую линию на 10 ампер,  подключаю переменный резистор 50 ватт на 15 ом на 5 вольтовую линию и постепенно довожу до той той картины с перекосом (это гдето  50 ватт общее). По поводу микросхемы, вверху имеется скрин где между импульсами проскакивает мини импульс, если так можно сказать, он проскакивает и на одной  и на второй ноге (7,8). Микросхема не tl 494, а lw4933/abx942.1/c9421646. Далее они приходят на базы транзисторов 945g  коллекторы этих транзисторов соединены с  выводами трансформатора. Просто схема типовая, легче мне кажется просто привести фото самого блока, для тех кто разбирается будет гораздо информативне.  Диод шотки по 12 вольтовой линии был подгоревший, заменил на донора. Приводить скрины не буду что бы не захламлять тему. В итоге, пока все так же, при достижении определенной нагрузки суммарно где-то 50 ватт, появляется этот "выброс и перекос". По этому имеются мысли на два варианта, это микросхема , этот мини импульс между периодами, на низкой нагрузке особо не влияет, но при достижении определенной приводит с самовозбуждению входной цепи и непроизвольному открытию транзистора нижнего плеча. Либо дело в "горячей части", плавающий дефект в обвязке силовых ключей.  Спасибо за ответ.
    • @Gomerchik а вы контролировали как меняется уровень сигнала на А1 ардуины?
    • Спасибо за совет. Автором данного проекта я не являюсь, мне нужно было воссоздать уличный датчик для метеостанции взамен пропавшего(( Из разного найденного в интернете этот проект работает с моей станцией Орегон (спасибо автору). В понедельник попробую последовать Вашему совету. Но все равно куча непоняток  как блин это работает)) Если дело в неправильной отправки команды, то как на это влияет подключение датчика температуры? Если совсем не подключать таймер, то передача идет один раз (как и прописано в программе), станция принимает и отображает, но минут через сколько-то естественно станция уже ни чего не показывает, но с таймером питание полностью не пропадает с ардуинки, но передача сигнала каким-то образом работает по таймеру.  В моем понимании данная команда подается один раз потому, что таймер должен отключать питание МК после передачи сигнала и каждые 43 сек снова подавать питание (так того требует станция).  Ардуино передает показания температуры отключается полностью и 43 секунды мк не работает.  Сейчас у меня питание пока сделано на подпитке от солнечной батареи, но пару пасмурных дней и аккумулятор съедается до отключения(
    • thickman Так и сделаю. Вытащу из бу БП.  Буду знать, как отличить. Благодарю. Заменил транзисторы на IRFB20N50K. Картина стала, совсем другой.  Похоже трудность не в драйвере, на момент подвозбуда, переходные процессы, в нем, завершены. Увеличил затворные резисторы до 50ом, стало немного лучше.  Не понятно, почему верхний ключ греется несколько сильнее. Возможно, стоит посмотреть ток в коллекторе.  Снабберные емкости временно удалил, изменений не произошло.  Замена ТГР на другой, на кольце MSTN-16A-TH, так же, результата не принесла.   irfb20n50k.pdf
×
×
  • Создать...