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

【Nucleo-F303RE开发】分享个自己写的串口控制Led程序  

[复制链接]
lkl0305 提问时间:2015-5-28 23:30 /
在上一篇(UART中断发送数据)中,解决了UART串口中断发送接收数据问题后。今天给大家分享一个简单的串口控制板上的led的程序了。

里面用到的串口中断发送数据的方法可以看我的另一个帖子:
【Nucleo-F303RE开发】UART中断发送数据
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=601861&fromuid=336767
(出处: 意法半导体STM32/STM8技术社区)

一、功能描述:
本次要做的是一个简单的是用串口控制Nucleo-F303RE上LED的亮灭,具体功能描述如下:
1、首先Nucleo-F303RE向电脑发送提示信息:
301.jpg
2、可以看到目前可以使用的命令,可以在下面发送框中输入命令(必须为10字节的命令,程序问题,否则就会出错,还没有完善):

3、可以在下图中看到,输入要指令的命令,将Led点亮,然后可以看到串口返回执行正常信息。
302.jpg
4、输入查询命令,显示新的状态为亮
303.jpg
5、依次可以输入其他命令,下图是反转命令,没执行一次,Led灯的状态就改变一次::
304.jpg
6、如果输入错误指令,就会提示指令输入错误:
305.jpg
大家在使用程序时,一定要注意发送命令只能为10字节,命令后不能有回车等其他字符!不然就会执行错误,也算是个小bug吧,没有修改


二、程序分析:
主要程序分析,其实功能很简单,来看看主函数:
  1. int main(void)
  2. {

  3.   /* USER CODE BEGIN 1 */

  4.   /* USER CODE END 1 */

  5.   /* MCU Configuration----------------------------------------------------------*/

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

  8.   /* Configure the system clock */
  9.   SystemClock_Config();

  10.   /* Initialize all configured peripherals */
  11.   MX_GPIO_Init();
  12.   MX_USART2_UART_Init();

  13.   /* USER CODE BEGIN 2 */

  14.   /* USER CODE END 2 */

  15.   /* Infinite loop */
  16.   /* USER CODE BEGIN WHILE */
  17.   while (1)
  18.   {
  19.     HAL_UART_Transmit_IT(&huart2, (uint8_t *)TxBuffer, TXBUFFERSIZE);         //发送提示信息
  20.     while (UartReady != SET)
  21.     {
  22.       ;
  23.     }
  24.    
  25.     UartReady = RESET;
  26.    
  27.     HAL_UART_Receive_IT(&huart2, (uint8_t *)RxBuffer, RXBUFFERSIZE);        //串口接收命令
  28.    
  29.     while (UartReady != SET)
  30.     {
  31.       ;
  32.     }
  33.    
  34.     UartReady = RESET;
  35.    
  36.     switch (CommandHandle((uint8_t *)RxBuffer))               //根据串口接收的命令执行相应的命令,然后根据结果返回提示
  37.     {
  38.       case 0:          //返回不可识别的命令
  39.         HAL_UART_Transmit_IT(&huart2, (uint8_t *)"不能识别的命令!\n\n\n", COUNTOF("不能识别的命令!\n\n\n"));
  40.         break;
  41.       case 1:      //返回执行正常命令
  42.         HAL_UART_Transmit_IT(&huart2, (uint8_t *)"执行正常!\n\n\n", COUNTOF("执行正常!\n\n\n"));
  43.         break;
  44.       case 2:       //返回Led状态为亮信息
  45.         HAL_UART_Transmit_IT(&huart2, (uint8_t *)"LED状态为:亮!\n\n\n", COUNTOF("LED状态为:亮!\n\n\n"));
  46.         break;
  47.       case 3:       //返回Led状态为灭信息
  48.         HAL_UART_Transmit_IT(&huart2, (uint8_t *)"LED状态为:灭!\n\n\n", COUNTOF("LED状态为:灭!\n\n\n"));
  49.         break;
  50.       default:
  51.         ;
  52.     }
  53.     while (UartReady != SET)
  54.     {
  55.       ;
  56.     }
  57.    
  58.     UartReady = RESET;
  59.    
  60.   /* USER CODE END WHILE */

  61.   /* USER CODE BEGIN 3 */

  62.   }
  63.   /* USER CODE END 3 */

  64. }
复制代码

其中根据命令执行控制灯程序为:
  1. <p>static uint16_t Commandcmp(uint8_t* pCommand1, uint8_t* pCommand2, uint16_t CommandLength) //命令比较函数,其实字符串比较
  2. {
  3.   while (CommandLength)
  4.   {
  5.     if ((*pCommand1) != *pCommand2)
  6.     {
  7.       return CommandLength;
  8.     }
  9.     pCommand1++;
  10.     pCommand2++;</p><p>    CommandLength--;
  11.   }
  12.   return 0;
  13. }

  14. static uint16_t CommandHandle(uint8_t* Command)    //命令处理
  15. {
  16.   if (Commandcmp(Command, (uint8_t *)Command_Lib[0], RXBUFFERSIZE) == 0)   //亮灯
  17.   {
  18.     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
  19.     return 1;
  20.   }
  21.   else if (Commandcmp(Command, (uint8_t *)Command_Lib[1], RXBUFFERSIZE) == 0)  //灭灯
  22.   {
  23.     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
  24.     return 1;
  25.   }
  26.   else if (Commandcmp(Command, (uint8_t *)Command_Lib[2], RXBUFFERSIZE) == 0)  //反转灯
  27.   {
  28.     HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
  29.     return 1;
  30.   }
  31.   else if (Commandcmp(Command, (uint8_t *)Command_Lib[3], RXBUFFERSIZE) == 0)  //查询状态
  32.   {
  33.     if ((GPIOA->ODR & GPIO_PIN_5) != (uint32_t)GPIO_PIN_RESET)
  34.     {
  35.       return 2; //亮
  36.     }
  37.     else
  38.     {
  39.       return 3;//灭
  40.     }
  41.   }
  42.   else
  43.   {
  44.     return 0;//无法识别命令
  45.   }
  46. }</p>
复制代码

最后上一下整个工程:
UART_LED.rar (6.75 MB, 下载次数: 363)
收藏 3 评论20 发布时间:2015-5-28 23:30

举报

20个回答
你好我好大家好! 回答时间:2015-5-29 00:18:58
学习了               
lkl0305 回答时间:2015-5-29 10:59:00

多谢打赏继续努力
lkl0305 回答时间:2015-5-29 08:11:14

多谢支持
Paderboy 回答时间:2015-5-28 23:37:56
多谢分享
风子 回答时间:2015-5-28 23:57:31
占个前排
shao150933 回答时间:2015-5-28 23:59:06
不错,快来围观
为什么是EEFOCUS小白 回答时间:2015-5-29 08:50:11
谢谢分享      
沐紫 回答时间:2015-5-29 10:02:56
20金币已奖励
summersick 回答时间:2016-1-29 14:56:59
多谢分享!
hxl520521 回答时间:2017-6-15 21:20:24
stm32f103zet6能直接用吗
epochal 回答时间:2017-6-15 22:37:35
谢谢分享!
流芷静兰 回答时间:2017-12-25 16:18:17
ヾ(≧∇≦谢谢≧∇≦)ノ楼主~~·
xiaoouyang 回答时间:2018-7-14 15:51:14
谢谢帮助很大
ainrnd 回答时间:2018-7-17 09:00:24
学习学习
12下一页

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版