发 帖  
原厂入驻New

多功能门铃设计

2020-5-22 21:19:51  203 STM32
分享
0
本帖最后由 QQSD 于 2020-5-23 21:40 编辑

这个是以前大二无聊打发时间做的项目,目的也是为了学一下STM32CUBE。发出来跟大家交流交流,不足之处也请大佬们多多指点。orz
功能有:
1.播放音乐门铃,且通过usb可以进行更换音乐
2.红外模块检测到门口有人长时间逗留会播放报警提示并且会发送短信提示客户
3.主人不在家时我们可以通过拨打电话联系主人
4.可以进行录音留言,主人回家后可以进行播放录音(播放录音的按键是在内侧的,录音按键是在外侧的,你说贴心不哈哈哈哈)
直接上实物图吧
图1.jpg
(这样布局呢就按键、喇叭对准外面的人,然后那些模块芯片啊都在内测)
主要零件:STM32F103C8T6 JQ8900-16P 模块、ISD1820录音芯片,GPS通讯模块及其驱动电路、红外对管、点动按钮、自锁开关
OK,那接下来讲一下STM32CUBE中怎么配置和生产代码。

首先配置RCC(复位和时钟控制),选择外部高速始终,如下图
开始时钟.png

进入时钟配置,我们使用的STM32F103核心板外部晶振是8MHz的,在Input freequency 输入8,在HCLK那里会提示最大频率72MHz,输入72,然后自动寻求配置,注意第一次配置出来的还是内部时钟HSI的,要选择为HSE,配置好后如下图
时钟配置.png
结着我们对需要使用到的IO口进行配置,同时标上标签。
给需要用的口打上标签.png

打开这个界面,可以配置IO口、定时器和中断。
配置串口中断定时器.png

配置定时器,定时器的频率设置为2HZ
定时器设置.png
配值输入引脚上拉输入,配置输出引脚
IO口设置.png
同时设置三个串口的波特率。

串口设置.png
ok了,之后就点击generate code,选择输入为MDK5工程(这个可以根据自己的编译器选择)可以生成驱动代码了。
STM32CUBE的方便之处在于我们可以不用去查详细的手册就可以直接开始撸代码了。感谢STM32CUBE为我们提供了HAL库。
接下来就是捋一下逻辑然后撸代码了,附上代码
  1. #include "main.h"
  2. #include "stm32f1xx_hal.h"
  3. #include "tim.h"
  4. #include "usart.h"
  5. #include "gpio.h"

  6. /* USER CODE BEGIN Includes */

  7. /* USER CODE END Includes */

  8. /* Private variables ---------------------------------------------------------*/

  9. /* USER CODE BEGIN PV */
  10. /* Private variables ---------------------------------------------------------*/

  11. /* USER CODE END PV */

  12. /* Private function prototypes -----------------------------------------------*/
  13. void Systemclock_Config(void);

  14. /* USER CODE BEGIN PFP */
  15. /* Private function prototypes -----------------------------------------------*/

  16. /* USER CODE END PFP */

  17. /* USER CODE BEGIN 0 */

  18. uint8_t M1[6] = {0xAA, 0x07, 0x02, 0x00, 0x01, 0xB4};
  19. uint8_t M2[6] = {0xAA, 0x07, 0x02, 0x00, 0x02, 0xB5};
  20. uint8_t End[1] = {0x1A};
  21. uint16_t Tcount;
  22. uint16_t Messgae,FFlag;
  23. /* USER CODE END 0 */

  24. /**
  25.   * [url=home.php?mod=space&uid=2666770]@Brief[/url]  The application entry point.
  26.   *
  27.   * @retval None
  28.   */
  29. int main(void)
  30. {
  31.   /* USER CODE BEGIN 1 */

  32.   /* USER CODE END 1 */

  33.   /* MCU Configuration----------------------------------------------------------*/

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

  36.   /* USER CODE BEGIN Init */

  37.   /* USER CODE END Init */

  38.   /* Configure the system clock */
  39.   SystemClock_Config();

  40.   /* USER CODE BEGIN SysInit */

  41.   /* USER CODE END SysInit */

  42.   /* Initialize all configured peripherals */
  43.   MX_GPIO_Init();
  44.   MX_USART1_UART_Init();
  45.   MX_USART2_UART_Init();
  46.   MX_USART3_UART_Init();
  47.   MX_TIM1_Init();
  48.   /* USER CODE BEGIN 2 */
  49.   //HAL_UART_Transmit(&huart1,M1,6,10);//播放第一首        
  50.         //HAL_UART_Transmit(&huart1,M2,6,10);//播放第二首
  51.         HAL_TIM_Base_Start_IT(&htim1);
  52.         Tcount = 0;
  53.         FFlag  = 1;
  54.         HAL_UART_Transmit(&huart1,"初始化OK了\r\n",sizeof("初始化OK了\r\n"),10);
  55.         HAL_UART_Transmit(&huart3,"U3OK\r\n",sizeof("U3OK\r\n"),10);
  56.   /* USER CODE END 2 */

  57.   /* Infinite loop */
  58.   /* USER CODE BEGIN WHILE */
  59.   while (1)
  60.   {
  61.                 IF(HAL_GPIO_ReadPin(Doorbell_GPIO_Port,Doorbell_Pin)==RESET)
  62.                 {
  63.                         HAL_Delay(10);
  64.                         if(HAL_GPIO_ReadPin(Doorbell_GPIO_Port,Doorbell_Pin)==RESET)
  65.                         {
  66.                                 while(HAL_GPIO_ReadPin(Doorbell_GPIO_Port,Doorbell_Pin)==RESET);
  67.                                 HAL_UART_Transmit(&huart2,M1,6,10);//播放第一首
  68.                                 HAL_UART_Transmit(&huart1,"响门铃\r\n",sizeof("响门铃\r\n"),10);
  69.                         }
  70.                 }
  71.                 if(HAL_GPIO_ReadPin(Call_GPIO_Port,Call_Pin)==RESET)
  72.                 {
  73.                         HAL_Delay(10);
  74.                         if(HAL_GPIO_ReadPin(Call_GPIO_Port,Call_Pin)==RESET)
  75.                         {
  76.                                 while(HAL_GPIO_ReadPin(Call_GPIO_Port,Call_Pin)==RESET);
  77.                                 HAL_UART_Transmit(&huart3,"ATD13*********;\r\n",sizeof("ATD13*********;\r\n"),10);
  78.                         }
  79.                 }
  80.                 if(FFlag){
  81.                                 if(Messgae){
  82.                                                  HAL_UART_Transmit(&huart3,"AT+CSCS=\"GSM\"\r\n",sizeof("AT+CSCS=\"GSM\"\r\n"),10);
  83.                                                  HAL_Delay(100);
  84.                                                  HAL_UART_Transmit(&huart3,"AT+CMGF=1\r\n",sizeof("AT+CMGF=1\r\n"),10);
  85.                                                  HAL_Delay(100);
  86.                                                  HAL_UART_Transmit(&huart3,"AT+CMGS=\"13*********\"\r\n",sizeof("AT+CMGS=\"13********* \"\r\n"),10);
  87.                                                  HAL_Delay(100);
  88.                                                  HAL_UART_Transmit(&huart3,"Danger!!!",sizeof("Danger!!!"),10);
  89.                                                  HAL_Delay(100);
  90.                                                  HAL_UART_Transmit(&huart3,End,1,10);
  91.                                            Messgae = 0;
  92.                                            FFlag = 0;
  93.                                  }        
  94.                 }
  95.                  
  96.                
  97.   /* USER CODE END WHILE */

  98.   /* USER CODE BEGIN 3 */

  99.   }
  100.   /* USER CODE END 3 */

  101. }

  102. /**
  103.   * @brief System Clock Configuration
  104.   * @retval None
  105.   */
  106. void SystemClock_Config(void)
  107. {

  108.   RCC_OscInitTypeDef RCC_OscInitStruct;
  109.   RCC_ClkInitTypeDef RCC_ClkInitStruct;

  110.     /**Initializes the CPU, AHB and APB busses clocks
  111.     */
  112.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  113.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  114.   RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  115.   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  116.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  117.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  118.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  119.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  120.   {
  121.     _Error_Handler(__FILE__, __LINE__);
  122.   }

  123.     /**Initializes the CPU, AHB and APB busses clocks
  124.     */
  125.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  126.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  127.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  128.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  129.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIv2;
  130.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  131.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  132.   {
  133.     _Error_Handler(__FILE__, __LINE__);
  134.   }

  135.     /**Configure the Systick interrupt time
  136.     */
  137.   HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

  138.     /**Configure the Systick
  139.     */
  140.   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  141.   /* SysTick_IRQn interrupt configuration */
  142.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  143. }

  144. /* USER CODE BEGIN 4 */


  145. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

  146. {

  147.   if (htim->Instance == htim1.Instance)
  148. {
  149.         
  150.          
  151.          
  152.          if(HAL_GPIO_ReadPin(Check_GPIO_Port,Check_Pin)==RESET)
  153.                 {
  154.                         //HAL_Delay(10);
  155.                         if(HAL_GPIO_ReadPin(Check_GPIO_Port,Check_Pin)==RESET)
  156.                         {
  157.                                 //while(HAL_GPIO_ReadPin(Doorbell_GPIO_Port,Doorbell_Pin)==SET);
  158.                                 Tcount++;
  159.                         }
  160.                 }else{
  161.                   Tcount = 0;
  162.                 }
  163.          
  164.          
  165.          if(Tcount == 10){
  166.                  HAL_UART_Transmit(&huart2,M2,6,10);//播放第二首
  167.                  HAL_UART_Transmit(&huart1,"检查到入侵\r\n",sizeof("检查到入侵\r\n"),10);
  168.                  Tcount = 0;
  169.                  Messgae = 1;
  170.          }
  171. }

  172. }


  173. /* USER CODE END 4 */

  174. /**
  175.   * @brief  This function is executed in case of error occurrence.
  176.   * [url=home.php?mod=space&uid=3142012]@param[/url]  file: The file name as string.
  177.   * @param  line: The line in file as a number.
  178.   * @retval None
  179.   */
  180. void _Error_Handler(char *file, int line)
  181. {
  182.   /* USER CODE BEGIN Error_Handler_debug */
  183.   /* User can add his own implementation to report the HAL error return state */
  184.   while(1)
  185.   {
  186.   }
  187.   /* USER CODE END Error_Handler_Debug */
  188. }

  189. #ifdef  USE_FULL_ASSERT
  190. /**
  191.   * @brief  Reports the name of the source file and the source line number
  192.   *         where the assert_param error has occurred.
  193.   * @param  file: pointer to the source file name
  194.   * @param  line: assert_param error line source number
  195.   * @retval None
  196.   */
  197. void assert_faiLED(uint8_t* file, uint32_t line)
  198. {
  199.   /* USER CODE BEGIN 6 */
  200.   /* User can add his own implementation to report the file name and line number,
  201.      tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  202.   /* USER CODE END 6 */
  203. }
  204. #endif /* USE_FULL_ASSERT */
复制代码
好了,如果需要详细工程的话可以留言附上邮箱,我看到了会发给你滴!!



QQSD 2020-5-22 21:22:08

RE: 多功能门铃设计

本帖最后由 QQSD 于 2020-5-25 08:12 编辑

排版已经修改
为了避免尴尬
沙发自己抢自己坐

回复

举报

AUTO专家 2020-5-25 15:09:31
你好前辈,能不能把注释详细一点发给我,最好是C文件,liyuan085@sina.cn
1回复

举报

  • QQSD 2020-5-25 19:21

    你好这个是用STM32CUBE生成的工程,建议你先学一下STM32CUBE如何生成功能,然后我的主要操作代码主要是在 /* USER CODE BEGIN */和 /* USER CODE END */之间,这是软件设定的,运行逻辑也比较简单可读性强,基本都是学过C语言的基础知识就可以阅读得懂的。

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发经验
关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表