【Ubuntu VSCODE+GCC】CW32L031实现UART控制LED

描述

【目的】实现UART发送命令控制板载LED灯

一、复制一份工种到新的文件夹:sudo cp -r cw32l031_uart cw32l031_uart_iqr,然后给新的文件夹赋予读写权限:sudo chmod 777 -R cw32l031_uart_iqr/

二、用VSCode打开该工程文件夹

GPIO

三、在usre_uart.c中增加中断的配置

NVIC_SetPriority(UART1_IRQn, 0); //优先级,无优先级分组

NVIC_EnableIRQ(UART1_IRQn); //UARTx中断使能

四、修改中断函数

主要的思路是:

1、如果进入了中断,首先判断是不是UART1的接收中断,如果是则接收一个字节数的数据。

2、如果接收超过了最长长度,则计数归零,如果接收到了’\\n’说明接收一次数据完成,更新标志位。

3、清除接收标志位。

void UART1_IRQHandler(void)

{

/* USER CODE BEGIN */

if(USART_GetITStatus(CW_UART1, USART_IT_RC) != RESET) // 获取UARTx中断标志位

{

    rx_buff[rx_cnt] = USART_ReceiveData_8bit(CW_UART1); 

    //如果接收达到上限,则回到0

    if(rx_buff[rx_cnt] == '\\n')

    {

        rx_state = 1;

    }

    if(rx_cnt < UART_RX_MAX_LEN)

    {

        rx_cnt ++;

    }

    else

    {

        rx_cnt = 0;

    }

    USART_ClearITPendingBit(CW_UART1, USART_IT_RC);

}

/* USER CODE END */

}

五、要main主函数中,我们判断是否接收完数据,如果接收完数据,则进来判断,如果是LED_ON则点亮LED灯,如果是LED_OFF则关断LED灯。

Main主函数代码如下:

int main(void)

{

LED_Init();

LogInit();

USART_ITConfig(CW_UART1, USART_IT_RC, ENABLE);

InitTick(24000000ul); //初始化SysTick

// 开启两线调试接口

RCC_SWDIO_Config(RCC_SYSCTRL_SWDIOEN);

printf("start\\r\\n");

while (1)

{

    if(rx_state == 1)

    {

        printf("recv: %s\\r\\n", rx_buff);

        rx_state = 0;

        rx_cnt = 0;

        if (rx_buff[0] == 'L' && \\

            rx_buff[1] == 'E' && \\

            rx_buff[2] == 'D' && \\

            rx_buff[3] == '_' && \\

            rx_buff[4] == 'O' && \\

            rx_buff[5] == 'N'  )

        {

            GPIO_WritePin(CW_GPIOC, GPIO_PIN_13, GPIO_Pin_RESET);

        }

        else if (/* condition */rx_buff[0] == 'L' && \\

            rx_buff[1] == 'E' && \\

            rx_buff[2] == 'D' && \\

            rx_buff[3] == '_' && \\

            rx_buff[4] == 'O' && \\

            rx_buff[5] == 'F' && \\

            rx_buff[6] == 'F' )

        {

            GPIO_WritePin(CW_GPIOC, GPIO_PIN_13, GPIO_Pin_SET);

        }

        memset(rx_buff, 0, UART_RX_MAX_LEN);

    }

    // GPIO_TogglePin(CW_GPIOC, GPIO_PIN_13);

    SysTickDelay(10);

}



return 0;

}

实验效果,发送LED_ON板载的LED亮,发送LED_OFF板载的LED关断。同时打印出发送的内容。

GPIO
  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分