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

STM32 для чайника


ART_ME

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

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

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

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

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

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

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 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 пользователей онлайн

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

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