- #ifndef BSP_INC_USART_H_
- #define BSP_INC_USART_H_
- #include "ch32v10x_conf.h"
- #define RXNUM 20
- #define YES 1
- #define NO 0
- volatile uint8_t RXFLAG;
- uint8_t USART_RXBUFF[RXNUM];
- void WCH_USART_Configure(void);
- void WCH_USART_SendByte(USART_TypeDef* pUSARTx, uint8_t data);
- void WCH_USART_SendString(USART_TypeDef* pUSARTx, char *str);
- void USART2_IRQHandler(void);
- #endif /* BSP_INC_USART_H_ */
3.在usart.c文件里面编写相关IO、时钟、usart外设、中断等的配置和初始化函数等。
- #include "usart.h"
- #include "led.h"
- void USART2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
- void WCH_USART_Configure(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //使能串口2时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟
- USART_DeInit(USART2);
- /* USART2 TX-->A.2 RX-->A.3 */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置PA2为复用推挽输出
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设置PA3为浮空输入
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- USART_InitStructure.USART_BaudRate = 115200; //设置串口波特率为115200
- USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长为8位数据格式
- USART_InitStructure.USART_StopBits = USART_StopBits_1; //1个停止位
- USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件流控制
- USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; //发送和接收模式
- USART_Init(USART2, &USART_InitStructure); //初始化串口
- NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1; //抢占优先级为1
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级为1
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
- NVIC_Init(&NVIC_InitStructure); //中断优先级初始化
- USART_Cmd(USART2, ENABLE); //使能串口
- USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //开启中断
- }
- void WCH_USART_SendByte(USART_TypeDef* pUSARTx, uint8_t data)
- {
- USART_SendData(pUSARTx, data);
- while(USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
- }
- void WCH_USART_SendString(USART_TypeDef* pUSARTx, char *str)
- {
- uint8_t i = 0;
- do
- {
- WCH_USART_SendByte(pUSARTx, *(str+i));
- i++;
- }while(*(str+i) != '\0');
- while(USART_GetFlagStatus(pUSARTx, USART_FLAG_TC) == RESET);
- }
- void USART2_IRQHandler(void)
- {
- static uint8_t i=0;
- uint8_t RxTemp;
- if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //中断产生
- {
- USART_ClearITPendingBit(USART2, USART_IT_RXNE); //清除中断标志
- RxTemp = USART_ReceiveData(USART2); //接收数据
- USART_SendData(USART2, RxTemp); //发送数据
- if(RxTemp == '\r')
- {
- WCH_USART_SendString(USART2, "\r\n");
- USART_RXBUFF[i] = '\0';
- RXFLAG = YES;
- i = 0;
- }
- else
- {
- USART_RXBUFF[i++] = RxTemp;
- }
- if(i == RXNUM) i = 0;
- }
- }
4.在Main函数中循环判断USART2接收的命令并执行
- #include <stdio.h>
- #include <string.h>
- #include "debug.h"
- #include "led.h"
- #include "usart.h"
- /* Global typedef */
- /* Global define */
- /* Global Variable */
- /*******************************************************************************
- * Function Name : main
- * Description : Main program.
- * Input : None
- * Return : None
- *******************************************************************************/
- int main(void)
- {
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
- Delay_Init();
- LED_Init();
- WCH_USART_Configure();
- RXFLAG = NO;
- WCH_USART_SendString(USART2, "This is LED Test!\r\n");
- while(1)
- {
- if(RXFLAG == YES)
- {
- if(strcmp(USART_RXBUFF,"LED1_ON") == 0)
- LED1_ON();
- else if(strcmp(USART_RXBUFF,"LED1_OFF") == 0)
- LED1_OFF();
- else if(strcmp(USART_RXBUFF,"LED2_ON") == 0)
- LED2_ON();
- else if(strcmp(USART_RXBUFF,"LED2_OFF") == 0)
- LED2_OFF();
- else WCH_USART_SendString(USART2, "The Command is Fault!\r\n");
- RXFLAG = NO;
- }
- }
- }