zoukankan      html  css  js  c++  java
  • STM32CubeMX+串口通信控制led

    基础配置见https://www.cnblogs.com/jsit-dj-it/p/11967153.html

    一、配置USART外设的工作参数

     

    二、生成代码

    在main.c编写业务逻辑代码

    /* USER CODE BEGIN 4 */
    void USER_UART_IRQHandler(UART_HandleTypeDef *huart)
    {       /*__HAL_UART_GET_FLAG  获取 SR 寄存器标志位状态
                UART_FLAG_RXNE  接受数据寄存器非空标志位
                UART_FLAG_RXNE  (0x1UL << USART_SR_RXNE_Pos)        /*!< 0x00000020 */
                UART_RX_STATE_READY=0x00自定义
                
            */
            //接收数据
        if ((__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET))
        {     
                    //接收到一帧中的第一个字节
            if (uart1RxState == UART_RX_STATE_READY)
            {
                uart1RxState = UART_RX_STATE_START; 
                __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
                 uart1RxCounter = 0; 
                uart1RxBuf[uart1RxCounter] = (uint8_t)(huart1.Instance->DR & (uint8_t)0x00FF); 
                uart1RxCounter++; 
            }
            else if (uart1RxState == UART_RX_STATE_START)
            {
                uart1RxBuf[uart1RxCounter] = (uint8_t)(huart1.Instance->DR & (uint8_t)0x00FF); 
                uart1RxCounter++;   
            }
            __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); 
        }
        if ((__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE) != RESET))//进入空闲中断
        {
            __HAL_UART_DISABLE_IT(&huart1, UART_IT_IDLE); //关了空闲中断
            __HAL_UART_DISABLE_IT(&huart1, UART_IT_RXNE); //关了接收完成中断
            uart1RxState = UART_RX_STATE_DEAL;   //状态表明一帧数据接收完成了,需要处理。处理完以后再把接收中断打开
        }
    }
    
    /* USER CODE END 4 */     

    流水灯显示代码

    if(uart1RxState == UART_RX_STATE_DEAL)
            {
                if(strstr((const char *)uart1RxBuf, stringMode1) != NULL)
                {
                    printf("I'm in mode_1!
    ");
                    ledMode = 1; 
                }
                else if(strstr((const char *)uart1RxBuf, stringMode2) != NULL)
                {
                    printf("I'm in mode_2!
    ");
                    ledMode = 2;
                }
                else if(strstr((const char *)uart1RxBuf, stringStop) != NULL)
                {
                    printf("I'm stop!
    "); 
                    ledMode = 0; 
                }
                __HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
                uart1RxState = UART_RX_STATE_READY; 
                uart1RxCounter = 0; 
                memset(uart1RxBuf, 0, UART1_RCV_MAX); 
            }
            
            switch (ledMode) 
            {
                case 1: 
                    LED_State_Set(LED_value); 
                  LED_value = cror(LED_value, 1); 
                  HAL_Delay(1000);
                    break;
                case 2: 
                    LED_State_Set(LED_value); 
                  LED_value = crol(LED_value, 1); 
                  HAL_Delay(1000);
                    break;
                case 0:
                    LED_value = 0xFF;
                  LED_State_Set(LED_value);
                  break;
                default:
                    break;   
            }

    流水灯

    /* USER CODE BEGIN 0 */
    uint8_t cror(uint8_t numbers, uint8_t bits) 
    {
        uint8_t right = numbers >> bits; 
        uint8_t left = numbers << (8 - bits); 
        uint8_t temp = left | right; 
         return temp; 
    }
    
    uint8_t crol(uint8_t numbers, uint8_t bits)
    {
        uint8_t right = numbers << bits; 
        uint8_t left = numbers >> (8 - bits); 
        uint8_t temp = left | right; 
        return temp; 
    }
    
    void LED_State_Set(uint8_t numbers)
    {
        HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin,
        ((numbers & 0x01) >> 0) ? GPIO_PIN_SET : GPIO_PIN_RESET);
        
        HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin,
        ((numbers & 0x02) >> 1) ? GPIO_PIN_SET : GPIO_PIN_RESET);
        
        HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin,
        ((numbers & 0x04) >> 2) ? GPIO_PIN_SET : GPIO_PIN_RESET);
        
        HAL_GPIO_WritePin(LED4_GPIO_Port, LED4_Pin,
        ((numbers & 0x08) >> 3) ? GPIO_PIN_SET : GPIO_PIN_RESET);
        
        HAL_GPIO_WritePin(LED5_GPIO_Port, LED5_Pin,
        ((numbers & 0x10) >> 4) ? GPIO_PIN_SET : GPIO_PIN_RESET);
        
        HAL_GPIO_WritePin(LED6_GPIO_Port, LED6_Pin,
        ((numbers & 0x20) >> 5) ? GPIO_PIN_SET : GPIO_PIN_RESET);
        
        HAL_GPIO_WritePin(LED7_GPIO_Port, LED7_Pin,
        ((numbers & 0x40) >> 6) ? GPIO_PIN_SET : GPIO_PIN_RESET);
        
        HAL_GPIO_WritePin(LED8_GPIO_Port, LED8_Pin,
        ((numbers & 0x80) >> 7) ? GPIO_PIN_SET : GPIO_PIN_RESET);
    }
    
    /* USER CODE END 0 */

  • 相关阅读:
    笔记35 跨重定向请求传递数
    判断邮箱的正则表达式
    按钮
    async await 的用法
    笔记34 Spring MVC的高级技术——处理multipart形式的数据
    Convert Sorted Array to Binary Search Tree
    Binary Tree Zigzag Level Order Traversal
    Unique Binary Search Trees,Unique Binary Search Trees II
    Validate Binary Search Tree
    Populating Next Right Pointers in Each Node,Populating Next Right Pointers in Each Node II
  • 原文地址:https://www.cnblogs.com/jsit-dj-it/p/11967342.html
Copyright © 2011-2022 走看看