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!\r\n");
                ledMode = 1; 
            }
            else if(strstr((const char *)uart1RxBuf, stringMode2) != NULL)
            {
                printf("I'm in mode_2!\r\n");
                ledMode = 2;
            }
            else if(strstr((const char *)uart1RxBuf, stringStop) != NULL)
            {
                printf("I'm stop!\r\n"); 
                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 */

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM