找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3388|回复: 5
收起左侧

STM32F103多种组合按键队列 源程序 控制PWM输出 外接485通讯 ADC采集

[复制链接]
ID:403544 发表于 2021-1-25 16:26 | 显示全部楼层 |阅读模式
  1. /*申明一下部分代码是来自于网络的整合 我自己做了一些修改 更加完善 取之于网络用之于网络  */
  2. /*按键队列执行函数*/
  3. void task_run_key(void)
  4. {
  5.         KeyValue_Info KeyValueInfo;
  6.         unsigned char len = 0;
  7.         
  8.         if(Read_RingStrEx(&Key_Value,(unsigned char *)&KeyValueInfo,&len) == 0)
  9.         {
  10.                 if(len != sizeof(KeyValue_Info))
  11.                 {
  12.                         return;
  13.                 }
  14.                
  15.                 if(KeyValueInfo.KeyGpNum < KeyGPCnt && KeyGpInfo[KeyValueInfo.KeyGpNum].KeyGPRun != NULL)
  16.                 {
  17.                         
  18.                         KeyGpInfo[KeyValueInfo.KeyGpNum].KeyGPRun();
  19.                         
  20.                 }
  21.                 else if(KeyValueInfo.KeyNum < KeyCnt)
  22.                 {
  23.                         if(KeyValueInfo.KeyStatus == SP && KeyInfo[KeyValueInfo.KeyNum].KeySPRun != NULL)
  24.                         {
  25.                                 
  26.                                 KeyInfo[KeyValueInfo.KeyNum].KeySPRun();
  27.                                 
  28.                         }
  29.                         else if(KeyValueInfo.KeyStatus == LP && KeyInfo[KeyValueInfo.KeyNum].KeyLPRun != NULL)
  30.                         {
  31.                                 
  32.                                 KeyInfo[KeyValueInfo.KeyNum].KeyLPRun();
  33.                                 
  34.                         }
  35.                         else if(KeyValueInfo.KeyStatus == LOOP && KeyInfo[KeyValueInfo.KeyNum].KeyLOOPRun != NULL)
  36.                         {
  37.                                 
  38.                                 KeyInfo[KeyValueInfo.KeyNum].KeyLOOPRun();
  39.                                 
  40.                         }        
  41.                 }
  42.         }
  43. }
  44. //监听函数 --放在1ms循环里面执行
  45. void task_listen_key(void)
  46. {
  47.         unsigned char i;
  48.         KeyValue_Info KeyValueInfo;
  49.         
  50.         //单键检测
  51.         for(i = 0; i < KeyCnt;i++)
  52.         {
  53.                 if(KeyInfo[i].useFlg == KEY_USE)
  54.                 {
  55.                         CheckKey((Key_Num)i,KeyInfo[i].mode);
  56.                 }               
  57.                 if(Get_keyValueX[i] == KEY_ON && Get_keyValue[i] == KEY_OFF && KeyGPFlag[i] == 0)
  58.                 {               
  59.                         if(KeyInfo[i].mode ==        KEY_CLOCK)
  60.                         {
  61. #if DEBUG_PRINTF
  62.                                 //printf("非连发模式:key%d按键已松开,键入时间为%dMs\r\n",(unsigned char)i+1,Get_keyChooseTimeCnt[i]);
  63. #endif
  64.                                 //短按
  65.                                 if((Get_keyChooseTimeCnt[i] != 0) && (Get_keyChooseTimeCnt[i] < LP_TIME) && (Get_keyChooseTimeCnt[i] >= SP_TIME))
  66.                                 {
  67.                                         KeyValueInfo.KeyNum = (Key_Num)i;
  68.                                         KeyValueInfo.KeyGpNum = (KeyGroup_Num)KeyGPCnt;
  69.                                         KeyValueInfo.KeyStatus = SP;
  70.                                         Write_RingStr(&Key_Value,(unsigned char *)&KeyValueInfo,sizeof(KeyValueInfo));

  71.                                 }               
  72.                                 //长按
  73.                                 else if((Get_keyChooseTimeCnt[i] != 0) && (Get_keyChooseTimeCnt[i] >= LP_TIME))
  74.                                 {
  75.                                         KeyValueInfo.KeyNum = (Key_Num)i;
  76.                                         KeyValueInfo.KeyGpNum = (KeyGroup_Num)KeyGPCnt;
  77.                                         KeyValueInfo.KeyStatus = LP;
  78.                                         Write_RingStr(&Key_Value,(unsigned char *)&KeyValueInfo,sizeof(KeyValue_Info));                                       
  79.                                 }                                       
  80.                         }
  81.                         
  82.                         else if (KeyInfo[i].mode ==        KEY_NOCLOCK)
  83.                         {
  84. #if DEBUG_PRINTF
  85.                                 //printf("连发模式:key%d按键键入时间为%dMs 自动连发时间:%dMs\r\n",(unsigned char)i+1,Get_keyChooseTimeCnt[i],KeyInfo[i].AutoTime);
  86. #endif
  87.                                 if(Get_keyChooseTimeCnt[i] != 0)
  88.                                 {
  89.                                         KeyValueInfo.KeyNum = (Key_Num)i;
  90.                                         KeyValueInfo.KeyGpNum = (KeyGroup_Num)KeyGPCnt;
  91.                                         KeyValueInfo.KeyStatus = LOOP;
  92.                                         Write_RingStr(&Key_Value,(unsigned char *)&KeyValueInfo,sizeof(KeyValue_Info));                                                
  93.                                 }        
  94.                         }
  95.                         
  96.                         Get_keyChooseTimeCnt[i] = 0;
  97.                 }        
  98.                 Get_keyValueX[i] = Get_keyValue[i];
  99.         }
  100.         
  101.         //组合检测
  102.         for(i = 0; i < KeyGPCnt;i++)
  103.         {
  104.                 if(KeyGpInfo[i].useFlg == KEYGP_USE)
  105.                 {
  106.                         if(KeyGpInfo[i].GetKeyNumStrict == KEYSTRICT_OFF)
  107.                                 CheckKeyGP_NoStrict((KeyGroup_Num)i,KeyGpInfo[i]);
  108.                         else if(KeyGpInfo[i].GetKeyNumStrict == KEYSTRICT_ON)
  109.                                 CheckKeyGP_Strict((KeyGroup_Num)i,KeyGpInfo[i]);
  110.                 }
  111.                 if(Get_keyGPStatusX[i] == KEYGP_OFF && Get_keyGPStatus[i] == KEYGP_ON)
  112.                 {        
  113. #if DEBUG_PRINTF
  114.                                 //printf("组合 %d已触发\r\n",(unsigned char)i+1);
  115. #endif
  116.                                 KeyValueInfo.KeyNum = (Key_Num)KeyCnt;
  117.                                 KeyValueInfo.KeyGpNum = (KeyGroup_Num)i;
  118.                                 KeyValueInfo.KeyStatus = 0xFF;
  119.                                 Write_RingStr(&Key_Value,(unsigned char *)&KeyValueInfo,sizeof(KeyValue_Info));

  120.                                 //完成一次组合,重置键值。
  121.                                 KeyGPStatusValueNow[i] = 0;

  122.                 }
  123.                 Get_keyGPStatusX[i] = Get_keyGPStatus[i];               
  124.         }
  125. }

  126. /* TIM1 init  PWM  function */
  127. void MX_TIM1_Init(void)
  128. {
  129.   TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  130.   TIM_MasterConfigTypeDef sMasterConfig = {0};
  131.   TIM_OC_InitTypeDef sConfigOC = {0};
  132.   TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};

  133.   htim1.Instance = TIM1;
  134.   htim1.Init.Prescaler = 60-1;
  135.   htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED2;
  136.   htim1.Init.Period = 1000;
  137.   htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  138.   htim1.Init.RepetitionCounter = 0;
  139.   htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  140.   if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
  141.   {
  142.     Error_Handler();
  143.   }
  144.   sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  145.   if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
  146.   {
  147.     Error_Handler();
  148.   }
  149.   if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
  150.   {
  151.     Error_Handler();
  152.   }
  153.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  154.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  155.   if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  156.   {
  157.     Error_Handler();
  158.   }
  159.   sConfigOC.OCMode = TIM_OCMODE_PWM1;
  160.   sConfigOC.Pulse = 500;
  161.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  162.   sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  163.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  164.   sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  165.   sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  166.   if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  167.   {
  168.     Error_Handler();
  169.   }
  170.   if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  171.   {
  172.     Error_Handler();
  173.   }
  174.   if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  175.   {
  176.     Error_Handler();
  177.   }
  178.   if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
  179.   {
  180.     Error_Handler();
  181.   }
  182.   sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
  183.   sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  184.   sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  185.   sBreakDeadTimeConfig.DeadTime = 0;
  186.   sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  187.   sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  188.   sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  189.   if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
  190.   {
  191.     Error_Handler();
  192.   }
  193.   HAL_TIM_MspPostInit(&htim1);

  194. }
复制代码
全部代码51hei下载地址:
STM32F103C8T6.7z (205.19 KB, 下载次数: 103)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:853896 发表于 2021-1-26 11:20 | 显示全部楼层
楼主,能上个原理图吗?还有,这个软件,keil下,能用吗?对于32位机,我是菜鸟,希望能多指教
回复

使用道具 举报

ID:403544 发表于 2021-1-28 16:32 | 显示全部楼层
ccnnzz315 发表于 2021-1-26 11:20
楼主,能上个原理图吗?还有,这个软件,keil下,能用吗?对于32位机,我是菜鸟,希望能多指教

不需要原理图  你只要有单片机板子 在程序里更改IO口即可使用 程序经过验证是没有问题的
回复

使用道具 举报

ID:403544 发表于 2021-1-28 16:32 | 显示全部楼层
ccnnzz315 发表于 2021-1-26 11:20
楼主,能上个原理图吗?还有,这个软件,keil下,能用吗?对于32位机,我是菜鸟,希望能多指教

就是基于KEIL的
回复

使用道具 举报

ID:717605 发表于 2021-5-16 21:42 | 显示全部楼层
下载了,学习一下组合按键。
回复

使用道具 举报

ID:528966 发表于 2022-11-22 11:02 | 显示全部楼层
刚接触STM32,谁给注释下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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