main.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794
  1. /* USER CODE BEGIN Header */
  2. /**
  3. ******************************************************************************
  4. * @file : main.c
  5. * @brief : Main program body
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * Copyright (c) 2025 STMicroelectronics.
  10. * All rights reserved.
  11. *
  12. * This software is licensed under terms that can be found in the LICENSE file
  13. * in the root directory of this software component.
  14. * If no LICENSE file comes with this software, it is provided AS-IS.
  15. *
  16. ******************************************************************************
  17. */
  18. /* USER CODE END Header */
  19. /* Includes ------------------------------------------------------------------*/
  20. #include "main.h"
  21. #include "lfs.h"
  22. /* Private includes ----------------------------------------------------------*/
  23. /* USER CODE BEGIN Includes */
  24. #include "periph.h"
  25. /* USER CODE END Includes */
  26. /* Private typedef -----------------------------------------------------------*/
  27. /* USER CODE BEGIN PTD */
  28. /* USER CODE END PTD */
  29. /* Private define ------------------------------------------------------------*/
  30. /* USER CODE BEGIN PD */
  31. /* USER CODE END PD */
  32. /* Private macro -------------------------------------------------------------*/
  33. /* USER CODE BEGIN PM */
  34. /* USER CODE END PM */
  35. /* Private variables ---------------------------------------------------------*/
  36. SPI_HandleTypeDef hspi2;
  37. TIM_HandleTypeDef htim1;
  38. UART_HandleTypeDef huart2;
  39. DMA_HandleTypeDef hdma_usart2_rx;
  40. /* USER CODE BEGIN PV */
  41. /* USER CODE END PV */
  42. /* Private function prototypes -----------------------------------------------*/
  43. void SystemClock_Config(void);
  44. static void MX_GPIO_Init(void);
  45. static void MX_DMA_Init(void);
  46. static void MX_SPI2_Init(void);
  47. static void MX_USART2_UART_Init(void);
  48. static void MX_TIM1_Init(void);
  49. /* USER CODE BEGIN PFP */
  50. /* USER CODE END PFP */
  51. /* Private user code ---------------------------------------------------------*/
  52. /* USER CODE BEGIN 0 */
  53. #include "at45db041.h"
  54. #include <stdint.h>
  55. #include <stdio.h>
  56. #include <string.h>
  57. extern UART_HandleTypeDef huart2;
  58. extern SPI_HandleTypeDef hspi2;
  59. // int _write(int file, char *ptr, int len) {
  60. // HAL_UART_Transmit(&huart2, (uint8_t *)ptr, len, HAL_MAX_DELAY);
  61. // return len;
  62. // }
  63. int __io_putchar(int ch) {
  64. // Write character to ITM ch.0
  65. ITM_SendChar(ch);
  66. return (ch);
  67. }
  68. // ---- Audio ----
  69. #include <stdbool.h>
  70. static uint8_t buf1[256];
  71. static uint8_t buf2[256];
  72. static volatile uint8_t *play_buf = buf1;
  73. static volatile uint8_t *fill_buf = buf2;
  74. static volatile uint16_t buf_idx = 0;
  75. static volatile bool refill_needed = false;
  76. static uint16_t num_pages = 4;
  77. static uint16_t play_page = 0;
  78. void play_audio(void);
  79. void play_audio(void) {
  80. // Reconfigure TIM1 for PWM audio: 8-bit resolution, ~250 kHz PWM freq, ~8 kHz
  81. // sample rate with repetition System clock is 64 MHz (from HSI * 16)
  82. htim1.Init.Period = 255; // ARR = 255 for 8-bit PWM
  83. htim1.Init.RepetitionCounter =
  84. 30; // RCR = 30 for division by 31 (64M / 256 / 31 ≈ 8064 Hz)
  85. HAL_TIM_Base_Init(&htim1); // Re-init with new parameters
  86. TIM1->CCR1 = 128; // Initial duty cycle (center for unsigned 8-bit PCM)
  87. // Ensure PA8 is configured for TIM1_CH1 PWM
  88. // This is already done in HAL_TIM_MspPostInit(&htim1);
  89. // Pre-fill both buffers with first two pages
  90. at45db_wait_ready();
  91. at45db_read(0, buf1, 256);
  92. at45db_wait_ready();
  93. at45db_read(1, buf2, 256);
  94. play_page = 2;
  95. play_buf = buf1;
  96. fill_buf = buf2;
  97. buf_idx = 0;
  98. refill_needed = false;
  99. // Start PWM and base timer with update interrupts
  100. HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
  101. HAL_TIM_Base_Start_IT(&htim1);
  102. }
  103. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
  104. if (htim == &htim1) {
  105. // Assume 8-bit unsigned PCM samples
  106. uint8_t sample = play_buf[buf_idx++];
  107. TIM1->CCR1 = sample; // Update PWM duty cycle
  108. if (buf_idx == 256) {
  109. // Swap buffers
  110. volatile uint8_t *temp = play_buf;
  111. play_buf = fill_buf;
  112. fill_buf = temp;
  113. buf_idx = 0;
  114. refill_needed = true;
  115. }
  116. }
  117. }
  118. /* New test function to generate a 1 kHz square wave for 5 seconds */
  119. void test_audio_output(void)
  120. {
  121. printf("Starting audio test: 1 kHz square wave for 5 seconds\n");
  122. // Configure TIM1 for PWM: 8-bit resolution, ~8 kHz update rate
  123. htim1.Init.Period = 255; // 8-bit PWM
  124. htim1.Init.RepetitionCounter = 30; // ~8 kHz (64M / 256 / 31 ≈ 8064 Hz)
  125. HAL_TIM_Base_Init(&htim1);
  126. // Generate a 1 kHz square wave (toggle every 4 samples at 8 kHz = 2 kHz transitions = 1 kHz tone)
  127. uint32_t start_time = HAL_GetTick();
  128. uint8_t sample = 0;
  129. uint16_t sample_count = 0;
  130. HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
  131. HAL_TIM_Base_Start_IT(&htim1);
  132. while (HAL_GetTick() - start_time < 5000) // Run for 5 seconds
  133. {
  134. if (htim1.Instance->SR & TIM_SR_UIF) // Check for update event
  135. {
  136. sample_count++;
  137. if (sample_count % 4 == 0) // Toggle every 4 samples (8 kHz / 4 = 2 kHz transitions)
  138. {
  139. sample = (sample == 255) ? 0 : 255; // Square wave: 0 or 255
  140. }
  141. TIM1->CCR1 = sample;
  142. htim1.Instance->SR &= ~TIM_SR_UIF; // Clear update flag
  143. }
  144. }
  145. // Stop PWM and timer
  146. HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);
  147. HAL_TIM_Base_Stop(&htim1);
  148. printf("Audio test completed\n");
  149. }
  150. // ---- Audio ----
  151. #define UART_CHUNK_SIZE 256
  152. #define FILE_SIZE_BYTES 2
  153. static uint8_t rx_size_buf[FILE_SIZE_BYTES];
  154. static uint8_t rx_data[UART_CHUNK_SIZE];
  155. static uint16_t total_size = 0;
  156. static uint16_t received = 0;
  157. static uint16_t current_page = 0;
  158. static uint8_t audio_idx = 0;
  159. void uart_receive_file(void);
  160. void print_hex_dump(uint8_t *data, uint32_t length, uint32_t offset);
  161. void print_hex_dump(uint8_t *data, uint32_t length, uint32_t offset) {
  162. const uint32_t bytes_per_line = 16;
  163. for (uint32_t i = 0; i < length; i += bytes_per_line) {
  164. // Печатаем адрес
  165. printf("%08lX: ", offset + i);
  166. // Печатаем hex байты
  167. for (uint32_t j = 0; j < bytes_per_line; j++) {
  168. if (i + j < length) {
  169. printf("%02X ", data[i + j]);
  170. } else {
  171. printf(" "); // Пробелы для выравнивания
  172. }
  173. // Разделитель посередине
  174. if (j == 7) {
  175. printf(" ");
  176. }
  177. }
  178. printf("\r\n");
  179. }
  180. }
  181. void uart_receive_file(void) {
  182. // 1️⃣ Сначала получаем длину файла (2 байта)
  183. HAL_UART_Receive(&huart2, rx_size_buf, FILE_SIZE_BYTES, HAL_MAX_DELAY);
  184. total_size = (rx_size_buf[1] << 8) | rx_size_buf[0];
  185. printf("File size: %u bytes\n", total_size);
  186. // 2️⃣ Принимаем и сразу записываем на флеш
  187. received = 0;
  188. current_page = 0;
  189. while (received < total_size) {
  190. uint16_t remaining = total_size - received;
  191. uint16_t chunk =
  192. (remaining >= UART_CHUNK_SIZE) ? UART_CHUNK_SIZE : remaining;
  193. printf("Page (%u bytes)\n", chunk);
  194. // Получаем кусок файла
  195. if (HAL_UART_Receive(&huart2, rx_data, chunk, HAL_MAX_DELAY) == HAL_OK) {
  196. // Если меньше 256 байт, добиваем нулями
  197. if (chunk < UART_CHUNK_SIZE)
  198. memset(rx_data + chunk, 0xFF, UART_CHUNK_SIZE - chunk);
  199. // Пишем на флеш в текущую страницу
  200. at45db_wait_ready();
  201. at45db_write_page(current_page, rx_data);
  202. at45db_wait_ready();
  203. printf("Page %u written (%u bytes)\n", current_page, chunk);
  204. received += chunk;
  205. current_page++;
  206. } else {
  207. printf("UART receive error\n");
  208. break;
  209. }
  210. }
  211. printf("✅ File received and written to flash!\n");
  212. uint8_t at45db_buffer[256] = {0};
  213. printf("Data read from flash:\r\n");
  214. for (int page = 0; page < current_page; page++) {
  215. at45db_wait_ready();
  216. at45db_read(page, at45db_buffer, sizeof(at45db_buffer));
  217. at45db_wait_ready();
  218. printf("\r\n=== Page %d ===\r\n", page);
  219. print_hex_dump(at45db_buffer, sizeof(at45db_buffer), page * 256);
  220. }
  221. printf("\r\n");
  222. }
  223. // --- ФИКСЫ ДРАЙВЕРА ---
  224. // Принудительное отключение защиты
  225. void at45db_disable_protection_local(void) {
  226. uint8_t cmd[4] = {0x3D, 0x2A, 0x7F, 0x9A};
  227. at45db_wait_ready();
  228. FLASH_CS_ENABLE();
  229. HAL_SPI_Transmit(&hspi2, cmd, 4, HAL_MAX_DELAY);
  230. FLASH_CS_DISABLE();
  231. }
  232. // Исправленное стирание (сдвиг 8 для 256-байтных страниц)
  233. void at45db_erase_page_fixed(uint16_t page) {
  234. uint8_t cmd[4];
  235. uint32_t addr = (uint32_t)page << 8; // <--- ВАЖНО: сдвиг 8
  236. cmd[0] = 0x81; // Page Erase
  237. cmd[1] = (addr >> 16) & 0xFF;
  238. cmd[2] = (addr >> 8) & 0xFF;
  239. cmd[3] = addr & 0xFF;
  240. FLASH_CS_ENABLE();
  241. HAL_SPI_Transmit(&hspi2, cmd, 4, HAL_MAX_DELAY);
  242. FLASH_CS_DISABLE();
  243. }
  244. // Исправленная запись (сдвиг 8)
  245. void at45db_write_page_fixed(uint16_t page, const uint8_t *data) {
  246. uint8_t cmd[4];
  247. uint32_t addr = (uint32_t)page << 8; // <--- ВАЖНО: сдвиг 8
  248. // 1. Загрузка данных в Буфер 1
  249. cmd[0] = 0x84;
  250. cmd[1] = 0; cmd[2] = 0; cmd[3] = 0;
  251. FLASH_CS_ENABLE();
  252. HAL_SPI_Transmit(&hspi2, cmd, 4, HAL_MAX_DELAY);
  253. HAL_SPI_Transmit(&hspi2, (uint8_t*)data, 256, HAL_MAX_DELAY);
  254. FLASH_CS_DISABLE();
  255. // 2. Прошивка Буфера 1 в Память с встроенным стиранием
  256. cmd[0] = 0x83;
  257. cmd[1] = (addr >> 16) & 0xFF;
  258. cmd[2] = (addr >> 8) & 0xFF;
  259. cmd[3] = addr & 0xFF;
  260. at45db_wait_ready(); // Ждем, пока буфер освободится (хотя он быстрый)
  261. FLASH_CS_ENABLE();
  262. HAL_SPI_Transmit(&hspi2, cmd, 4, HAL_MAX_DELAY);
  263. FLASH_CS_DISABLE();
  264. }
  265. // --- LFS CALLBACKS ---
  266. int user_flash_read(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, void *buffer, lfs_size_t size) {
  267. // Вычисляем абсолютный адрес
  268. uint32_t addr = (block * c->block_size) + off;
  269. uint8_t cmd[5];
  270. cmd[0] = 0x0B; // High Frequency Read
  271. cmd[1] = (addr >> 16) & 0xFF;
  272. cmd[2] = (addr >> 8) & 0xFF;
  273. cmd[3] = addr & 0xFF;
  274. cmd[4] = 0x00; // Dummy byte
  275. at45db_wait_ready(); // Обязательно ждем готовности перед CS
  276. FLASH_CS_ENABLE();
  277. if (HAL_SPI_Transmit(&hspi2, cmd, 5, HAL_MAX_DELAY) != HAL_OK) {
  278. FLASH_CS_DISABLE();
  279. return LFS_ERR_IO; // Возвращаем ошибку, чтобы LFS не завис
  280. }
  281. if (HAL_SPI_Receive(&hspi2, (uint8_t*)buffer, size, HAL_MAX_DELAY) != HAL_OK) {
  282. FLASH_CS_DISABLE();
  283. return LFS_ERR_IO;
  284. }
  285. FLASH_CS_DISABLE();
  286. return LFS_ERR_OK; // 0 = Успех
  287. }
  288. int user_flash_prog(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, const void *buffer, lfs_size_t size) {
  289. // 1 блок (2048) = 8 страниц (по 256)
  290. uint32_t abs_page = (block * 8) + (off / 256);
  291. at45db_wait_ready();
  292. at45db_write_page_fixed((uint16_t)abs_page, (const uint8_t*)buffer);
  293. at45db_wait_ready();
  294. // DEBUG: Проверка записи (верификация)
  295. /*
  296. uint8_t check_buf[256];
  297. user_flash_read(c, block, off, check_buf, 256);
  298. if (memcmp(buffer, check_buf, 256) != 0) {
  299. printf("VERIFY FAILED at Block %ld Page %ld\r\n", block, abs_page);
  300. return LFS_ERR_IO;
  301. }
  302. */
  303. return LFS_ERR_OK;
  304. }
  305. int user_flash_erase(const struct lfs_config *c, lfs_block_t block) {
  306. uint16_t start_page = block * 8;
  307. for (int i = 0; i < 8; i++) {
  308. at45db_wait_ready();
  309. at45db_erase_page_fixed(start_page + i);
  310. }
  311. at45db_wait_ready();
  312. return LFS_ERR_OK;
  313. }
  314. int user_flash_sync(const struct lfs_config *c) {
  315. at45db_wait_ready();
  316. return LFS_ERR_OK;
  317. }
  318. /* USER CODE END 0 */
  319. /**
  320. * @brief The application entry point.
  321. * @retval int
  322. */
  323. int main(void) {
  324. /* USER CODE BEGIN 1 */
  325. /* USER CODE END 1 */
  326. /* MCU Configuration--------------------------------------------------------*/
  327. /* Reset of all peripherals, Initializes the Flash interface and the Systick.
  328. */
  329. HAL_Init();
  330. /* USER CODE BEGIN Init */
  331. /* USER CODE END Init */
  332. /* Configure the system clock */
  333. SystemClock_Config();
  334. /* USER CODE BEGIN SysInit */
  335. /* USER CODE END SysInit */
  336. /* Initialize all configured peripherals */
  337. MX_GPIO_Init();
  338. MX_DMA_Init();
  339. MX_SPI2_Init();
  340. MX_USART2_UART_Init();
  341. MX_TIM1_Init();
  342. /* USER CODE BEGIN 2 */
  343. test_audio_output();
  344. at45db_init();
  345. // 1. Отключаем защиту (на всякий случай делаем это всегда при старте)
  346. // at45db_disable_protection_local();
  347. // 2. Проверяем размер страницы
  348. if (at45db_get_page_size() != 256) {
  349. printf("Configuring 256-byte mode...\r\n");
  350. at45db_page_size_conf(2);
  351. printf("PLEASE POWER CYCLE DEVICE!\r\n");
  352. while(1);
  353. }
  354. // 3. Конфиг LFS
  355. static uint8_t lfs_read_buf[256];
  356. static uint8_t lfs_prog_buf[256];
  357. static uint8_t lfs_lookahead_buf[32];
  358. lfs_t lfs;
  359. struct lfs_config cfg = {
  360. .context = NULL,
  361. .read = user_flash_read,
  362. .prog = user_flash_prog,
  363. .erase = user_flash_erase,
  364. .sync = user_flash_sync,
  365. // ИЗМЕНЕНИЯ ЗДЕСЬ:
  366. .read_size = 256, // Было 1. Ставим 256 (размер страницы)
  367. .prog_size = 256, // Должно совпадать с read_size для AT45DB
  368. .block_size = 2048, // 8 страниц по 256 байт
  369. .block_count = 256, // 4 Mbit
  370. .cache_size = 256, // Размер кэша = размер страницы
  371. .lookahead_size = 32,
  372. .block_cycles = 500,
  373. .read_buffer = lfs_read_buf,
  374. .prog_buffer = lfs_prog_buf,
  375. .lookahead_buffer = lfs_lookahead_buf,
  376. };
  377. // 4. Монтирование
  378. int err = lfs_mount(&lfs, &cfg);
  379. if (err) {
  380. printf("Mount failed (%d). Formatting...\r\n", err);
  381. err = lfs_format(&lfs, &cfg);
  382. if (err) {
  383. printf("Format failed (%d)!\r\n", err);
  384. // Если здесь ошибка, значит защита не снялась или SPI глючит
  385. // Error_Handler();
  386. }
  387. err = lfs_mount(&lfs, &cfg);
  388. }
  389. if (!err) {
  390. printf("LFS Mounted!\r\n");
  391. // Тестовая запись
  392. lfs_file_t file;
  393. uint32_t boot_count = 0;
  394. lfs_file_open(&lfs, &file, "boot_count", LFS_O_RDWR | LFS_O_CREAT);
  395. lfs_file_read(&lfs, &file, &boot_count, sizeof(boot_count));
  396. boot_count++;
  397. lfs_file_rewind(&lfs, &file);
  398. lfs_file_write(&lfs, &file, &boot_count, sizeof(boot_count));
  399. lfs_file_close(&lfs, &file);
  400. printf("Boot count: %lu\r\n", boot_count);
  401. }
  402. uart_receive_file();
  403. play_audio();
  404. /* USER CODE END 2 */
  405. /* Infinite loop */
  406. /* USER CODE BEGIN WHILE */
  407. while (1) {
  408. if (refill_needed) {
  409. // Refill the inactive buffer with the next page
  410. at45db_wait_ready();
  411. at45db_read(play_page, (uint8_t *)fill_buf,
  412. 256); // Cast to non-const if needed
  413. play_page = (play_page + 1) % num_pages; // Loop back for continuous play
  414. refill_needed = false;
  415. }
  416. /* USER CODE END WHILE */
  417. /* USER CODE BEGIN 3 */
  418. }
  419. /* USER CODE END 3 */
  420. }
  421. /**
  422. * @brief System Clock Configuration
  423. * @retval None
  424. */
  425. void SystemClock_Config(void) {
  426. RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  427. RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  428. RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
  429. /** Initializes the RCC Oscillators according to the specified parameters
  430. * in the RCC_OscInitTypeDef structure.
  431. */
  432. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  433. RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  434. RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  435. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  436. RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  437. RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;
  438. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
  439. Error_Handler();
  440. }
  441. /** Initializes the CPU, AHB and APB buses clocks
  442. */
  443. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK |
  444. RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  445. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  446. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  447. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  448. RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  449. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) {
  450. Error_Handler();
  451. }
  452. PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_TIM1;
  453. PeriphClkInit.Tim1ClockSelection = RCC_TIM1CLK_HCLK;
  454. if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) {
  455. Error_Handler();
  456. }
  457. }
  458. /**
  459. * @brief SPI2 Initialization Function
  460. * @param None
  461. * @retval None
  462. */
  463. static void MX_SPI2_Init(void) {
  464. /* USER CODE BEGIN SPI2_Init 0 */
  465. /* USER CODE END SPI2_Init 0 */
  466. /* USER CODE BEGIN SPI2_Init 1 */
  467. /* USER CODE END SPI2_Init 1 */
  468. /* SPI2 parameter configuration*/
  469. hspi2.Instance = SPI2;
  470. hspi2.Init.Mode = SPI_MODE_MASTER;
  471. hspi2.Init.Direction = SPI_DIRECTION_2LINES;
  472. hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
  473. hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
  474. hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
  475. hspi2.Init.NSS = SPI_NSS_SOFT;
  476. hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
  477. hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
  478. hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
  479. hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  480. hspi2.Init.CRCPolynomial = 7;
  481. hspi2.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  482. hspi2.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
  483. if (HAL_SPI_Init(&hspi2) != HAL_OK) {
  484. Error_Handler();
  485. }
  486. /* USER CODE BEGIN SPI2_Init 2 */
  487. /* USER CODE END SPI2_Init 2 */
  488. }
  489. /**
  490. * @brief TIM1 Initialization Function
  491. * @param None
  492. * @retval None
  493. */
  494. static void MX_TIM1_Init(void) {
  495. /* USER CODE BEGIN TIM1_Init 0 */
  496. /* USER CODE END TIM1_Init 0 */
  497. TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  498. TIM_MasterConfigTypeDef sMasterConfig = {0};
  499. TIM_OC_InitTypeDef sConfigOC = {0};
  500. TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
  501. /* USER CODE BEGIN TIM1_Init 1 */
  502. /* USER CODE END TIM1_Init 1 */
  503. htim1.Instance = TIM1;
  504. htim1.Init.Prescaler = 0;
  505. htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  506. htim1.Init.Period = 65535;
  507. htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  508. htim1.Init.RepetitionCounter = 0;
  509. htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  510. if (HAL_TIM_Base_Init(&htim1) != HAL_OK) {
  511. Error_Handler();
  512. }
  513. sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  514. if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK) {
  515. Error_Handler();
  516. }
  517. if (HAL_TIM_PWM_Init(&htim1) != HAL_OK) {
  518. Error_Handler();
  519. }
  520. sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  521. sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
  522. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  523. if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) {
  524. Error_Handler();
  525. }
  526. sConfigOC.OCMode = TIM_OCMODE_PWM1;
  527. sConfigOC.Pulse = 0;
  528. sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  529. sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  530. sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  531. sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  532. sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  533. if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) {
  534. Error_Handler();
  535. }
  536. sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
  537. sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  538. sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  539. sBreakDeadTimeConfig.DeadTime = 0;
  540. sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  541. sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  542. sBreakDeadTimeConfig.BreakFilter = 0;
  543. sBreakDeadTimeConfig.Break2State = TIM_BREAK2_DISABLE;
  544. sBreakDeadTimeConfig.Break2Polarity = TIM_BREAK2POLARITY_HIGH;
  545. sBreakDeadTimeConfig.Break2Filter = 0;
  546. sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  547. if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK) {
  548. Error_Handler();
  549. }
  550. /* USER CODE BEGIN TIM1_Init 2 */
  551. /* USER CODE END TIM1_Init 2 */
  552. HAL_TIM_MspPostInit(&htim1);
  553. }
  554. /**
  555. * @brief USART2 Initialization Function
  556. * @param None
  557. * @retval None
  558. */
  559. static void MX_USART2_UART_Init(void) {
  560. /* USER CODE BEGIN USART2_Init 0 */
  561. /* USER CODE END USART2_Init 0 */
  562. /* USER CODE BEGIN USART2_Init 1 */
  563. /* USER CODE END USART2_Init 1 */
  564. huart2.Instance = USART2;
  565. huart2.Init.BaudRate = 115200;
  566. huart2.Init.WordLength = UART_WORDLENGTH_8B;
  567. huart2.Init.StopBits = UART_STOPBITS_1;
  568. huart2.Init.Parity = UART_PARITY_NONE;
  569. huart2.Init.Mode = UART_MODE_TX_RX;
  570. huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  571. huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  572. huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  573. huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  574. if (HAL_UART_Init(&huart2) != HAL_OK) {
  575. Error_Handler();
  576. }
  577. /* USER CODE BEGIN USART2_Init 2 */
  578. /* USER CODE END USART2_Init 2 */
  579. }
  580. /**
  581. * Enable DMA controller clock
  582. */
  583. static void MX_DMA_Init(void) {
  584. /* DMA controller clock enable */
  585. __HAL_RCC_DMA1_CLK_ENABLE();
  586. /* DMA interrupt init */
  587. /* DMA1_Channel6_IRQn interrupt configuration */
  588. HAL_NVIC_SetPriority(DMA1_Channel6_IRQn, 0, 0);
  589. HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn);
  590. }
  591. /**
  592. * @brief GPIO Initialization Function
  593. * @param None
  594. * @retval None
  595. */
  596. static void MX_GPIO_Init(void) {
  597. GPIO_InitTypeDef GPIO_InitStruct = {0};
  598. /* USER CODE BEGIN MX_GPIO_Init_1 */
  599. /* USER CODE END MX_GPIO_Init_1 */
  600. /* GPIO Ports Clock Enable */
  601. __HAL_RCC_GPIOC_CLK_ENABLE();
  602. __HAL_RCC_GPIOF_CLK_ENABLE();
  603. __HAL_RCC_GPIOA_CLK_ENABLE();
  604. __HAL_RCC_GPIOB_CLK_ENABLE();
  605. /*Configure GPIO pin Output Level */
  606. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
  607. /*Configure GPIO pin : B1_Pin */
  608. GPIO_InitStruct.Pin = B1_Pin;
  609. GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  610. GPIO_InitStruct.Pull = GPIO_NOPULL;
  611. HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);
  612. /*Configure GPIO pin : PB6 */
  613. GPIO_InitStruct.Pin = GPIO_PIN_6;
  614. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  615. GPIO_InitStruct.Pull = GPIO_NOPULL;
  616. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  617. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  618. /* USER CODE BEGIN MX_GPIO_Init_2 */
  619. /* USER CODE END MX_GPIO_Init_2 */
  620. }
  621. /* USER CODE BEGIN 4 */
  622. /* USER CODE END 4 */
  623. /**
  624. * @brief This function is executed in case of error occurrence.
  625. * @retval None
  626. */
  627. void Error_Handler(void) {
  628. /* USER CODE BEGIN Error_Handler_Debug */
  629. /* User can add his own implementation to report the HAL error return state */
  630. __disable_irq();
  631. while (1) {
  632. }
  633. /* USER CODE END Error_Handler_Debug */
  634. }
  635. #ifdef USE_FULL_ASSERT
  636. /**
  637. * @brief Reports the name of the source file and the source line number
  638. * where the assert_param error has occurred.
  639. * @param file: pointer to the source file name
  640. * @param line: assert_param error line source number
  641. * @retval None
  642. */
  643. void assert_failed(uint8_t *file, uint32_t line) {
  644. /* USER CODE BEGIN 6 */
  645. /* User can add his own implementation to report the file name and line
  646. number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file,
  647. line) */
  648. /* USER CODE END 6 */
  649. }
  650. #endif /* USE_FULL_ASSERT */