[开发资料] 【Ubuntu VSCODE+GCC】CW32L031实现UART控制LED

[复制链接]
 楼主| lulugl 发表于 2023-6-28 17:26 | 显示全部楼层 |阅读模式
#申请原创# #有奖活动#

【目的】实现UART发送命令控制板载LED灯
一、复制一份工种到新的文件夹:sudo cp -r cw32l031_uart  cw32l031_uart_iqr,然后给新的文件夹赋予读写权限:sudo chmod 777 -R cw32l031_uart_iqr/
二、用VSCode打开该工程文件夹
10c63d540e4daaae5fb0685aba3d85d0
三、在usre_uart.c中增加中断的配置

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

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

四、修改中断函数
主要的思路是:
1、如果进入了中断,首先判断是不是UART1的接收中断,如果是则接收一个字节数的数据。
2、如果接收超过了最长长度,则计数归零,如果接收到了’\n’说明接收一次数据完成,更新标志位。
3、清除接收标志位。
  1. void UART1_IRQHandler(void)

  2. {

  3. /* USER CODE BEGIN */

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

  5. {

  6. rx_buff[rx_cnt] = USART_ReceiveData_8bit(CW_UART1);

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

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

  9. {

  10. rx_state = 1;

  11. }

  12. if(rx_cnt < UART_RX_MAX_LEN)

  13. {

  14. rx_cnt ++;

  15. }

  16. else

  17. {

  18. rx_cnt = 0;

  19. }

  20. USART_ClearITPendingBit(CW_UART1, USART_IT_RC);

  21. }

  22. /* USER CODE END */

  23. }

五、在main主函数中,我们判断是否接收完数据,如果接收完数据,则进来判断,如果是LED_ON则点亮LED灯,如果是LED_OFF则关断LED灯。
Main主函数代码如下:
  1. int main(void)

  2. {

  3. LED_Init();

  4. LogInit();

  5. USART_ITConfig(CW_UART1, USART_IT_RC, ENABLE);

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

  7. // 开启两线调试接口

  8. RCC_SWDIO_Config(RCC_SYSCTRL_SWDIOEN);

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

  10. while (1)

  11. {

  12. if(rx_state == 1)

  13. {

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

  15. rx_state = 0;

  16. rx_cnt = 0;

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

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

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

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

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

  22. rx_buff[5] == 'N' )

  23. {

  24. GPIO_WritePin(CW_GPIOC, GPIO_PIN_13, GPIO_Pin_RESET);

  25. }

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

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

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

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

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

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

  32. rx_buff[6] == 'F' )

  33. {

  34. GPIO_WritePin(CW_GPIOC, GPIO_PIN_13, GPIO_Pin_SET);

  35. }

  36. memset(rx_buff, 0, UART_RX_MAX_LEN);

  37. }

  38. // GPIO_TogglePin(CW_GPIOC, GPIO_PIN_13);

  39. SysTickDelay(10);

  40. }

  41. return 0;

  42. }

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

评论

@pssyx :USB-TTL是接的win10下面的。  发表于 2023-6-29 10:14
@pssyx :linux是windows下地虚拟机。  发表于 2023-6-29 10:13
为何Linux下编程,测试又回到了windows?Linux下串口终端不也很好吗?  发表于 2023-6-29 09:20
您需要登录后才可以回帖 登录 | 注册

本版积分规则

180

主题

830

帖子

12

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