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

STM32 для чайника


ART_ME

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

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

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

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

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

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

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

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

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

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

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

Особенности хранения литиевых аккумуляторов и батареек

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

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

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

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

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

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

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

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 пользователей онлайн

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

  • Сообщения

    • Изучая принципиальную схему Вымпела 325 (много общего с моим  Вымпелом 57  2017 г. в.), пришёл к выводу о некорректности своего арифметического расчёта  величины сопротивления RT2. Для точного измерения этого терморезистора всё-таки необходимо отсоединить его от платы (хотя бы один конец), имхо. Возможно кому-нибудь будет интересна прилагаемая принципиальная схема:
    • Ippon Smart Winner 1000 в домашнем аквапарке. Или когда одно хобби в помощь другому. ---- Без УПСа держать такое хозяйство небезопасно. Жители Новокузнецка наверняка запомнят октябрьский блэкаут и контрольный выстрел, пресловутого "жареного петуха" - ноябрьский ураган, когда оба раза пол-города почти сутки сидело без света. Два раза с интервалом в месяц. Линию 110кВ, идущую через Томь (а это полкилометра ширина реки+метров 300 от берегов до опор в сумме) порвало, это вам не розетку починить, особенно когда ветер не прекращается и на опору полезут только камикадзе. Основная проблема в том, что нельзя выключать продувку и фильтрацию. Особенно второе. Если без продувки воздуха рыбы еще как-то могут обойтись (лабиринтовым оно вообще не надо), то вот остановка течения воды через фильтры чревата отравлением продуктами гниения, которые очень быстро начнут поступать из губки в воду. Чтобы этот процесс не случился, нужен постоянный ток воды. Ну а освещение и обогрев - перебьются. Плотные тучи и небольшое плавное похолодание в природе ничего необычного не представляют, чтобы все сдохли именно от этого. Теплоёмкость аквариума достаточно велика, чтобы продержаться несколько часов. Ну а если это важно - грелки можно включить и в защищаемые розетки. Вот как я успокоил свою душу. Купил на Авито девайс, отревизировал его, кое-чего напаял - чтобы лучше заряжало батарею после глубокого разряда, сделал 2 розетки резервного питания вместо 6 (мощность от этого не падает - все розетки внутри параллельно), а 4 оставшихся вывел после встроенного в УПС стабилизатора (это для освещения и грелок ). Почему была выбрана эта модель? А потому что она умеет выдавать именно правильный синус, который порой даже лучше чем то, что выходит из розетки. Чисто компутерные же УПСы выдают не то, чтобы синусоиду, вернее, совсем не синусоиду, а для двигателей в помпах это ой как важно и ой как не подходит. Ну и выглядит данная затея, соответственно, так (вложения ниже текста). Для людей, далёких от электроники, две последних фотографии ни о чём не говорят, а на двух первых - собственно, УПС с комплектом батарей и две штуковины с розетками. Одна выдаёт стабилизированную сеть (без батарейной поддержки) - на освещение и грелки, вторая же - для фильтров и продувки. Для тех же, кто понимает, показал, что именно я сделал: фото 3 - провода со стабилизированной сетью (именно от них нужно брать сеть на свет и грелки), фото 4 - плата зарядного устройства УПСа, где в параллель R67 надо припаять резистор размера 0805 номиналом 300кОм. Ну и полную профилактику на предмет конденсаторного "сухостоя". Тестировал. Слушал писк УПСа в течении трёх (!!!) часов. После чего затея была признана состоявшейся. Да, батареи 17А\ч вместо штатных 7А\ч. После полной разрядки заряд длится 12 часов (по цэшке, не по показаниям УПСа, которые прошиты на штатные батареи). --- Скопипастил сам себя из аквариумной группы в ВК. А теперь чисто технические комментарии. В данном УПСе встроен релейный стабилизатор сетевого напряжения на автотрансформаторе, а уже после него идёт релюха, переключающая сеть и преобразователь. Вот после стабилизатора-но до релюхи и можно включить нагрузку, которой не требуется батарейная поддержка. Напряжение на выходе настраивается кнопками либо из софтины УПСа. Я выставил 220. Для светодиодного света общей мощностью 250Вт и грелок 3*25Вт для малёчников - нормально.  По поводу увеличения зарядного напряжения - при глубокой разрядке батарей УПС включает форсированный режим заряда, это когда батареи заряжаются не до 27,6В, а до 28,2В, по достижению этого напряжения форсаж сразу выключается и на батареи идёт так же штатные 27,6В в "капельном" режиме. Что сделал я: задрал напряжение форсированного заряда еще на 0,4В, т.е. до 28,6В, это 14,3В на батарею. Учитывая, что подобные длительные разряды редки, такой режим включается лишь тогда, когда это реально необходимо, чтобы "прокачать" батареи.  
    • Всем доброго дня. Отдали микровалновку не рабочую. При проверке выяснилось что нет цепи у повышающей обмотки трансформатора, разрезав изоляцию обнаружил отломанный провод обмотки от клемы. Заново опресовать не получится не подлезеш и торчит всего 1см. Посоветуйте что можно предпринять в этой ситуации при зачистки изоляции видимо алюминиевый. Кто нибудь сталкивался с такой проблемой? Как надежно его удлинить? 
    • у вас растяжка не родная, на фото видно что толстая лента желтого цвета, родная очень тонкая блестящая белая.
    • У "нормальных" устройств - да и для этого надо физически кнопочку нажать. Но бывают всякие кривые реализации... Так у друга в машине Bluetooth-FM трансмиттер - очень дружелюбная железка, каждый раз при включении питания разрешает всем к себе подключаться. Кто первый встал - того и тапки музыка.
    • Не мог он так сделать, если ранее никогда не подключался к колонке, т.к. новые устройства только в режиме pairing подключаются.
×
×
  • Создать...