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

查看: 5394|回复: 20

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

  [复制链接]

40

主题

1595

回帖

1

蝴蝶豆

论坛元老

最后登录
2018-7-23
发表于 2015-5-28 23:30:53 | 显示全部楼层 |阅读模式
在上一篇(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, 下载次数: 362)
回复

使用道具 举报

47

主题

3404

回帖

30

蝴蝶豆

版主

最后登录
2020-12-7
发表于 2015-5-28 23:37:56 | 显示全部楼层
多谢分享
回复 支持 反对

使用道具 举报

33

主题

1243

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-3-9
发表于 2015-5-28 23:57:31 | 显示全部楼层
占个前排
回复 支持 反对

使用道具 举报

0

主题

14

回帖

0

蝴蝶豆

初级会员

最后登录
2018-1-23
发表于 2015-5-28 23:59:06 来自手机 | 显示全部楼层
不错,快来围观
回复 支持 反对

使用道具 举报

57

主题

1159

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-12-6
发表于 2015-5-29 00:18:58 | 显示全部楼层
学习了               
回复 支持 反对

使用道具 举报

40

主题

1595

回帖

1

蝴蝶豆

论坛元老

最后登录
2018-7-23
 楼主| 发表于 2015-5-29 08:11:14 | 显示全部楼层

多谢支持
回复 支持 反对

使用道具 举报

26

主题

492

回帖

0

蝴蝶豆

金牌会员

最后登录
2018-11-11
发表于 2015-5-29 08:50:11 | 显示全部楼层
谢谢分享      
回复 支持 反对

使用道具 举报

307

主题

3125

回帖

0

蝴蝶豆

论坛元老

最后登录
2020-7-17
发表于 2015-5-29 10:02:56 | 显示全部楼层
20金币已奖励
回复 支持 反对

使用道具 举报

40

主题

1595

回帖

1

蝴蝶豆

论坛元老

最后登录
2018-7-23
 楼主| 发表于 2015-5-29 10:59:00 | 显示全部楼层

多谢打赏继续努力
回复 支持 反对

使用道具 举报

0

主题

2

回帖

0

蝴蝶豆

新手上路

最后登录
2016-1-29
发表于 2016-1-29 14:56:59 | 显示全部楼层
多谢分享!
回复 支持 反对

使用道具 举报

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