查看: 1740|回复: 0
收起左侧

第七十七章:CH32V103应用教程——USART-指令控制LED灯

[复制链接]

  离线 

  • TA的每日心情
    慵懒
    2021-7-23 17:16
  • 签到天数: 17 天

    [LV.4]

    发表于 2021-5-1 15:37:42 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 草帽王子 于 2021-9-10 18:11 编辑

    本章教程主要在第二章GPIO和第三章USART的基础上进行串口指令控制LED灯实验。


    1、USART简介及相关函数介绍

    关于USART相关介绍,在前面第三章以及第六十一章到第六十七章已经进行过相关介绍,在此不再赘述。


    2、硬件设计

    由于CH32V103系列MCU的串口1在debug文件中被用于调试打印,因此本次教程使用串口2进行收发验证。由CH32V103数据手册可知,串口2对应引脚为PA2和PA3引脚,PA2为USART2_TX,PA3为USART2_RX。使用杜邦线将WCH-Link模块与CH32V103开发板串口2连接起来,连接方式如下:
    • WCH-Link模块RX引脚与CH32V103开发板PA2引脚连接;
    • WCH-Link模块TX引脚与CH32V103开发板PA3引脚连接。

    此外,由于需要用到LED灯,用两根杜邦线分别将LED1和LED2与对应GPIO引脚连接起来,此处连接方式为:
    • LED1与PA0连接;
    • LED2与PA1连接。


    3、软件设计

    本章教程主要在第二章和第三章基础上进行。其中,LED灯对应GPIO程序不变,主要对串口程序进行了修改,具体程序如下:
    usart.h文件
    1. #ifndef __USART_H
    2. #define __USART_H

    3. #include "ch32v10x_conf.h"

    4. void USART2_Printf_Init(uint32_t baudrate);
    5. void USARTx_SendByte(USART_TypeDef* pUSARTx, uint8_t data);
    6. void USARTx_SendStr(USART_TypeDef* pUSARTx, char *str);

    7. #endif
    复制代码
    usart.h文件主要进行相关定义和函数声明;
    usart.c文件

    1. #include "usart.h"

    2. /*******************************************************************************
    3. * Function Name  : USART_Printf_Init
    4. * Description    : Initializes the USARTx peripheral.
    5. * Input          : baudrate: USART communication baud rate.
    6. * Return         : None
    7. *******************************************************************************/
    8. void USART2_Printf_Init(uint32_t baudrate)
    9. {
    10.   GPIO_InitTypeDef GPIO_InitStructure;
    11.   USART_InitTypeDef USART_InitStructure;

    12.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
    13.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    14.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    15.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    16.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    17.   GPIO_Init(GPIOA, &GPIO_InitStructure);

    18.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    19.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    20.   GPIO_Init(GPIOA, &GPIO_InitStructure);

    21.   USART_InitStructure.USART_BaudRate = baudrate;
    22.   USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    23.   USART_InitStructure.USART_StopBits = USART_StopBits_1;
    24.   USART_InitStructure.USART_Parity = USART_Parity_No;
    25.   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    26.   USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;

    27.   USART_Init(USART2, &USART_InitStructure);
    28.   USART_Cmd(USART2, ENABLE);
    29. }

    30. void USARTx_SendByte(USART_TypeDef* pUSARTx, uint8_t data)
    31. {
    32.     USART_SendData(pUSARTx, data);
    33.     while(USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
    34. }

    35. void USARTx_SendStr(USART_TypeDef* pUSARTx, char *str)
    36. {
    37.     uint8_t i = 0;
    38.     do
    39.     {
    40.        USARTx_SendByte(pUSARTx, *(str+i));
    41.        i++;
    42.     }while(*(str+i) != '\0');
    43.     while(USART_GetFlagStatus(pUSARTx, USART_FLAG_TC) == RESET);
    44. }

    45. int _write(int fd, char *buf, int size)
    46. {
    47.   int i;

    48.   for(i=0; i<size; i++)
    49.   {
    50.     while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
    51.     USART_SendData(USART2, *buf++);
    52.   }

    53.   return size;
    54. }
    复制代码
    usart.c文件相较于第三章,主要增加了一个缓冲区数据,同时在中断服务函数中针对数据发送和接收进行了相关改动,将接收数据先放在缓冲区数组然后发送出来。
    main.c文件

    1. #include "debug.h"
    2. #include "usart.h"
    3. #include "led.h"

    4. u16 ch;

    5. /*******************************************************************************
    6. * Function Name  : main
    7. * Description    : Main program.
    8. * Input          : None
    9. * Return         : None
    10. *******************************************************************************/
    11. int main(void)
    12. {
    13.     LED_Init();

    14.     USART2_Printf_Init(115200);

    15.     printf("\r\n通过串口通信指令控制LED灯 \n");
    16.     printf("开发板接到指令后控制LED灯亮灭,指令对应如下:\n");
    17.     printf("   指令   ----  LED灯号 \n");
    18.     printf("     1  ----  LED1亮 \n");
    19.     printf("     2  ----  LED2亮 \n");
    20.     printf("     3  ----  灯全灭  \n");

    21.     while(1)
    22.     {
    23.       //获取字符指令
    24.       while (USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET);

    25.       ch = USART_ReceiveData(USART2);

    26.       switch(ch)
    27.       {
    28.         case '1':
    29.             printf("接收到字符:ch=%c\n",ch);
    30.             GPIO_ResetBits(GPIOA,GPIO_Pin_0);
    31.             break;

    32.         case '2':
    33.             printf("接收到字符:ch=%c\n",ch);
    34.             GPIO_ResetBits(GPIOA,GPIO_Pin_1);
    35.             break;

    36.         case '3':
    37.             printf("接收到字符:ch=%c\n",ch);
    38.             GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1);
    39.             break;

    40.         default:
    41.           /* 如果不是指定指令字符,打印提示信息 */
    42.           printf("非指定指令\n");
    43.           break;
    44.       }
    45.     }
    46. }
    复制代码
    main.c文件主要进行函数初始化,并根据串口指令执行相应操作。


    4、下载验证

    将编译好的程序下载到开发板,打开串口调试助手,将开发板复位,可以串口打印显示相关信息,根据提示信息发送相关指令,可以控制LED灯,同时串口打印显示相关信息:
    CH32V CH573单片机芯片-第七十七章:CH32V103应用教程——USART-指令控制LED灯risc-v单片机中文社区(1)

    76、USART-指令控制LED灯.rar
    CH32V CH573单片机芯片-第七十七章:CH32V103应用教程——USART-指令控制LED灯risc-v单片机中文社区(2) 76、USART-指令控制LED灯.rar (473.31 KB, 下载次数: 21)
    链接:https://pan.baidu.com/s/1JMVP6eNSzTZl4rUXO5FX2w
    提取码:piqx
    复制这段内容后打开百度网盘手机App,操作更方便哦





    上一篇:第七十六章:CH32V103应用教程——USART-数据收发(带缓冲区)
    下一篇:第七十八章:CH32V103应用教程——USART-空闲中断
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条



    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-11-26 10:03 , Processed in 0.333976 second(s), 46 queries .

    快速回复 返回顶部 返回列表