main.c 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330
  1. /* USER CODE BEGIN Header */
  2. /**
  3. ******************************************************************************
  4. * @file : main.c
  5. * @brief : Main program body
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
  10. * All rights reserved.</center></h2>
  11. *
  12. * This software component is licensed by ST under BSD 3-Clause license,
  13. * the "License"; You may not use this file except in compliance with the
  14. * License. You may obtain a copy of the License at:
  15. * opensource.org/licenses/BSD-3-Clause
  16. *
  17. ******************************************************************************
  18. */
  19. /* USER CODE END Header */
  20. /* Includes ------------------------------------------------------------------*/
  21. #include "main.h"
  22. /* Private includes ----------------------------------------------------------*/
  23. /* USER CODE BEGIN Includes */
  24. /* USER CODE END Includes */
  25. /* Private typedef -----------------------------------------------------------*/
  26. /* USER CODE BEGIN PTD */
  27. typedef enum {
  28. Tube_A = 3,
  29. Tube_B = 2,
  30. Tube_D = 1,
  31. Tube_E = 0
  32. } tube_pos_t;
  33. /* USER CODE END PTD */
  34. /* Private define ------------------------------------------------------------*/
  35. /* USER CODE BEGIN PD */
  36. #define SPI_BUFFER_SIZE 5
  37. /* USER CODE END PD */
  38. /* Private macro -------------------------------------------------------------*/
  39. /* USER CODE BEGIN PM */
  40. /* USER CODE END PM */
  41. /* Private variables ---------------------------------------------------------*/
  42. /* USER CODE BEGIN PV */
  43. static LL_RCC_ClocksTypeDef rcc_clocks;
  44. /**
  45. * Nixi Tube cathodes map in Byte Array:
  46. * {E0 E9 E8 E7 E6 E5 E4 E3}
  47. * {E2 E1 D0 D9 D8 D7 D6 D5}
  48. * {D4 D3 D2 D1 B0 B9 B8 B7}
  49. * {B6 B5 B4 B3 B2 B1 A0 A9}
  50. * {A8 A7 A6 A5 A4 A3 A2 A1}
  51. *
  52. * Shift register bit map in Tube cathodes (from 0 to 1):
  53. * {5.7 5.6 5.5 5.4 5.3 5.2 5.1 5.0 4.7 4.6} VL5/E
  54. * {4.5 4.4 4.3 4.2 4.1 4.0 3.7 3.6 3.5 3.4} VL4/D
  55. * {3.3 3.2 3.1 3.0 2.7 2.6 2.5 2.4 2.3 2.2} VL2/B
  56. * {2.1 2.0 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0} VL1/A
  57. */
  58. static const uint16_t nixieCathodeMap[4][10] = {
  59. {0x8000, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000},
  60. {0x2000, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000},
  61. {0x0800, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400},
  62. {0x0200, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100}
  63. };
  64. static const uint8_t nixieCathodeMask[4][2] = {{0x00, 0x3f}, {0xc0, 0x0f}, {0xf0, 0x03}, {0xc0, 0x00}};
  65. static uint8_t tubesBuffer[SPI_BUFFER_SIZE] = {0};
  66. static rtc_t Clock;
  67. static struct bme280_dev SensorDev;
  68. static struct bme280_data SensorData;
  69. static int8_t rsltSensor = 33; //BME280_OK;
  70. static int16_t Humidity, Temperature;
  71. /* USER CODE END PV */
  72. /* Private function prototypes -----------------------------------------------*/
  73. void SystemClock_Config(void);
  74. static void MX_GPIO_Init(void);
  75. static void MX_DMA_Init(void);
  76. static void MX_I2C1_Init(void);
  77. static void MX_SPI1_Init(void);
  78. static void MX_TIM3_Init(void);
  79. static void MX_TIM14_Init(void);
  80. static void MX_TIM16_Init(void);
  81. static void MX_TIM17_Init(void);
  82. /* USER CODE BEGIN PFP */
  83. static void showDigit(tube_pos_t pos, uint8_t dig);
  84. static void SPI_StartTX(void);
  85. int8_t user_i2c_read(uint8_t id, uint8_t reg_addr, uint8_t *data, uint16_t len);
  86. int8_t user_i2c_write(uint8_t id, uint8_t reg_addr, uint8_t *data, uint16_t len);
  87. int8_t user_i2c_write_byte(uint8_t id, uint8_t data);
  88. static int8_t SHT_Init(void);
  89. static int8_t SHT_StartH(void);
  90. static int8_t SHT_StartT(void);
  91. static int16_t SHT_GetH(void);
  92. static int16_t SHT_GetT(void);
  93. /* USER CODE END PFP */
  94. /* Private user code ---------------------------------------------------------*/
  95. /* USER CODE BEGIN 0 */
  96. /* USER CODE END 0 */
  97. /**
  98. * @brief The application entry point.
  99. * @retval int
  100. */
  101. int main(void)
  102. {
  103. /* USER CODE BEGIN 1 */
  104. /* USER CODE END 1 */
  105. /* MCU Configuration--------------------------------------------------------*/
  106. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  107. LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SYSCFG);
  108. LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR);
  109. /* System interrupt init*/
  110. /* Peripheral interrupt init*/
  111. /* RCC_IRQn interrupt configuration */
  112. NVIC_SetPriority(RCC_IRQn, 0);
  113. NVIC_EnableIRQ(RCC_IRQn);
  114. /* USER CODE BEGIN Init */
  115. /* USER CODE END Init */
  116. /* Configure the system clock */
  117. SystemClock_Config();
  118. /* USER CODE BEGIN SysInit */
  119. LL_LPM_EnableSleep();
  120. LL_LPM_DisableSleepOnExit();
  121. LL_RCC_GetSystemClocksFreq(&rcc_clocks);
  122. /* USER CODE END SysInit */
  123. /* Initialize all configured peripherals */
  124. MX_GPIO_Init();
  125. MX_DMA_Init();
  126. MX_I2C1_Init();
  127. MX_SPI1_Init();
  128. MX_TIM3_Init();
  129. MX_TIM14_Init();
  130. MX_TIM16_Init();
  131. MX_TIM17_Init();
  132. /* USER CODE BEGIN 2 */
  133. RTOS_Init();
  134. // __enable_irq();
  135. //LL_Init1msTick(rcc_clocks.HCLK_Frequency);
  136. //tdelay_ms(1);
  137. /* Start RGB PWM */
  138. LL_TIM_CC_EnableChannel(TIM3, LL_TIM_CHANNEL_CH1);
  139. LL_TIM_CC_EnableChannel(TIM3, LL_TIM_CHANNEL_CH2);
  140. LL_TIM_CC_EnableChannel(TIM3, LL_TIM_CHANNEL_CH3);
  141. LL_TIM_EnableCounter(TIM3);
  142. /* Start Tube PWR PWM */
  143. LL_TIM_CC_EnableChannel(TIM14, LL_TIM_CHANNEL_CH1);
  144. LL_TIM_EnableCounter(TIM14);
  145. /* Enable tube power */
  146. TUBE_PWR_ON;
  147. /* Set DMA source and destination addresses. */
  148. /* Source: Address of the SPI buffer. */
  149. DMA1_Channel1->CMAR = (uint32_t)&tubesBuffer;
  150. /* Destination: SPI1 data register. */
  151. DMA1_Channel1->CPAR = (uint32_t)&(SPI1->DR);
  152. /* Set DMA data transfer length (SPI buffer length). */
  153. DMA1_Channel1->CNDTR = SPI_BUFFER_SIZE;
  154. /* Enable SPI+DMA transfer */
  155. SPI1->CR2 |= SPI_CR2_TXDMAEN;
  156. SPI1->CR1 |= SPI_CR1_SPE;
  157. SPI_StartTX();
  158. IN15_OFF;
  159. RTC_Init();
  160. while (Flag.I2C_TX_End == 0) { __NOP(); };
  161. SensorDev.dev_id = BME280_I2C_ADDR_PRIM;
  162. SensorDev.intf = BME280_I2C_INTF;
  163. SensorDev.read = user_i2c_read;
  164. SensorDev.write = user_i2c_write;
  165. SensorDev.delay_ms = tdelay_ms;
  166. rsltSensor = bme280_init(&SensorDev);
  167. if (rsltSensor == BME280_OK) {
  168. Flag.BME280 = 1;
  169. }
  170. // SHT_Init();
  171. /* USER CODE END 2 */
  172. /* USER CODE BEGIN WHILE */
  173. RTC_ReadAll(&Clock);
  174. while (Flag.I2C_RX_End == 0) { __NOP(); };
  175. tdelay_ms(10);
  176. /* BME280 Recommended mode of operation: Indoor navigation */
  177. SensorDev.settings.osr_h = BME280_OVERSAMPLING_1X;
  178. SensorDev.settings.osr_p = BME280_OVERSAMPLING_16X;
  179. SensorDev.settings.osr_t = BME280_OVERSAMPLING_2X;
  180. SensorDev.settings.filter = BME280_FILTER_COEFF_16;
  181. rsltSensor = bme280_set_sensor_settings((BME280_OSR_PRESS_SEL | BME280_OSR_TEMP_SEL | BME280_OSR_HUM_SEL | BME280_FILTER_SEL), &SensorDev);
  182. rsltSensor = bme280_set_sensor_mode(BME280_FORCED_MODE, &SensorDev);
  183. //SensorDev.delay_ms(50);
  184. //rsltSensor = bme280_get_sensor_data(BME280_ALL, &SensorData, &SensorDev);
  185. /* bme280_get_sensor_data(...) returns:
  186. * - temperature in DegC, resolution is 0.01 DegC. Output value of "5123" equals 51.23 DegC.
  187. * - pressure in Pa as unsigned 32 bit integer in Q24.8 format (24 integer bits and 8 fractional bits).
  188. * Output value "24674867" represents 24674867/256 = 96386.2 Pa = 963.862 hPa.
  189. * - humidity in %RH as unsigned 32 bit integer in Q22.10 format.
  190. * Output value of "47445" represents 47445/1024 = 46.333 %RH
  191. */
  192. uint8_t temp_l, temp_h, hum_h, hum_l, pres_h, pres_l;
  193. uint32_t tmp;
  194. /* Infinite loop */
  195. while (1)
  196. {
  197. IN15_OFF;
  198. COLOR_RGB(0, 0, 0);
  199. RTC_ReadAll(&Clock);
  200. //SHT_StartH();
  201. //SHT_StartT();
  202. tdelay_ms(500);
  203. if (Flag.RTC_IRQ != 0) {
  204. Flag.RTC_IRQ = 0;
  205. IN15_Minus;
  206. }
  207. COLOR_RGB(0xFF, 0x12, 0x0); // FF7E00 or FFBF00
  208. rsltSensor = bme280_get_sensor_data(BME280_ALL, &SensorData, &SensorDev);
  209. tdelay_ms(500);
  210. /* USER CODE END WHILE */
  211. /* USER CODE BEGIN 3 */
  212. /*
  213. showDigit(Tube_A, Clock.Min >> 4);
  214. showDigit(Tube_B, Clock.Min & 0xf);
  215. showDigit(Tube_D, Clock.Sec >> 4);
  216. showDigit(Tube_E, Clock.Sec & 0xf);
  217. */
  218. //Humidity = SHT_GetH();
  219. //Temperature = SHT_GetT();
  220. if (rsltSensor == BME280_OK) {
  221. temp_h = (uint8_t)SensorData.temperature / 100;
  222. temp_l = (uint8_t)SensorData.temperature % 100;
  223. hum_h = (uint8_t)SensorData.humidity / 1024;
  224. hum_l = (uint8_t)(((SensorData.humidity % 1024) + 5) / 10);
  225. tmp = (SensorData.pressure + 128) / 256; // pressure in Pa
  226. tmp *= 1000;
  227. tmp += 66661;
  228. tmp /= 133322; // pressure in mmHg
  229. pres_h = (uint8_t)(tmp / 100);
  230. pres_l = (uint8_t)(tmp % 100);
  231. showDigit(Tube_A, hum_h / 10);
  232. showDigit(Tube_B, hum_h % 10);
  233. showDigit(Tube_D, hum_l / 10);
  234. showDigit(Tube_E, hum_l % 10);
  235. } else {
  236. showDigit(Tube_A, Clock.Min >> 4);
  237. showDigit(Tube_B, Clock.Min & 0xf);
  238. showDigit(Tube_D, Clock.Sec >> 4);
  239. showDigit(Tube_E, Clock.Sec & 0xf);
  240. }
  241. SPI_StartTX();
  242. RTOS_DispatchTask();
  243. __WFI();
  244. }
  245. /* USER CODE END 3 */
  246. }
  247. /**
  248. * @brief Launch SPI transaction.
  249. * @retval None
  250. */
  251. static void SPI_StartTX(void) {
  252. LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_1);
  253. }
  254. /**
  255. * @brief Read len bytes from I2C bus to data by reg_addr.
  256. * @retval I2C return code
  257. */
  258. int8_t user_i2c_read(const uint8_t id, const uint8_t reg_addr, uint8_t *data, const uint16_t len) {
  259. Flag.I2C_RX_End = 0;
  260. Flag.I2C_RX_Err = 0;
  261. /* wait for i2c */
  262. while ( I2C1->ISR & I2C_ISR_BUSY ) {};
  263. /* prepare i2c for sending reg addr */
  264. I2C1->CR2 &= ~( I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RD_WRN);
  265. I2C1->CR2 |= ( id | 1 << I2C_CR2_NBYTES_Pos );
  266. I2C1->CR1 |= I2C_CR1_NOSTRETCH;
  267. /* gen START */
  268. I2C1->CR2 |= ( I2C_CR2_START );
  269. /* wait for start end */
  270. while ( !( I2C1->CR2 & I2C_CR2_START ) ) {};
  271. /* check if devce is present */
  272. if ((I2C1->ISR & I2C_ISR_NACKF) != 0) {
  273. /* no device present, reset i2c */
  274. I2C1->CR1 &= ~I2C_CR1_PE;
  275. while ((I2C1->CR1 & I2C_CR1_PE) != 0) {};
  276. I2C1->CR1 |= I2C_CR1_PE;
  277. /* exit with NACK */
  278. return I2C_RET_NACK;
  279. }
  280. /* device ok, send reg addr */
  281. I2C1->TXDR = reg_addr;
  282. /* wait for i2c */
  283. while ( I2C1->ISR & I2C_ISR_BUSY ) {
  284. }
  285. /* prepare dma channel for receiving data */
  286. DMA1_Channel2->CMAR = (uint32_t)data;
  287. DMA1_Channel2->CPAR = (uint32_t)&(I2C1->RXDR);
  288. DMA1_Channel2->CNDTR = len;
  289. DMA1_Channel2->CCR |= DMA_CCR_EN;
  290. /* prepare i2c for receiving data */
  291. I2C1->CR2 &= ~( I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RD_WRN);
  292. I2C1->CR2 |= ( id | len << I2C_CR2_NBYTES_Pos | I2C_CR2_RD_WRN);
  293. /* launch receiving */
  294. I2C1->CR1 |= ( I2C_CR1_RXDMAEN );
  295. I2C1->CR2 |= ( I2C_CR2_START );
  296. return I2C_RET_OK;
  297. }
  298. /**
  299. * @brief Write len bytes to I2C bus from data by reg_addr.
  300. * @retval I2C return code
  301. */
  302. int8_t user_i2c_write(const uint8_t id, const uint8_t reg_addr, uint8_t *data, const uint16_t len) {
  303. Flag.I2C_TX_End = 0;
  304. Flag.I2C_TX_Err = 0;
  305. //DMA1_Channel3->CCR &= ~DMA_CCR_EN;
  306. DMA1_Channel3->CMAR = (uint32_t)data;
  307. DMA1_Channel3->CPAR = (uint32_t)&(I2C1->TXDR);
  308. DMA1_Channel3->CNDTR = len;
  309. while ( I2C1->ISR & I2C_ISR_BUSY ) {};
  310. I2C1->CR2 &= ~( I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RD_WRN);
  311. I2C1->CR2 |= ( id | (len + 1) << I2C_CR2_NBYTES_Pos );
  312. I2C1->CR2 |= ( I2C_CR2_START );
  313. while ( !( I2C1->CR2 & I2C_CR2_START ) ) {};
  314. I2C1->TXDR = reg_addr;
  315. if ((I2C1->ISR & I2C_ISR_NACKF) != 0) {
  316. I2C1->CR1 &= ~I2C_CR1_PE;
  317. while ((I2C1->CR1 & I2C_CR1_PE) != 0) {};
  318. I2C1->CR1 |= I2C_CR1_PE;
  319. return I2C_RET_NACK;
  320. }
  321. DMA1_Channel3->CCR |= DMA_CCR_EN;
  322. I2C1->CR1 |= ( I2C_CR1_TXDMAEN );
  323. return I2C_RET_OK;
  324. }
  325. /**
  326. * @brief Write one byte to I2C bus.
  327. * @retval I2C return code
  328. */
  329. int8_t user_i2c_write_byte(const uint8_t id, const uint8_t data) {
  330. /* wait for i2c */
  331. while ( I2C1->ISR & I2C_ISR_BUSY ) {};
  332. /* prepare i2c for sending data byte */
  333. I2C1->CR2 &= ~( I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RD_WRN);
  334. I2C1->CR2 |= ( id | 1 << I2C_CR2_NBYTES_Pos );
  335. I2C1->CR1 |= I2C_CR1_NOSTRETCH;
  336. /* gen START */
  337. I2C1->CR2 |= ( I2C_CR2_START );
  338. /* wait for start end */
  339. while ( !( I2C1->CR2 & I2C_CR2_START ) ) {};
  340. /* check if devce is present */
  341. if ((I2C1->ISR & I2C_ISR_NACKF) != 0) {
  342. /* no device present, reset i2c */
  343. I2C1->CR1 &= ~I2C_CR1_PE;
  344. while ((I2C1->CR1 & I2C_CR1_PE) != 0) {};
  345. I2C1->CR1 |= I2C_CR1_PE;
  346. /* exit with NACK */
  347. return I2C_RET_NACK;
  348. }
  349. /* device ok, data */
  350. I2C1->TXDR = data;
  351. return I2C_RET_OK;
  352. }
  353. /**
  354. * @brief Init DHT21/SHT21/Si7021 sensor, need wait for 15 ms
  355. * @retval I2C return code
  356. */
  357. static int8_t SHT_Init(void) {
  358. int8_t res;
  359. res = user_i2c_write_byte (I2C_SHT_ADDR, SHT_SOFT_RST);
  360. if (res == I2C_RET_OK) {
  361. tdelay_ms(15);
  362. }
  363. return res;
  364. }
  365. /**
  366. * @brief Launch Humidity measure for DHT21/SHT21/Si7021 sensor, need wait for 16 ms
  367. * @retval I2C return code
  368. */
  369. static int8_t SHT_StartH(void) {
  370. int8_t res;
  371. res = user_i2c_write_byte (I2C_SHT_ADDR, SHT_STRT_HUMD);
  372. if (res == I2C_RET_OK) {
  373. tdelay_ms(16);
  374. }
  375. return res;
  376. }
  377. /**
  378. * @brief Launch Temperature measure for DHT21/SHT21/Si7021 sensor, need wait for 50 ms
  379. */
  380. static int8_t SHT_StartT(void) {
  381. int8_t res;
  382. res = user_i2c_write_byte (I2C_SHT_ADDR, SHT_STRT_TEMP);
  383. if (res == I2C_RET_OK) {
  384. tdelay_ms(50);
  385. }
  386. return res;
  387. }
  388. /**
  389. * @brief Read and convert Humidity data from DHT21/SHT21/Si7021 sensor.
  390. * @retval Return value in 0.01 % [0..10000]
  391. */
  392. static int16_t SHT_GetH(void) {
  393. uint8_t buf[4];
  394. uint32_t rh;
  395. /* wait for i2c */
  396. while ( I2C1->ISR & I2C_ISR_BUSY ) {
  397. }
  398. /* prepare dma channel for receiving data */
  399. DMA1_Channel2->CMAR = (uint32_t)buf;
  400. DMA1_Channel2->CPAR = (uint32_t)&(I2C1->RXDR);
  401. DMA1_Channel2->CNDTR = SHT_DATA_LEN;
  402. DMA1_Channel2->CCR |= DMA_CCR_EN;
  403. /* prepare i2c for receiving data */
  404. I2C1->CR2 &= ~( I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RD_WRN);
  405. I2C1->CR2 |= ( I2C_SHT_ADDR | SHT_DATA_LEN << I2C_CR2_NBYTES_Pos | I2C_CR2_RD_WRN);
  406. /* launch receiving */
  407. I2C1->CR1 |= ( I2C_CR1_RXDMAEN );
  408. I2C1->CR2 |= ( I2C_CR2_START );
  409. while (Flag.I2C_RX_End == 0) {
  410. __WFI();
  411. }
  412. rh = (buf[0] << 8) | buf[1];
  413. rh *= 12500;
  414. rh += 32768;
  415. rh >>= 16;
  416. rh -= 600;
  417. return (int16_t)rh;
  418. }
  419. /**
  420. * @brief Read and convert Temperature data from DHT21/SHT21/Si7021 sensor.
  421. * @retval Return value in 0.01 oC [-4000..+8500]
  422. */
  423. static int16_t SHT_GetT(void) {
  424. uint8_t buf[4];
  425. uint32_t temp;
  426. /* wait for i2c */
  427. while ( I2C1->ISR & I2C_ISR_BUSY ) {
  428. }
  429. /* prepare dma channel for receiving data */
  430. DMA1_Channel2->CMAR = (uint32_t)buf;
  431. DMA1_Channel2->CPAR = (uint32_t)&(I2C1->RXDR);
  432. DMA1_Channel2->CNDTR = SHT_DATA_LEN;
  433. DMA1_Channel2->CCR |= DMA_CCR_EN;
  434. /* prepare i2c for receiving data */
  435. I2C1->CR2 &= ~( I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RD_WRN);
  436. I2C1->CR2 |= ( I2C_SHT_ADDR | SHT_DATA_LEN << I2C_CR2_NBYTES_Pos | I2C_CR2_RD_WRN);
  437. /* launch receiving */
  438. I2C1->CR1 |= ( I2C_CR1_RXDMAEN );
  439. I2C1->CR2 |= ( I2C_CR2_START );
  440. while (Flag.I2C_RX_End == 0) {
  441. __WFI();
  442. }
  443. temp = (buf[0] << 8) | buf[1];
  444. temp *= 17572;
  445. temp += 32768;
  446. temp >>= 16;
  447. temp -= 4685;
  448. return (int16_t)temp;
  449. }
  450. /**
  451. * @brief System Clock Configuration
  452. * @retval None
  453. */
  454. void SystemClock_Config(void)
  455. {
  456. /* HSI configuration and activation */
  457. LL_RCC_HSI_Enable();
  458. while(LL_RCC_HSI_IsReady() != 1)
  459. {
  460. }
  461. /* Main PLL configuration and activation */
  462. LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSI, LL_RCC_PLLM_DIV_2, 9, LL_RCC_PLLR_DIV_3);
  463. LL_RCC_PLL_Enable();
  464. LL_RCC_PLL_EnableDomain_SYS();
  465. while(LL_RCC_PLL_IsReady() != 1)
  466. {
  467. }
  468. /* Set AHB prescaler*/
  469. LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);
  470. /* Sysclk activation on the main PLL */
  471. LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL);
  472. while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL)
  473. {
  474. }
  475. /* Set APB1 prescaler*/
  476. LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1);
  477. LL_Init1msTick(24000000);
  478. /* Update CMSIS variable (which can be updated also through SystemCoreClockUpdate function) */
  479. LL_SetSystemCoreClock(24000000);
  480. LL_RCC_SetI2CClockSource(LL_RCC_I2C1_CLKSOURCE_HSI);
  481. }
  482. /**
  483. * @brief I2C1 Initialization Function
  484. * @param None
  485. * @retval None
  486. */
  487. static void MX_I2C1_Init(void)
  488. {
  489. /* USER CODE BEGIN I2C1_Init 0 */
  490. /* USER CODE END I2C1_Init 0 */
  491. LL_I2C_InitTypeDef I2C_InitStruct = {0};
  492. LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
  493. LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOB);
  494. /**I2C1 GPIO Configuration
  495. PB6 ------> I2C1_SCL
  496. PB7 ------> I2C1_SDA
  497. */
  498. GPIO_InitStruct.Pin = LL_GPIO_PIN_6;
  499. GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  500. GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  501. GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
  502. GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  503. GPIO_InitStruct.Alternate = LL_GPIO_AF_6;
  504. LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  505. GPIO_InitStruct.Pin = LL_GPIO_PIN_7;
  506. GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  507. GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  508. GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
  509. GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  510. GPIO_InitStruct.Alternate = LL_GPIO_AF_6;
  511. LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  512. /* Peripheral clock enable */
  513. LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_I2C1);
  514. /* I2C1 DMA Init */
  515. /* I2C1_RX Init */
  516. LL_DMA_SetPeriphRequest(DMA1, LL_DMA_CHANNEL_2, LL_DMAMUX_REQ_I2C1_RX);
  517. LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_2, LL_DMA_DIRECTION_PERIPH_TO_MEMORY);
  518. LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_2, LL_DMA_PRIORITY_MEDIUM);
  519. // LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_2, LL_DMA_MODE_CIRCULAR);
  520. LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_2, LL_DMA_PERIPH_NOINCREMENT);
  521. LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_2, LL_DMA_MEMORY_INCREMENT);
  522. LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_2, LL_DMA_PDATAALIGN_BYTE);
  523. LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_2, LL_DMA_MDATAALIGN_BYTE);
  524. /* I2C1_TX Init */
  525. LL_DMA_SetPeriphRequest(DMA1, LL_DMA_CHANNEL_3, LL_DMAMUX_REQ_I2C1_TX);
  526. LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_3, LL_DMA_DIRECTION_MEMORY_TO_PERIPH);
  527. LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_3, LL_DMA_PRIORITY_MEDIUM);
  528. // LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_3, LL_DMA_MODE_CIRCULAR);
  529. LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_3, LL_DMA_PERIPH_NOINCREMENT);
  530. LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_3, LL_DMA_MEMORY_INCREMENT);
  531. LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_3, LL_DMA_PDATAALIGN_BYTE);
  532. LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_3, LL_DMA_MDATAALIGN_BYTE);
  533. /* I2C1 interrupt Init */
  534. NVIC_SetPriority(I2C1_IRQn, 0);
  535. NVIC_EnableIRQ(I2C1_IRQn);
  536. /* USER CODE BEGIN I2C1_Init 1 */
  537. /* Enable DMA transfer complete/error interrupts */
  538. LL_DMA_EnableIT_TC(DMA1, LL_DMA_CHANNEL_2);
  539. LL_DMA_EnableIT_TE(DMA1, LL_DMA_CHANNEL_2);
  540. LL_DMA_EnableIT_TC(DMA1, LL_DMA_CHANNEL_3);
  541. LL_DMA_EnableIT_TE(DMA1, LL_DMA_CHANNEL_3);
  542. /* USER CODE END I2C1_Init 1 */
  543. /** I2C Initialization
  544. */
  545. I2C_InitStruct.PeripheralMode = LL_I2C_MODE_I2C;
  546. I2C_InitStruct.Timing = 0x0010061A;
  547. I2C_InitStruct.AnalogFilter = LL_I2C_ANALOGFILTER_ENABLE;
  548. I2C_InitStruct.DigitalFilter = 0;
  549. I2C_InitStruct.OwnAddress1 = 0;
  550. I2C_InitStruct.TypeAcknowledge = LL_I2C_ACK;
  551. I2C_InitStruct.OwnAddrSize = LL_I2C_OWNADDRESS1_7BIT;
  552. LL_I2C_Init(I2C1, &I2C_InitStruct);
  553. LL_I2C_EnableAutoEndMode(I2C1);
  554. LL_I2C_SetOwnAddress2(I2C1, 0, LL_I2C_OWNADDRESS2_NOMASK);
  555. LL_I2C_DisableOwnAddress2(I2C1);
  556. LL_I2C_DisableGeneralCall(I2C1);
  557. LL_I2C_EnableClockStretching(I2C1);
  558. /* USER CODE BEGIN I2C1_Init 2 */
  559. LL_I2C_EnableIT_NACK(I2C1);
  560. /* USER CODE END I2C1_Init 2 */
  561. }
  562. /**
  563. * @brief SPI1 Initialization Function
  564. * @param None
  565. * @retval None
  566. */
  567. static void MX_SPI1_Init(void)
  568. {
  569. /* USER CODE BEGIN SPI1_Init 0 */
  570. /* USER CODE END SPI1_Init 0 */
  571. LL_SPI_InitTypeDef SPI_InitStruct = {0};
  572. LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
  573. /* Peripheral clock enable */
  574. LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SPI1);
  575. LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOB);
  576. /**SPI1 GPIO Configuration
  577. PB3 ------> SPI1_SCK
  578. PB5 ------> SPI1_MOSI
  579. */
  580. GPIO_InitStruct.Pin = LL_GPIO_PIN_3;
  581. GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  582. GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  583. GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN; //LL_GPIO_OUTPUT_PUSHPULL;
  584. GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  585. GPIO_InitStruct.Alternate = LL_GPIO_AF_0;
  586. LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  587. GPIO_InitStruct.Pin = LL_GPIO_PIN_5;
  588. GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  589. GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  590. GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN; //LL_GPIO_OUTPUT_PUSHPULL;
  591. GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  592. GPIO_InitStruct.Alternate = LL_GPIO_AF_0;
  593. LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  594. /* SPI1 DMA Init */
  595. /* SPI1_TX Init */
  596. LL_DMA_SetPeriphRequest(DMA1, LL_DMA_CHANNEL_1, LL_DMAMUX_REQ_SPI1_TX);
  597. LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_1, LL_DMA_DIRECTION_MEMORY_TO_PERIPH);
  598. LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PRIORITY_HIGH);
  599. LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MODE_CIRCULAR);
  600. LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PERIPH_NOINCREMENT);
  601. LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MEMORY_INCREMENT);
  602. LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PDATAALIGN_BYTE);
  603. LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MDATAALIGN_BYTE);
  604. /* SPI1 interrupt Init */
  605. NVIC_SetPriority(SPI1_IRQn, 0);
  606. NVIC_EnableIRQ(SPI1_IRQn);
  607. /* USER CODE BEGIN SPI1_Init 1 */
  608. /* Enable DMA transfer complete/error interrupts */
  609. LL_DMA_EnableIT_TC(DMA1, LL_DMA_CHANNEL_1);
  610. LL_DMA_EnableIT_TE(DMA1, LL_DMA_CHANNEL_1);
  611. /* USER CODE END SPI1_Init 1 */
  612. /* SPI1 parameter configuration*/
  613. SPI_InitStruct.TransferDirection = LL_SPI_FULL_DUPLEX;
  614. SPI_InitStruct.Mode = LL_SPI_MODE_MASTER;
  615. SPI_InitStruct.DataWidth = LL_SPI_DATAWIDTH_8BIT;
  616. SPI_InitStruct.ClockPolarity = LL_SPI_POLARITY_LOW;
  617. SPI_InitStruct.ClockPhase = LL_SPI_PHASE_1EDGE;
  618. SPI_InitStruct.NSS = LL_SPI_NSS_SOFT;
  619. SPI_InitStruct.BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV16;
  620. SPI_InitStruct.BitOrder = LL_SPI_MSB_FIRST;
  621. SPI_InitStruct.CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE;
  622. SPI_InitStruct.CRCPoly = 7;
  623. LL_SPI_Init(SPI1, &SPI_InitStruct);
  624. LL_SPI_SetStandard(SPI1, LL_SPI_PROTOCOL_MOTOROLA);
  625. LL_SPI_DisableNSSPulseMgt(SPI1);
  626. /* USER CODE BEGIN SPI1_Init 2 */
  627. /* USER CODE END SPI1_Init 2 */
  628. }
  629. /**
  630. * @brief TIM3 Initialization Function
  631. * @param None
  632. * @retval None
  633. */
  634. static void MX_TIM3_Init(void)
  635. {
  636. /* USER CODE BEGIN TIM3_Init 0 */
  637. /* USER CODE END TIM3_Init 0 */
  638. LL_TIM_InitTypeDef TIM_InitStruct = {0};
  639. LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0};
  640. LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
  641. /* Peripheral clock enable */
  642. LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM3);
  643. /* USER CODE BEGIN TIM3_Init 1 */
  644. /* USER CODE END TIM3_Init 1 */
  645. TIM_InitStruct.Prescaler = 24;
  646. TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
  647. TIM_InitStruct.Autoreload = 1000;
  648. TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;
  649. LL_TIM_Init(TIM3, &TIM_InitStruct);
  650. LL_TIM_EnableARRPreload(TIM3);
  651. LL_TIM_OC_EnablePreload(TIM3, LL_TIM_CHANNEL_CH1);
  652. TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1;
  653. TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_DISABLE;
  654. TIM_OC_InitStruct.OCNState = LL_TIM_OCSTATE_DISABLE;
  655. TIM_OC_InitStruct.CompareValue = 100;
  656. TIM_OC_InitStruct.OCPolarity = LL_TIM_OCPOLARITY_HIGH;
  657. LL_TIM_OC_Init(TIM3, LL_TIM_CHANNEL_CH1, &TIM_OC_InitStruct);
  658. LL_TIM_OC_DisableFast(TIM3, LL_TIM_CHANNEL_CH1);
  659. LL_TIM_OC_EnablePreload(TIM3, LL_TIM_CHANNEL_CH2);
  660. TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_DISABLE;
  661. TIM_OC_InitStruct.OCNState = LL_TIM_OCSTATE_DISABLE;
  662. LL_TIM_OC_Init(TIM3, LL_TIM_CHANNEL_CH2, &TIM_OC_InitStruct);
  663. LL_TIM_OC_DisableFast(TIM3, LL_TIM_CHANNEL_CH2);
  664. LL_TIM_OC_EnablePreload(TIM3, LL_TIM_CHANNEL_CH3);
  665. TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_DISABLE;
  666. TIM_OC_InitStruct.OCNState = LL_TIM_OCSTATE_DISABLE;
  667. LL_TIM_OC_Init(TIM3, LL_TIM_CHANNEL_CH3, &TIM_OC_InitStruct);
  668. LL_TIM_OC_DisableFast(TIM3, LL_TIM_CHANNEL_CH3);
  669. LL_TIM_SetTriggerOutput(TIM3, LL_TIM_TRGO_RESET);
  670. LL_TIM_DisableMasterSlaveMode(TIM3);
  671. /* USER CODE BEGIN TIM3_Init 2 */
  672. /* USER CODE END TIM3_Init 2 */
  673. LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);
  674. LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOB);
  675. /**TIM3 GPIO Configuration
  676. PA6 ------> TIM3_CH1
  677. PA7 ------> TIM3_CH2
  678. PB0 ------> TIM3_CH3
  679. */
  680. GPIO_InitStruct.Pin = PWM_R_Pin;
  681. GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  682. GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  683. GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  684. GPIO_InitStruct.Pull = LL_GPIO_PULL_DOWN;
  685. GPIO_InitStruct.Alternate = LL_GPIO_AF_1;
  686. LL_GPIO_Init(PWM_R_GPIO_Port, &GPIO_InitStruct);
  687. GPIO_InitStruct.Pin = PWM_G_Pin;
  688. GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  689. GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  690. GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  691. GPIO_InitStruct.Pull = LL_GPIO_PULL_DOWN;
  692. GPIO_InitStruct.Alternate = LL_GPIO_AF_1;
  693. LL_GPIO_Init(PWM_G_GPIO_Port, &GPIO_InitStruct);
  694. GPIO_InitStruct.Pin = PWM_B_Pin;
  695. GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  696. GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  697. GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  698. GPIO_InitStruct.Pull = LL_GPIO_PULL_DOWN;
  699. GPIO_InitStruct.Alternate = LL_GPIO_AF_1;
  700. LL_GPIO_Init(PWM_B_GPIO_Port, &GPIO_InitStruct);
  701. }
  702. /**
  703. * @brief TIM14 Initialization Function
  704. * @param None
  705. * @retval None
  706. */
  707. static void MX_TIM14_Init(void)
  708. {
  709. /* USER CODE BEGIN TIM14_Init 0 */
  710. /* USER CODE END TIM14_Init 0 */
  711. LL_TIM_InitTypeDef TIM_InitStruct = {0};
  712. LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0};
  713. LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
  714. /* Peripheral clock enable */
  715. LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_TIM14);
  716. /* TIM14 interrupt Init */
  717. NVIC_SetPriority(TIM14_IRQn, 0);
  718. NVIC_EnableIRQ(TIM14_IRQn);
  719. /* USER CODE BEGIN TIM14_Init 1 */
  720. /* USER CODE END TIM14_Init 1 */
  721. TIM_InitStruct.Prescaler = 240;
  722. TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
  723. TIM_InitStruct.Autoreload = 1000;
  724. TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;
  725. LL_TIM_Init(TIM14, &TIM_InitStruct);
  726. LL_TIM_EnableARRPreload(TIM14);
  727. LL_TIM_OC_EnablePreload(TIM14, LL_TIM_CHANNEL_CH1);
  728. TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1;
  729. TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_DISABLE;
  730. TIM_OC_InitStruct.OCNState = LL_TIM_OCSTATE_DISABLE;
  731. TIM_OC_InitStruct.CompareValue = 750;
  732. TIM_OC_InitStruct.OCPolarity = LL_TIM_OCPOLARITY_HIGH;
  733. LL_TIM_OC_Init(TIM14, LL_TIM_CHANNEL_CH1, &TIM_OC_InitStruct);
  734. LL_TIM_OC_DisableFast(TIM14, LL_TIM_CHANNEL_CH1);
  735. /* USER CODE BEGIN TIM14_Init 2 */
  736. /* USER CODE END TIM14_Init 2 */
  737. LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOB);
  738. /**TIM14 GPIO Configuration
  739. PB1 ------> TIM14_CH1
  740. */
  741. GPIO_InitStruct.Pin = PWM_T_Pin;
  742. GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  743. GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  744. GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  745. GPIO_InitStruct.Pull = LL_GPIO_PULL_DOWN;
  746. GPIO_InitStruct.Alternate = LL_GPIO_AF_0;
  747. LL_GPIO_Init(PWM_T_GPIO_Port, &GPIO_InitStruct);
  748. }
  749. /**
  750. * @brief TIM16 Initialization Function
  751. * @param None
  752. * @retval None
  753. */
  754. static void MX_TIM16_Init(void)
  755. {
  756. /* USER CODE BEGIN TIM16_Init 0 */
  757. /* USER CODE END TIM16_Init 0 */
  758. LL_TIM_InitTypeDef TIM_InitStruct = {0};
  759. LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0};
  760. LL_TIM_BDTR_InitTypeDef TIM_BDTRInitStruct = {0};
  761. /* Peripheral clock enable */
  762. LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_TIM16);
  763. /* TIM16 interrupt Init */
  764. NVIC_SetPriority(TIM16_IRQn, 0);
  765. NVIC_EnableIRQ(TIM16_IRQn);
  766. /* USER CODE BEGIN TIM16_Init 1 */
  767. /* USER CODE END TIM16_Init 1 */
  768. TIM_InitStruct.Prescaler = 24;
  769. TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
  770. TIM_InitStruct.Autoreload = 1000;
  771. TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;
  772. TIM_InitStruct.RepetitionCounter = 0;
  773. LL_TIM_Init(TIM16, &TIM_InitStruct);
  774. LL_TIM_EnableARRPreload(TIM16);
  775. LL_TIM_OC_EnablePreload(TIM16, LL_TIM_CHANNEL_CH1);
  776. TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1;
  777. TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_DISABLE;
  778. TIM_OC_InitStruct.OCNState = LL_TIM_OCSTATE_DISABLE;
  779. TIM_OC_InitStruct.CompareValue = 0;
  780. TIM_OC_InitStruct.OCPolarity = LL_TIM_OCPOLARITY_HIGH;
  781. TIM_OC_InitStruct.OCNPolarity = LL_TIM_OCPOLARITY_HIGH;
  782. TIM_OC_InitStruct.OCIdleState = LL_TIM_OCIDLESTATE_LOW;
  783. TIM_OC_InitStruct.OCNIdleState = LL_TIM_OCIDLESTATE_LOW;
  784. LL_TIM_OC_Init(TIM16, LL_TIM_CHANNEL_CH1, &TIM_OC_InitStruct);
  785. LL_TIM_OC_DisableFast(TIM16, LL_TIM_CHANNEL_CH1);
  786. TIM_BDTRInitStruct.OSSRState = LL_TIM_OSSR_DISABLE;
  787. TIM_BDTRInitStruct.OSSIState = LL_TIM_OSSI_DISABLE;
  788. TIM_BDTRInitStruct.LockLevel = LL_TIM_LOCKLEVEL_OFF;
  789. TIM_BDTRInitStruct.DeadTime = 0;
  790. TIM_BDTRInitStruct.BreakState = LL_TIM_BREAK_DISABLE;
  791. TIM_BDTRInitStruct.BreakPolarity = LL_TIM_BREAK_POLARITY_HIGH;
  792. TIM_BDTRInitStruct.BreakFilter = LL_TIM_BREAK_FILTER_FDIV1;
  793. TIM_BDTRInitStruct.AutomaticOutput = LL_TIM_AUTOMATICOUTPUT_DISABLE;
  794. LL_TIM_BDTR_Init(TIM16, &TIM_BDTRInitStruct);
  795. /* USER CODE BEGIN TIM16_Init 2 */
  796. /* USER CODE END TIM16_Init 2 */
  797. }
  798. /**
  799. * @brief TIM17 Initialization Function
  800. * @param None
  801. * @retval None
  802. */
  803. static void MX_TIM17_Init(void)
  804. {
  805. /* USER CODE BEGIN TIM17_Init 0 */
  806. /* USER CODE END TIM17_Init 0 */
  807. LL_TIM_InitTypeDef TIM_InitStruct = {0};
  808. LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0};
  809. LL_TIM_BDTR_InitTypeDef TIM_BDTRInitStruct = {0};
  810. /* Peripheral clock enable */
  811. LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_TIM17);
  812. /* TIM17 interrupt Init */
  813. NVIC_SetPriority(TIM17_IRQn, 0);
  814. NVIC_EnableIRQ(TIM17_IRQn);
  815. /* USER CODE BEGIN TIM17_Init 1 */
  816. /* USER CODE END TIM17_Init 1 */
  817. TIM_InitStruct.Prescaler = 240;
  818. TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
  819. TIM_InitStruct.Autoreload = 1000;
  820. TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;
  821. TIM_InitStruct.RepetitionCounter = 100;
  822. LL_TIM_Init(TIM17, &TIM_InitStruct);
  823. LL_TIM_EnableARRPreload(TIM17);
  824. LL_TIM_OC_EnablePreload(TIM17, LL_TIM_CHANNEL_CH1);
  825. TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1;
  826. TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_DISABLE;
  827. TIM_OC_InitStruct.OCNState = LL_TIM_OCSTATE_DISABLE;
  828. TIM_OC_InitStruct.CompareValue = 0;
  829. TIM_OC_InitStruct.OCPolarity = LL_TIM_OCPOLARITY_HIGH;
  830. TIM_OC_InitStruct.OCNPolarity = LL_TIM_OCPOLARITY_HIGH;
  831. TIM_OC_InitStruct.OCIdleState = LL_TIM_OCIDLESTATE_LOW;
  832. TIM_OC_InitStruct.OCNIdleState = LL_TIM_OCIDLESTATE_LOW;
  833. LL_TIM_OC_Init(TIM17, LL_TIM_CHANNEL_CH1, &TIM_OC_InitStruct);
  834. LL_TIM_OC_DisableFast(TIM17, LL_TIM_CHANNEL_CH1);
  835. TIM_BDTRInitStruct.OSSRState = LL_TIM_OSSR_DISABLE;
  836. TIM_BDTRInitStruct.OSSIState = LL_TIM_OSSI_DISABLE;
  837. TIM_BDTRInitStruct.LockLevel = LL_TIM_LOCKLEVEL_OFF;
  838. TIM_BDTRInitStruct.DeadTime = 0;
  839. TIM_BDTRInitStruct.BreakState = LL_TIM_BREAK_DISABLE;
  840. TIM_BDTRInitStruct.BreakPolarity = LL_TIM_BREAK_POLARITY_HIGH;
  841. TIM_BDTRInitStruct.BreakFilter = LL_TIM_BREAK_FILTER_FDIV1;
  842. TIM_BDTRInitStruct.AutomaticOutput = LL_TIM_AUTOMATICOUTPUT_DISABLE;
  843. LL_TIM_BDTR_Init(TIM17, &TIM_BDTRInitStruct);
  844. /* USER CODE BEGIN TIM17_Init 2 */
  845. /* USER CODE END TIM17_Init 2 */
  846. }
  847. /**
  848. * Enable DMA controller clock
  849. */
  850. static void MX_DMA_Init(void)
  851. {
  852. /* Init with LL driver */
  853. /* DMA controller clock enable */
  854. LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA1);
  855. /* DMA interrupt init */
  856. /* DMA1_Channel1_IRQn interrupt configuration */
  857. NVIC_SetPriority(DMA1_Channel1_IRQn, 0);
  858. NVIC_EnableIRQ(DMA1_Channel1_IRQn);
  859. /* DMA1_Channel2_3_IRQn interrupt configuration */
  860. NVIC_SetPriority(DMA1_Channel2_3_IRQn, 0);
  861. NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);
  862. }
  863. /**
  864. * @brief GPIO Initialization Function
  865. * @param None
  866. * @retval None
  867. */
  868. static void MX_GPIO_Init(void)
  869. {
  870. LL_EXTI_InitTypeDef EXTI_InitStruct = {0};
  871. LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
  872. /* GPIO Ports Clock Enable */
  873. LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOB);
  874. LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOC);
  875. LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);
  876. /**/
  877. LL_GPIO_ResetOutputPin(LC0_GPIO_Port, LC0_Pin);
  878. /**/
  879. LL_GPIO_ResetOutputPin(LC1_GPIO_Port, LC1_Pin);
  880. /**/
  881. LL_GPIO_ResetOutputPin(LC2_GPIO_Port, LC2_Pin);
  882. /**/
  883. LL_GPIO_ResetOutputPin(LC3_GPIO_Port, LC3_Pin);
  884. /**/
  885. LL_GPIO_ResetOutputPin(SHDN_GPIO_Port, SHDN_Pin);
  886. /**/
  887. LL_GPIO_ResetOutputPin(Latch_GPIO_Port, Latch_Pin);
  888. /**/
  889. GPIO_InitStruct.Pin = LL_GPIO_PIN_9;
  890. GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
  891. GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  892. LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  893. /**/
  894. GPIO_InitStruct.Pin = LL_GPIO_PIN_14;
  895. GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
  896. GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  897. LL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  898. /**/
  899. GPIO_InitStruct.Pin = LL_GPIO_PIN_15;
  900. GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
  901. GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  902. LL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  903. /**/
  904. GPIO_InitStruct.Pin = LC0_Pin;
  905. GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  906. GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  907. GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  908. GPIO_InitStruct.Pull = LL_GPIO_PULL_DOWN;
  909. LL_GPIO_Init(LC0_GPIO_Port, &GPIO_InitStruct);
  910. /**/
  911. GPIO_InitStruct.Pin = LC1_Pin;
  912. GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  913. GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  914. GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  915. GPIO_InitStruct.Pull = LL_GPIO_PULL_DOWN;
  916. LL_GPIO_Init(LC1_GPIO_Port, &GPIO_InitStruct);
  917. /**/
  918. GPIO_InitStruct.Pin = LC2_Pin;
  919. GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  920. GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  921. GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  922. GPIO_InitStruct.Pull = LL_GPIO_PULL_DOWN;
  923. LL_GPIO_Init(LC2_GPIO_Port, &GPIO_InitStruct);
  924. /**/
  925. GPIO_InitStruct.Pin = LC3_Pin;
  926. GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  927. GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  928. GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  929. GPIO_InitStruct.Pull = LL_GPIO_PULL_DOWN;
  930. LL_GPIO_Init(LC3_GPIO_Port, &GPIO_InitStruct);
  931. /**/
  932. GPIO_InitStruct.Pin = SHDN_Pin;
  933. GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  934. GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  935. GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  936. GPIO_InitStruct.Pull = LL_GPIO_PULL_DOWN;
  937. LL_GPIO_Init(SHDN_GPIO_Port, &GPIO_InitStruct);
  938. /**/
  939. GPIO_InitStruct.Pin = LL_GPIO_PIN_5;
  940. GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
  941. GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  942. LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  943. /**/
  944. GPIO_InitStruct.Pin = LL_GPIO_PIN_2;
  945. GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
  946. GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  947. LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  948. /**/
  949. GPIO_InitStruct.Pin = BTN1_Pin;
  950. GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT;
  951. GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  952. LL_GPIO_Init(BTN1_GPIO_Port, &GPIO_InitStruct);
  953. /**/
  954. GPIO_InitStruct.Pin = BTN2_Pin;
  955. GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT;
  956. GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  957. LL_GPIO_Init(BTN2_GPIO_Port, &GPIO_InitStruct);
  958. /**/
  959. GPIO_InitStruct.Pin = LL_GPIO_PIN_6;
  960. GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
  961. GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  962. LL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  963. /**/
  964. GPIO_InitStruct.Pin = BTN3_Pin;
  965. GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT;
  966. GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  967. LL_GPIO_Init(BTN3_GPIO_Port, &GPIO_InitStruct);
  968. /**/
  969. GPIO_InitStruct.Pin = BTN4_Pin;
  970. GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT;
  971. GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  972. LL_GPIO_Init(BTN4_GPIO_Port, &GPIO_InitStruct);
  973. /**/
  974. GPIO_InitStruct.Pin = LL_GPIO_PIN_12;
  975. GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
  976. GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  977. LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  978. /**/
  979. GPIO_InitStruct.Pin = LL_GPIO_PIN_15;
  980. GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
  981. GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  982. LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  983. /**/
  984. GPIO_InitStruct.Pin = Latch_Pin;
  985. GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  986. GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  987. GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
  988. GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  989. LL_GPIO_Init(Latch_GPIO_Port, &GPIO_InitStruct);
  990. /**/
  991. LL_EXTI_SetEXTISource(LL_EXTI_CONFIG_PORTB, LL_EXTI_CONFIG_LINE8);
  992. /**/
  993. EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_8;
  994. EXTI_InitStruct.LineCommand = ENABLE;
  995. EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
  996. EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_RISING;
  997. LL_EXTI_Init(&EXTI_InitStruct);
  998. /**/
  999. LL_GPIO_SetPinPull(IRQ_GPIO_Port, IRQ_Pin, LL_GPIO_PULL_UP);
  1000. /**/
  1001. LL_GPIO_SetPinMode(IRQ_GPIO_Port, IRQ_Pin, LL_GPIO_MODE_INPUT);
  1002. /* EXTI interrupt init*/
  1003. NVIC_SetPriority(EXTI4_15_IRQn, 0);
  1004. NVIC_EnableIRQ(EXTI4_15_IRQn);
  1005. }
  1006. /* USER CODE BEGIN 4 */
  1007. /**
  1008. * S U B R O U T I N E S
  1009. */
  1010. /* Feel byte with tube position by digit.
  1011. * If digit == 0xf, then tube is off -- clear all bits.
  1012. */
  1013. static void showDigit(tube_pos_t pos, uint8_t dig)
  1014. {
  1015. if (dig > 9) {
  1016. if (dig != 0xf) {
  1017. dig = 0;
  1018. }
  1019. }
  1020. switch (pos) {
  1021. case Tube_E:
  1022. tubesBuffer[0] = 0;
  1023. tubesBuffer[1] &= nixieCathodeMask[Tube_E][1];
  1024. if (Tube_E != 0xf) {
  1025. tubesBuffer[0] = (uint8_t)(nixieCathodeMap[Tube_E][dig] >> 8);
  1026. tubesBuffer[1] |= (uint8_t)(nixieCathodeMap[Tube_E][dig]);
  1027. }
  1028. break;
  1029. case Tube_D:
  1030. tubesBuffer[1] &= nixieCathodeMask[Tube_D][0];
  1031. tubesBuffer[2] &= nixieCathodeMask[Tube_D][1];
  1032. if (Tube_D != 0xf) {
  1033. tubesBuffer[1] |= (uint8_t)(nixieCathodeMap[Tube_D][dig] >> 8);
  1034. tubesBuffer[2] |= (uint8_t)(nixieCathodeMap[Tube_D][dig]);
  1035. }
  1036. break;
  1037. case Tube_B:
  1038. tubesBuffer[2] &= nixieCathodeMask[Tube_B][0];
  1039. tubesBuffer[3] &= nixieCathodeMask[Tube_B][1];
  1040. if (Tube_B != 0xf) {
  1041. tubesBuffer[2] |= (uint8_t)(nixieCathodeMap[Tube_B][dig] >> 8);
  1042. tubesBuffer[3] |= (uint8_t)(nixieCathodeMap[Tube_B][dig]);
  1043. }
  1044. break;
  1045. case Tube_A:
  1046. tubesBuffer[3] &= nixieCathodeMask[Tube_A][0];
  1047. tubesBuffer[4] = 0;
  1048. if (Tube_A != 0xf) {
  1049. tubesBuffer[3] |= (uint8_t)(nixieCathodeMap[Tube_A][dig] >> 8);
  1050. tubesBuffer[4] = (uint8_t)(nixieCathodeMap[Tube_A][dig]);
  1051. }
  1052. break;
  1053. default:
  1054. break;
  1055. }
  1056. }
  1057. /* USER CODE END 4 */
  1058. /**
  1059. * @brief This function is executed in case of error occurrence.
  1060. * @retval None
  1061. */
  1062. void Error_Handler(void)
  1063. {
  1064. /* USER CODE BEGIN Error_Handler_Debug */
  1065. /* User can add his own implementation to report the HAL error return state */
  1066. __disable_irq();
  1067. while (1)
  1068. {
  1069. }
  1070. /* USER CODE END Error_Handler_Debug */
  1071. }
  1072. #ifdef USE_FULL_ASSERT
  1073. /**
  1074. * @brief Reports the name of the source file and the source line number
  1075. * where the assert_param error has occurred.
  1076. * @param file: pointer to the source file name
  1077. * @param line: assert_param error line source number
  1078. * @retval None
  1079. */
  1080. void assert_failed(uint8_t *file, uint32_t line)
  1081. {
  1082. /* USER CODE BEGIN 6 */
  1083. /* User can add his own implementation to report the file name and line number,
  1084. ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  1085. /* USER CODE END 6 */
  1086. }
  1087. #endif /* USE_FULL_ASSERT */
  1088. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/