[STM32F3] F303RE串口控制led

[复制链接]
1397|2
 楼主| 史迪威将军 发表于 2016-1-30 15:31 | 显示全部楼层 |阅读模式
一、功能描述:
本次要做的是一个简单的是用串口控制Nucleo-F303RE上LED的亮灭,具体功能描述如下:
1、首先Nucleo-F303RE向电脑发送提示信息:

2、可以看到目前可以使用的命令,可以在下面发送框中输入命令(必须为10字节的命令,程序问题,否则就会出错,还没有完善):

3、可以在下图中看到,输入要指令的命令,将Led点亮,然后可以看到串口返回执行正常信息。

4、输入查询命令,显示新的状态为亮

5、依次可以输入其他命令,下图是反转命令,没执行一次,Led灯的状态就改变一次::

6、如果输入错误指令,就会提示指令输入错误:

大家在使用程序时,一定要注意发送命令只能为10字节,命令后不能有回车等其他字符!不然就会执行错误,也算是个小bug吧,没有修改

 楼主| 史迪威将军 发表于 2016-1-30 15:32 | 显示全部楼层
二、程序分析:
主要程序分析,其实功能很简单,来看看主函数:
  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>
奥德赛 发表于 2016-1-30 16:11 | 显示全部楼层
串口用的是中断模式还是扫描模式呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

291

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部