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

查看: 5423|回复: 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版