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

STM32 для чайника


ART_ME

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

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

Вот хотя это только тактирование шины APB2  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; а не самого ЮАРТ, извиняюсь не увидел

Но я же ту строчку пробовал добавлять в свою функцию инициализации и не работало, я то попробую, может не правильно прописал ее был, так оно бы ругалось бы в IAR, я так думаю. Спасибо буду пробовать

Еще такая вот проблема есть внешняя EPROM по I2C ну вот пытаюсь записать в нее число 13 в ячейку по адресу 0x04 и считать ее соответственно, но выходит число 168, при этом даже отладчиком сама запись а потом считывание дают число 168, с этими функциями еще не работал, может что не так делаю?

Вот в функции записи так же как и чтения указывать нужно размер памяти, но размер полной памяти EEPROM указывать, или какой-то другой, я просто указал что 1

HAL_I2C_Mem_Write
Function Name HAL_StatusTypeDef HAL_I2C_Mem_Write
(I2C_HandleTypeDef * hi2c, uint16_t DevAddress, uint16_t
MemAddress, uint16_t MemAddSize, uint8_t * pData, uint16_t
Size, uint32_t Timeout)
Function Description Write an amount of data in blocking mode to a specific memory
address.
Parameters  hi2c: : Pointer to a I2C_HandleTypeDef structure that
contains the configuration information for the specified I2C.
 DevAddress: Target device address
 MemAddress: Internal memory address
 MemAddSize: Size of internal memory address
 pData: Pointer to data buffer
 Size: Amount of data to be sent
 

Вот код

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

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

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/
I2C_HandleTypeDef hi2c1;

UART_HandleTypeDef huart1;

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

/* USER CODE END PV */

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


 



void nastr() {
  uint8_t data;
 
  data=13;
  HAL_I2C_Mem_Write(&hi2c1, 0xB0,0x04,1,&data,1,1);

}
int main(void)
{

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


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

 

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_I2C1_Init();
  MX_USART1_UART_Init();
nastr();
  
  while (1)
  {
    uint8_t data5;
 
HAL_I2C_Mem_Read(&hi2c1,0xB1,0x04,1,&data5,1,5);
HAL_UART_Transmit(&huart1,&data5,1, 1);
HAL_Delay(100);
  }


}

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

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

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

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

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

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

}

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

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

}

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

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

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

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

#ifdef USE_FULL_ASSERT

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

}

#endif

/**
  * @}
  */ 

/**
  * @}
*/ 

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

 

 

Для ЮАРТА попробовал такую инициализацию, не работает

void USART1_UART_Init(){
 
USART1->BRR=0x30; //BaudRate 250000
USART1->CR1 |= USART_CR1_UE; //Разрешаем работу USART1
USART1->CR1 |= USART_CR1_TE; //Включаем передатчик
RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
}

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

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

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

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

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

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

Сделал запись EEPROM с задержкой, но не помагает, вот так вот

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

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

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/
I2C_HandleTypeDef hi2c1;

UART_HandleTypeDef huart1;

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

/* USER CODE END PV */

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


 



void nastr() {
  uint8_t data;
  data=13;
  HAL_I2C_Mem_Write(&hi2c1, 0xD0,0x04,1,&data,1,5);
 HAL_Delay(10);
}
int main(void)
{

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


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

 

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_I2C1_Init();
  MX_USART1_UART_Init();
nastr();
  
  while (1)
  {
    uint8_t data5;
 
HAL_I2C_Mem_Read(&hi2c1,0xD1,0x04,1,&data5,1,5);
HAL_UART_Transmit(&huart1,&data5,1, 1);
HAL_Delay(100);
  }


}

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

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

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

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

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

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

}

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

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

}

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

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

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

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

#ifdef USE_FULL_ASSERT

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

}

#endif

/**
  * @}
  */ 

/**
  * @}
*/ 

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

 

 

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

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

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

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

Вы дойдите до инициализации USART1 и посмотрите что в RCC->APB2ENR. Что вы мучаетесь. HAL для этого и был создан быстренько попробовать периферию, а писать что-то большое на HAL не самый лучший вариант.

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

Для ЮАРТА попробовал такую инициализацию, не работает

void USART1_UART_Init(){
 
USART1->BRR=0x30; //BaudRate 250000
USART1->CR1 |= USART_CR1_UE; //Разрешаем работу USART1
USART1->CR1 |= USART_CR1_TE; //Включаем передатчик
RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
}

так что это вы вначале настроили а потом включаете?

8 минут назад, Электронщик сказал:

Сделал запись EEPROM с задержкой, но не помагает, вот так вот

  Показать содержимое


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

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/
I2C_HandleTypeDef hi2c1;

UART_HandleTypeDef huart1;

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

/* USER CODE END PV */

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


 



void nastr() {
  uint8_t data;
  data=13;
  HAL_I2C_Mem_Write(&hi2c1, 0xD0,0x04,1,&data,1,5);
 HAL_Delay(10);
}
int main(void)
{

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


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

 

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_I2C1_Init();
  MX_USART1_UART_Init();
nastr();
  
  while (1)
  {
    uint8_t data5;
 
HAL_I2C_Mem_Read(&hi2c1,0xD1,0x04,1,&data5,1,5);
HAL_UART_Transmit(&huart1,&data5,1, 1);
HAL_Delay(100);
  }


}

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

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

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

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

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

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

}

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

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

}

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

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

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

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

#ifdef USE_FULL_ASSERT

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

}

#endif

/**
  * @}
  */ 

/**
  * @}
*/ 

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

 

 

ППЦ гармоничный легкоподдерживаемый код. ИМХО. (это я про HAL). А главное эффективный.

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

Как вы не понимаете HAL это набор функций для доступа к регистрам он ничего конкретного не делает это не библиотека которая строго что-то определенное делает вы обязаны все сами настраивать ручками. Вопрос зачем? если ровно тоже самое можно писать сразу в регистры при этом вариантов масса. Ну напишите вы 1 раз для себя нормально и используйте потом это еще раз не будьте ардуинщиками, которые не знают как МК устроен.

USART1->CR1 |= USART_CR1_UE; //Разрешаем работу USART1
USART1->CR1 |= USART_CR1_TE; //Включаем передатчик

так лучше не пишите, потому как регистры определены как volatile, то запись будет 2 раза. Я пишу все 1 строкой.

ну и там где вы четко знаете что должно быть пишите просто =. Зачем |=. Тем более в инициализации.

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

Вот вы говорите HAL это современный подход. Ну покажите тогда качественное законченное устройство что был написан на HAL.

HAL лишь привлекает массы к себе т.к. типо легкий, раз два и готово. А если сбоку смотреть то же ардуино выходит.

CubeMX + HAL + Nucleo = Arduino

А слепить в кучу более 3 - 4 модулей уже все никак, прям как в ардуино, т.к. HAL в основном использует блокирующие функции. Да можно и ДМА и прерывания, но оно как в HAL очень удобно - я видел что нет, вот там уже и дебри в плане поддержки кода и читаемости, из-за колбэк функций и т.д. стоит взглянуть только на обработчик прерывания например канала ДМА это просто ппц, потому как все варианты нам и не нужны, но они есть и место кушают и тормозят все. Каждый пусть решает сам что ему нужно. Вот ситуация не работает USART в HAL работает - он хороший, а регистры плохие потому как не работает, а что с этим делать неизвестно потому как HAL не дает представления о работе железа, вписываем в структуры константы вызываем кучу функций и опа магия все работает все ок.

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

33 минуты назад, MasterElectric сказал:

Вот вы говорите HAL это современный подход. Ну покажите тогда качественное законченное устройство что был написан на HAL.

Непонятно что имеется ввиду законченый и качественный. Я если честно вобще ни одного устроиства законченного и качественного не видел, не на STM32 не на AVR.

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

 

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

Я не сомневаюсь просто пусть люди сразу учат устройство МК, а не HAL, потому как все-равно прийдеться учить и RM. Зачем тратить время на то что просто уйдет в сторону.

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

Вот смотрите:

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

void usart1_init(void)
{
  usart1_port();
  RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
  USART1->BRR = 0x04E2;
  USART1->CR1 = USART_CR1_RXNEIE | USART_CR1_TE | USART_CR1_RE | USART_CR1_UE;
  NVIC_EnableIRQ(USART1_IRQn);
}

void usart1_port(void)
{
  // PA9 - TX1, PA10 - RX1
  // PA9 - AF p-p, PA10 - Input float/PU
  RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
  GPIOA->CRH &= ~(GPIO_CRH_CNF9_0 | GPIO_CRH_CNF10_0 | GPIO_CRH_MODE10 | GPIO_CRH_MODE9_0);
  GPIOA->CRH |= (GPIO_CRH_CNF9_1 | GPIO_CRH_CNF10_1 | GPIO_CRH_MODE9_1);
  GPIOA->ODR |= GPIO_ODR_ODR10;
}

 

Прерывание только по заполнению приемного буфера (мне так нужно было). Если нужно чтобы прерывалось и по опустошению передающего буфера, то в настройку USART->CR1 включите также USART_CR1_TXEIE.

Настройка BRR бралась из рассчета 12 МГц АРВ1 шины и 9600 бодрейт.

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

6 минут назад, MasterElectric сказал:

Я не сомневаюсь просто пусть люди сразу учат устройство МК, а не HAL

Как я уже писал, знание МК и знание HAL никак не связаны. И вы это не понимаете. По вашей логике лучше писать все на АСМе потому что контроля у него больше. Но написание на АСМе всего кода не имеет никакого смысла по трудозатратам времени и знаниям. По вашей логике игры нужно писать на чистом OpenGL. По вашей логике нужно каждый раз с нуля писать свою openCV. По вашей логике ардуина бесполезная игрушка.

Как я уже писал в другой теме. Именно ардуино позволило простому пользователю упрастить себе жизнь. Именно ардуино перевернуло рынок микроконтроллеров. Появилось кучу модулей которые позволяли простому обывателю сделать себе какой нибудь девайс для управщения жизни без знания кучи регистров и функций. Модули, дисплеи, АЦП, ЦАП, генераторы, платы двигателей. Люди делали даже свои собственные станки. НО вы смотрите на это все СЛИШКОМ плоско. 

HAL же позволяет мне вобще не влезат в регистры, и делать вещи которые мне нужны. У меня нету времени по жизни изучать даже полностью всю периферию и нюансы этой периферии. Да мне это и не интересно. Мне интересно решить задачи которые у меня возникают с помощью МК. Проще говоря мне интересен только результат, на большее у меня нету времени (или даже можно сказать свободного места в мозгу). 

HAL позволяет мне не запоминать даже называние функций. Я просто начинаю набирать интуитивно понятно например HAL_DAC и автокомплит мне подсвечивает уже все что нужно, вплодь до параметров.

Единственная проблема HAL в том, что он написан не на C++. Если бы он был написан в ООП стиле ( что больше подходит для архитектуры процессора), он был бы просто идеален для управления периферией. Но и даже в таком виде он как абстракция востребован. 

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

Ладно пишу по делу, на счет регистров

Вот ЮАРТ инициализация сделал такую, но не работает, что такое

void USART1_UART_Init(){
  RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
// включаем тактирование GPIO

 GPIOA->CRH |= (1<<GPIO_CRH_MODE9_1)|(1<<GPIO_CRH_MODE9_0)|(1<<GPIO_CRH_CNF9_1)|(1<<GPIO_CRH_CNF10_1);
 //9-й вывод порта А это Tx, настраиваем его на выход, на 50МГц, 10-й вывод порта А Rx - настраиваем его как цифровой вход с подтяжкой
USART1->BRR=0x9C4; //BaudRate 9600

  
 RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
  // включаем тактирование UART
USART1->CR1 |= (1<<USART_CR1_UE)|(1<<USART_CR1_TE); //Разрешаем работу USART1, Включаем передатчик


}

 

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

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

Цитата

ППЦ гармоничный легкоподдерживаемый код. ИМХО. (это я про HAL). А главное эффективный.

Вот только не пойму почему не работает, на AVR, и то быстро запустил на регистрах, все это дело, а тут есть же функции, но что-то не пойму вообще что с ними не так

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

Маски не надо сдвигать, это не номера бит

Прежде чем устанавливать биты в GPIOA->CRH например, нужно обнулить биты относящиеся к настраиваемому порту, потом поднимать те что нужно.

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

GPIOA->CRH = (GPIOA->CRH & (~(GPIO_CRH_MODE9 | GPIO_CRH_CNF9))) | GPIO_CRH_CNF9_1 | GPIO_CRH_CNF10_1 | GPIO_CRH_MODE9_1;

это на основе примера выше, я себе дефайны сделал на эти биты. На счет инверсии не помню точный порядок приоритетов, может скобки убрать можно

А вообще порты лучше настраивать 1 раз в отдельной функции, там и через = можно, я приводил пример.

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

Вот, нашел:

Цитата

9.4 AFIO registers

Note: To read/write the AFIO_EVCR, AFIO_MAPR and AFIO_EXTICRX registers, the AFIO clock
should first be enabled. Refer to Section 7.3.7: APB2 peripheral clock enable register
(RCC_APB2ENR).

Значит этот АФИнОгЕН для работы усарт не нужен ))

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

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



void usart1_port(){
  // PA9 - TX1, PA10 - RX1
  // PA9 - AF p-p, PA10 - Input float/PU
  RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
  GPIOA->CRH &= ~(GPIO_CRH_CNF9_0 | GPIO_CRH_CNF10_0 | GPIO_CRH_MODE10 | GPIO_CRH_MODE9_0);
  GPIOA->CRH |= (GPIO_CRH_CNF9_1 | GPIO_CRH_CNF10_1 | GPIO_CRH_MODE9_1);
  GPIOA->ODR |= GPIO_ODR_ODR10;
}


void usart1_init(){
  usart1_port();
  RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
  USART1->BRR = 0x48;
 USART1->CR1 =USART_CR1_TE | USART_CR1_UE; //Разрешаем работу USART1, Включаем передатчик
 
}

 

Вот такая сейчас инициализация(правда без прерываний), шина APB1 настроена на 36МГц, скорость ЮАРТ 250000кб, правда частота тактирования и шин настроена кубом, может оно влияет, и не хочет HAL  с регистрами работать и нужно все на регистры перевести

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

1 hour ago, MasterElectric said:

Ну покажите тогда качественное законченное устройство что был написан на HAL.

К сожалению NDA не позволяет мне этого сделать, но скажу я вам что у нас несколько тысяч устройств (ПРОМ-устройства) на STM32 в которых используется HAL, все прекрасно работает. У нас обмен данными по UART-у на 1 мегабит (921600) с использованием DMA, пакеты разного размера (до 4096 байт). В это время активно используются еще парочку интерфейсов (I2C, пару UART-ов на 115200, интерфейс для ЖК дисплея, ...).

Как вы думайте это серъезно?

По важей логике мы должны написать прошивку на чистом ASM-е и для ARM-ов из серии A8-A9 (в том числе и для вашего телефона, так как внутри у него именно такой) ?

Дело ваше, но я-бы рекомендовал бы вам не програмировать для арм-ов, лучше вам взять AVR-ки, или MSP-шки...

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

И подскажите пожалуйста. Почему функции HAL по записи и чтению внешней EEPROM по I2C не работают как нужно? Или никто с этими функциями дел не имел?

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

@Электронщик , вы бы для начала скорости пониже попробовали.

250000 - это что, kbps? Что-то там значение мало похожее на правду для такой скорости по экспромт-подсчету.

Сейчас пересчитаю еще раз.

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

Цитата

Что с УАРТ? все нормально уже, работает?

Нет, у меня в порт даже ничего не вываливается, ладно бы скорость была бы не та, что-то бы шло, EEPROM просто параллельно пробую, на другой платке

Цитата

250000 - это что, kbps?

Да, ну посчитал по формуле.

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

8 минут назад, gindul сказал:

Дело ваше, но я-бы рекомендовал бы вам не програмировать для арм-ов, лучше вам взять AVR-ки, или MSP-шки...

Я отлично справляюсь со своими задачами. (на регистрах). При чем тут ассемблер??? Что вы все его приплели сюда. Я уже для себя закрыл эту тему, пишите на чем хотите. (навсегда), мне пофиг))

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

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

Да, ну посчитал по формуле.

Давайте для начала укажите чип, скорости шин. Поборем)

Порты подправили?

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

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

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

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

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

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

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

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

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

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

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

  • Сообщения

    • @READART Конкретно с LOGO не сталкивался, но у всех других, с кем сталкивался, программа всегда лежала во флеше. Да и хранить именно програмный код в энегозависимой памяти просто нелогично. Ионистор, скорее, может использоваться для отработки отключения питания, что-бы программа штатно могла завершиться, сохранив свое состояние.
    • А тема офигенно интересная. Рассуждать логически, в варианте А в среднем проводнике тока вообще практически нет и он нафиг не нужен. Во втором варианте по этим двум проводникам фигачит полный ток туда и обратно. Если хорошо свить, то по помехам одно...нно, только омические потери.  Дальше однозначного понимания у меня тоже нет. Я не выдающийся математик, мне нужен эксперимент. Например попробовать разорвать средний провод. Посмотреть куда подключены остальные цепи. Возможно у БЖТ асимметрия. Посмотреть как идут крайние провода обмотки, возможно раздвоенный средний компенсировал помеху от крайних.  ......  Не надо в подушку плакать, просто не нужно лезть с сегнетоэлектрикой в (калашный) звуковой ряд. Только не забывать про тоненькие дорожки к ним на ПП, если вдруг их приходится делать, или дилетанты наделали. А так да, отсутствие выводов большой плюс. Особенно когда занимаешься полосковой технологией.
    • Да схема самая обычная, без всяких пиэфси . Вот примерная.  Но блочок все равно не заработал, при превышении нагрузки 50 ватт происходит перекос плечей и выброс. В одной клетке 50 вольт. Получается на одном плече 200 на другом 150.
    • @1960sae "Собирал когда то такой конструктор, запустился сразу....". блин. не могу управится с ним. все проверил. нашел пробитый конденсатор, поменял. питание от адаптера сделал 7,3в. регулятор четко 5,05 в держит. на ногах пика питание есть, на всех ногах тоже какая то напруга есть. ниче не греется, транзы холодные. но не работает и все. когда щупами проверял по выводам пика моргнули индикаторы один раз и все. осцилла нет. ума не приложу, интернет рою. пока нифига не смог победить. что смущает: по схеме (я выше здесь выложил) 8 резисторов (на индикаторы идут) по 220 ом, а в наборе они по 1 кОм (я их впаял).  может по прошивке другая частота запуска прописана, может с кварцем что не так. опыта не хватает, конечно, сообразить, куда рыть. буду перебором
    • Кто сказал? Откуда такие знания? Опишите механизм появления искаженного звука. Точно не надо.
    • Здравствуйте. Чтобы не открывать новую тему по примитивному вопросу. На фото выше справа вверху стоит ионистор. На этой плате никаких элементов памяти я не вижу, поэтому скорее всего питание с ионистора подается вверх - на плату с МК.   Правильно ли я понимаю, что ионистор нужен для хранения текущего времени, а рабочая программа хранится в eeprom или flash на плате с МК (или в кишках самого МК)? Вопрос связан с тем, что прежде чем чинить эту LOGO, надо знать, сохранилась ли в нем программа. А чтобы узнать, сохранилась ли в нем программа, надо иметь соответствующую приблуду. Приблуду можно сотворить и самому, но если программа все-таки хранится в sram с питанием от ионистора, то никакого смысла делать приблуду нет, как и чинить LOGO. Просьба просветить, кто в курсе месте хранения рабочей программы в siemens logo. LOGO само собой старый: 6ED1052-1MD00-OBA5  
×
×
  • Создать...