你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32G431RBTx 电压测量监控设备

[复制链接]
STMCU小助手 发布时间:2023-3-1 18:46
一、题目

79ac347e33aa45728385530d98b618a4.png

254a72c340df48e580024dba7e793595.png

ab8891c03b7c4eb898b92f361426eb16.png


二、模块初始化
1.LCD这里不用配置,直接使用提供的资源包就行
2.KEY, 四个按键IO口都要配置,分别是PB0, PB1,PB2,PA0依次是B0,B1,B2,B3不要弄错了
3.LED:开启PC8,PD2输出模式就行了。
4.定时器:TIM3(按键消抖定时器)SC:80-1,ARR:10000-1,TIM4(控制LED闪烁)SC:80-1,ARR:10000-1。
5.ADCB15作为ADC2IN15通道,开启single-ended模式。
6.EEPROMB6,PB7输出模式。

三、代码实现
bsp组有:

13967a725c3f40369364e3f16045982a.png

在这里只展示interrupt.h,interrupt.h,main.c,main.h的代码,其他文件的代码可到基本模块篇获取。
interrupt.h:
  1. #ifndef __INTERRUPT_H__
  2. #define __INTERRUPT_H__

  3. #include "main.h"
  4. #include "stdbool.h"

  5. struct keys
  6. {
  7.         bool key_sta;
  8.         unsigned char judge_sta;
  9.         bool single_flag;
  10.         unsigned int key_time;
  11.         bool long_flag;
  12. };

  13. #endif

复制代码

interrupt.c:
  1. #include "interrupt.h"
  2. #include "lcd.h"
  3. #include "stdio.h"

  4. char RxBuffer[30];
  5. unsigned char BufIndex;
  6. unsigned char Rxdat;
  7. extern unsigned char LEDTime;
  8. extern unsigned char LED;
  9. unsigned char LEDType;
  10. extern unsigned char ledMode;

  11. struct keys key[4] = {0, 0, 0, 0, 0};

  12. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  13. {
  14.         RxBuffer[BufIndex++] = Rxdat;
  15.         HAL_UART_Receive_IT(huart, &Rxdat, 1);
  16. }

  17. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  18. {
  19.         if(htim->Instance == TIM3)
  20.         {
  21.                 key[0].key_sta = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0);
  22.                 key[1].key_sta = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);
  23.                 key[2].key_sta = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2);
  24.                 key[3].key_sta = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);
  25.                 for(unsigned char i = 0; i < 4; i++)
  26.                 {
  27.                         switch(key[i].judge_sta)
  28.                         {
  29.                                 case 0:
  30.                                 {
  31.                                         if(key[i].key_sta == 0)
  32.                                         {
  33.                                                 key[i].judge_sta = 1;
  34.                                                 key[i].key_time = 0;
  35.                                         }
  36.                                         break;
  37.                                 }
  38.                                 case 1:
  39.                                 {
  40.                                         if(key[i].key_sta == 0)
  41.                                         {
  42.                                                 key[i].judge_sta = 2;
  43.                                         }
  44.                                         else
  45.                                         {
  46.                                                 key[i].judge_sta = 0;
  47.                                         }
  48.                                         break;
  49.                                 }
  50.                                 case 2:
  51.                                 {
  52.                                         if(key[i].key_sta == 1)
  53.                                         {
  54.                                                 key[i].judge_sta = 0;
  55.                                                 if(key[i].key_time <= 80)
  56.                                                 {
  57.                                                         key[i].single_flag = 1;
  58.                                                 }
  59.                                         }
  60.                                         else
  61.                                         {
  62.                                                 key[i].key_time++;
  63.                                                 if(key[i].key_time > 80)
  64.                                                 {
  65.                                                         key[i].long_flag = 1;
  66.                                                 }
  67.                                         }
  68.                                         break;
  69.                                 }
  70.                         }
  71.                 }
  72.         }
  73.         if(htim->Instance == TIM4)
  74.         {
  75.                 LEDTime++;
  76.                 if(ledMode == ON)
  77.                 {
  78.                         if(LEDTime == 20)
  79.                         {
  80.                                 LEDType = !LEDType;
  81.                                 LED = LED & 0xfe | LEDType;
  82.                                 LEDTime = 0;
  83.                         }
  84.                 }

  85.         }
  86. }

复制代码

main.h:
  1. /* USER CODE BEGIN Header */
  2. /**
  3.   ******************************************************************************
  4.   * @file           : main.h
  5.   * @brief          : Header for main.c file.
  6.   *                   This file contains the common defines of the application.
  7.   ******************************************************************************
  8.   * @attention
  9.   *
  10.   * <h2><center>© Copyright (c) 2023 STMicroelectronics.
  11.   * All rights reserved.</center></h2>
  12.   *
  13.   * This software component is licensed by ST under BSD 3-Clause license,
  14.   * the "License"; You may not use this file except in compliance with the
  15.   * License. You may obtain a copy of the License at:
  16.   *                        opensource.org/licenses/BSD-3-Clause
  17.   *
  18.   ******************************************************************************
  19.   */
  20. /* USER CODE END Header */

  21. /* Define to prevent recursive inclusion -------------------------------------*/
  22. #ifndef __MAIN_H
  23. #define __MAIN_H

  24. #ifdef __cplusplus
  25. extern "C" {
  26. #endif

  27. /* Includes ------------------------------------------------------------------*/
  28. #include "stm32g4xx_hal.h"

  29. /* Private includes ----------------------------------------------------------*/
  30. /* USER CODE BEGIN Includes */

  31. /* USER CODE END Includes */

  32. /* Exported types ------------------------------------------------------------*/
  33. /* USER CODE BEGIN ET */

  34. /* USER CODE END ET */

  35. /* Exported constants --------------------------------------------------------*/
  36. /* USER CODE BEGIN EC */

  37. /* USER CODE END EC */

  38. /* Exported macro ------------------------------------------------------------*/
  39. /* USER CODE BEGIN EM */

  40. /* USER CODE END EM */

  41. /* Exported functions prototypes ---------------------------------------------*/
  42. void Error_Handler(void);

  43. /* USER CODE BEGIN EFP */

  44. /* USER CODE END EFP */

  45. /* Private defines -----------------------------------------------------------*/
  46. /* USER CODE BEGIN Private defines */
  47. #define DATA 0
  48. #define PARA 1
  49. #define HOUR 0
  50. #define MINUTE 1
  51. #define SECOND 2
  52. #define OFF 1
  53. #define ON 0
  54. /* USER CODE END Private defines */

  55. #ifdef __cplusplus
  56. }
  57. #endif

  58. #endif /* __MAIN_H */

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

复制代码

main.c:
  1. /* USER CODE BEGIN Header */
  2. /**
  3.   ******************************************************************************
  4.   * @file           : main.c
  5.   * @brief          : Main program body
  6.   ******************************************************************************
  7.   * @attention
  8.   *
  9.   * <h2><center>© Copyright (c) 2023 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. #include "adc.h"
  23. #include "rtc.h"
  24. #include "tim.h"
  25. #include "usart.h"
  26. #include "gpio.h"

  27. /* Private includes ----------------------------------------------------------*/
  28. /* USER CODE BEGIN Includes */
  29. #include "lcd.h"
  30. #include "stdio.h"
  31. #include "stdlib.h"
  32. #include "string.h"
  33. #include "interrupt.h"
  34. #include "badc.h"
  35. #include "i2c.h"
  36. #include "led.h"
  37. /* USER CODE END Includes */

  38. /* Private typedef -----------------------------------------------------------*/
  39. /* USER CODE BEGIN PTD */

  40. /* USER CODE END PTD */

  41. /* Private define ------------------------------------------------------------*/
  42. /* USER CODE BEGIN PD */
  43. /* USER CODE END PD */

  44. /* Private macro -------------------------------------------------------------*/
  45. /* USER CODE BEGIN PM */

  46. /* USER CODE END PM */

  47. /* Private variables ---------------------------------------------------------*/

  48. /* USER CODE BEGIN PV */
  49. RTC_TimeTypeDef T;
  50. RTC_DateTypeDef D;
  51. unsigned char second = 255;
  52. extern char RxBuffer[30];
  53. extern unsigned char BufIndex;
  54. extern unsigned char Rxdat;
  55. extern struct keys key[4];
  56. unsigned char DisplayMode;
  57. unsigned int globalADC;
  58. unsigned char TimeCheckStore[3];
  59. unsigned char SettingIndex;
  60. unsigned char i = 0;
  61. unsigned char ledMode;
  62. float k = 0.1;
  63. unsigned char LEDTime;
  64. unsigned char LED;

  65. /* USER CODE END PV */

  66. /* Private function prototypes -----------------------------------------------*/
  67. void SystemClock_Config(void);
  68. /* USER CODE BEGIN PFP */
  69. void Rx_Proc(void);
  70. void DisposeKey(void);
  71. void LCD_Display(void);
  72. void Judge_LEDFlash(void);
  73. /* USER CODE END PFP */

  74. /* Private user code ---------------------------------------------------------*/
  75. /* USER CODE BEGIN 0 */

  76. /* USER CODE END 0 */

  77. /**
  78.   * @brief  The application entry point.
  79.   * @retval int
  80.   */
  81. int main(void)
  82. {
  83.   /* USER CODE BEGIN 1 */

  84.   /* USER CODE END 1 */

  85.   /* MCU Configuration--------------------------------------------------------*/

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

  88.   /* USER CODE BEGIN Init */

  89.   /* USER CODE END Init */

  90.   /* Configure the system clock */
  91.   SystemClock_Config();

  92.   /* USER CODE BEGIN SysInit */

  93.   /* USER CODE END SysInit */

  94.   /* Initialize all configured peripherals */
  95.   MX_GPIO_Init();
  96.   MX_RTC_Init();
  97.   MX_USART1_UART_Init();
  98.   MX_ADC2_Init();
  99.   MX_TIM3_Init();
  100.   MX_TIM4_Init();
  101.   /* USER CODE BEGIN 2 */
  102.         LCD_Init();
  103.         LCD_Clear(Black);
  104.         LCD_SetBackColor(Black);
  105.         LCD_SetTextColor(White);
  106.         HAL_UART_Receive_IT(&huart1, &Rxdat, 1);
  107.         HAL_TIM_Base_Start_IT(&htim3);
  108.         k = eeprom_read(0x01) / 10.0;
  109.         LED_Display(0x00);
  110.   /* USER CODE END 2 */

  111.   /* Infinite loop */
  112.   /* USER CODE BEGIN WHILE */
  113.   while (1)
  114.   {
  115.     /* USER CODE END WHILE */

  116.     /* USER CODE BEGIN 3 */
  117.                 HAL_RTC_GetTime(&hrtc, &T, RTC_FORMAT_BIN);
  118.                 HAL_RTC_GetDate(&hrtc, &D, RTC_FORMAT_BIN);
  119.                 globalADC = getADC(&hadc2);
  120.                 Judge_LEDFlash();

  121.                 if(BufIndex != 0)
  122.                 {
  123.                         unsigned char temp = BufIndex;
  124.                         HAL_Delay(1);
  125.                         if(temp == BufIndex)
  126.                                 Rx_Proc();
  127.                 }
  128.                 DisposeKey();
  129.                 LED_Display(LED);
  130.                 LCD_Display();
  131.   }
  132.   /* USER CODE END 3 */
  133. }

  134. /**
  135.   * @brief System Clock Configuration
  136.   * @retval None
  137.   */
  138. void SystemClock_Config(void)
  139. {
  140.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  141.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  142.   RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

  143.   /** Configure the main internal regulator output voltage
  144.   */
  145.   HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);
  146.   /** Initializes the RCC Oscillators according to the specified parameters
  147.   * in the RCC_OscInitTypeDef structure.
  148.   */
  149.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  150.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  151.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  152.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  153.   RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV3;
  154.   RCC_OscInitStruct.PLL.PLLN = 20;
  155.   RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  156.   RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  157.   RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
  158.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  159.   {
  160.     Error_Handler();
  161.   }
  162.   /** Initializes the CPU, AHB and APB buses clocks
  163.   */
  164.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  165.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  166.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  167.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  168.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  169.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  170.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  171.   {
  172.     Error_Handler();
  173.   }
  174.   /** Initializes the peripherals clocks
  175.   */
  176.   PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
  177.                               |RCC_PERIPHCLK_ADC12;
  178.   PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
  179.   PeriphClkInit.Adc12ClockSelection = RCC_ADC12CLKSOURCE_SYSCLK;
  180.   PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_HSE_DIV32;

  181.   if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  182.   {
  183.     Error_Handler();
  184.   }
  185. }

  186. /* USER CODE BEGIN 4 */
  187. void Rx_Proc(void)
  188. {
  189.         if(BufIndex == 5 && RxBuffer[0] == 'k' && RxBuffer[1] == '0' && RxBuffer[2] == '.' && RxBuffer[3] <= '9' && RxBuffer[3] >= '1' && RxBuffer[4] == ' ')
  190.         {
  191.                 printf(RxBuffer);
  192.                 k = strtod(RxBuffer + 1, NULL);
  193.                 eeprom_write(0x01, (unsigned char)(k * 10));
  194.                 printf("ok\n");
  195.         }
  196.         BufIndex = 0;
  197.         memset(RxBuffer, 0, 30);
  198. }

  199. int fputc(int ch, FILE *f)
  200. {
  201.         HAL_UART_Transmit(&huart1, (unsigned char *)&ch, 1, HAL_MAX_DELAY);
  202.         return ch;
  203. }

  204. void DisposeKey(void)
  205. {
  206.         if(key[0].single_flag)
  207.         {
  208.                 ledMode = !ledMode;
  209.                 if(ledMode == OFF)
  210.                 {
  211.                         HAL_TIM_Base_Stop_IT(&htim4);
  212.                         LED = 0x00;
  213.                 }
  214.                 key[0].single_flag = 0;
  215.         }
  216.         if(key[1].single_flag)
  217.         {
  218.                 if(DisplayMode == DATA)
  219.                 {
  220.                         DisplayMode = PARA;
  221.                         LCD_Clear(Black);
  222.                 }
  223.                 else if(DisplayMode == PARA)
  224.                 {
  225.                         DisplayMode = DATA;
  226.                         LCD_Clear(Black);
  227.                 }
  228.                 key[1].single_flag = 0;
  229.         }
  230.         if(key[2].single_flag)
  231.         {
  232.                 if(DisplayMode == PARA)
  233.                 {
  234.                         SettingIndex++;
  235.                         SettingIndex %= 3;
  236.                 }
  237.                 key[2].single_flag = 0;
  238.         }
  239.         if(key[3].single_flag)
  240.         {
  241.                 if(DisplayMode == PARA)
  242.                 {
  243.                         if(SettingIndex == HOUR)
  244.                         {
  245.                                 TimeCheckStore[HOUR]++;
  246.                                 TimeCheckStore[0] %= 24;
  247.                         }
  248.                         if(SettingIndex == MINUTE)
  249.                         {
  250.                                 TimeCheckStore[MINUTE]++;
  251.                                 TimeCheckStore[1] %= 60;
  252.                         }
  253.                         if(SettingIndex == SECOND)
  254.                         {
  255.                                 TimeCheckStore[SECOND]++;
  256.                                 TimeCheckStore[2] %= 60;
  257.                         }
  258.                 }
  259.                 key[3].single_flag = 0;
  260.         }
  261.         if(key[3].long_flag)
  262.         {
  263.                 if(DisplayMode == PARA)
  264.                 {
  265.                         i++;
  266.                         if(i == 10)
  267.                         {
  268.                                 i = 0;
  269.                                 if(SettingIndex == HOUR)
  270.                                 {
  271.                                         TimeCheckStore[HOUR]++;
  272.                                         TimeCheckStore[0] %= 24;
  273.                                 }
  274.                                 if(SettingIndex == MINUTE)
  275.                                 {
  276.                                         TimeCheckStore[MINUTE]++;
  277.                                         TimeCheckStore[1] %= 60;
  278.                                 }
  279.                                 if(SettingIndex == SECOND)
  280.                                 {
  281.                                         TimeCheckStore[SECOND]++;
  282.                                         TimeCheckStore[2] %= 60;
  283.                                 }
  284.                         }
  285.                 }
  286.                 key[3].long_flag = 0;
  287.         }
  288. }

  289. void LCD_Display(void)
  290. {
  291.         if(DisplayMode == DATA)
  292.         {
  293.                 char text[30];
  294.                 if(second != T.Seconds)
  295.                 {
  296.                         second = T.Seconds;
  297.                         sprintf(text, "    T:%02d-%02d-%02d", T.Hours, T.Minutes, T.Seconds);
  298.                         LCD_DisplayStringLine(Line5, text);
  299.                         if(TimeCheckStore[HOUR] == T.Hours && TimeCheckStore[MINUTE] == T.Minutes && TimeCheckStore[SECOND] == T.Seconds)
  300.                         {
  301.                                 printf("%.2f+%.1f+%02d%02d%02d\n", globalADC * 3.3 / 4096, k, T.Hours, T.Minutes, T.Seconds);
  302.                         }
  303.                 }
  304.                 sprintf(text, "    V1:%.2fV", globalADC * 3.3 /4096);
  305.                 LCD_DisplayStringLine(Line2, text);
  306.                 sprintf(text, "    k:%0.1f", k);
  307.                 LCD_DisplayStringLine(Line3, text);
  308.                 if(ledMode == ON)
  309.                 {
  310.                         sprintf(text, "    LED:ON ");
  311.                 }
  312.                 else
  313.                 {
  314.                         sprintf(text, "    LED:OFF");
  315.                 }
  316.                 LCD_DisplayStringLine(Line4, text);

  317.         }
  318.         if(DisplayMode == PARA)
  319.         {
  320.                 LCD_DisplayStringLine(Line2, "    Setting");
  321.                 char text[30];
  322.                 sprintf(text, "   %02d-%02d-%02d", TimeCheckStore[HOUR], TimeCheckStore[MINUTE], TimeCheckStore[SECOND]);
  323.                 LCD_DisplayStringLine(Line4, text);
  324.                 LCD_SetTextColor(Green);
  325.                 LCD_DisplayChar(Line4, 319 - (SettingIndex * 3 + 3) *16, TimeCheckStore[SettingIndex] / 10 + '0');
  326.                 LCD_DisplayChar(Line4, 319 - (SettingIndex * 3 + 4) *16, TimeCheckStore[SettingIndex] % 10 + '0');
  327.                 LCD_SetTextColor(White);

  328.         }
  329. }

  330. void Judge_LEDFlash(void)
  331. {
  332.         if(ledMode == ON)
  333.         {
  334.                 if((globalADC * 3.3f / 4096.0f) > (3.3f * (float)k))
  335.                 {
  336.                         HAL_TIM_Base_Start_IT(&htim4);
  337.                 }
  338.                 else
  339.                 {
  340.                         HAL_TIM_Base_Stop_IT(&htim4);
  341.                         LED = 0x00;
  342.                 }
  343.         }

  344. }
  345. /* USER CODE END 4 */

  346. /**
  347.   * @brief  This function is executed in case of error occurrence.
  348.   * @retval None
  349.   */
  350. void Error_Handler(void)
  351. {
  352.   /* USER CODE BEGIN Error_Handler_Debug */
  353.   /* User can add his own implementation to report the HAL error return state */
  354.   __disable_irq();
  355.   while (1)
  356.   {
  357.   }
  358.   /* USER CODE END Error_Handler_Debug */
  359. }

  360. #ifdef  USE_FULL_ASSERT
  361. /**
  362.   * @brief  Reports the name of the source file and the source line number
  363.   *         where the assert_param error has occurred.
  364.   * @param  file: pointer to the source file name
  365.   * @param  line: assert_param error line source number
  366.   * @retval None
  367.   */
  368. void assert_failed(uint8_t *file, uint32_t line)
  369. {
  370.   /* USER CODE BEGIN 6 */
  371.   /* User can add his own implementation to report the file name and line number,
  372.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  373.   /* USER CODE END 6 */
  374. }
  375. #endif /* USE_FULL_ASSERT */

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

复制代码

————————————————
版权声明:火花页.


收藏 评论0 发布时间:2023-3-1 18:46

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版