[CH582M入门第二步]USART串口配置,串口重定向

本文介绍了CH582M串口的基础配置,包括波特率、停止位和奇偶校验位的设置,并详细讲解了如何在Mou你River Studio中添加自定义文件及头文件。此外,分享了串口重定向的代码实现,该方法基于STM32的HAL库改编,为全网独有。实际操作中,串口收发功能正常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档



提示:以下是本篇文章正文内容,下面案例可供参考

一、CH582串口配置

1.什么是串口

串口是你玩单片机必须会的一个通信协议,也是比较简单的协议,主要配置一下波特率、停止位、奇偶校验位等。注意串口和MCU上面的波特率必须一致,不然会出现乱码的情况。

2.非常重要怎么在Mou你River Studio里添加我们自己写的文件

首先是把我们写的文件放到我们写的项目的文件夹里
在这里插入图片描述
然后是添加源文件第一步是右击 然后选择我们添加的文件
在这里插入图片描述
然后添加成功是这样的
在这里插入图片描述

再让后那就是添加头文件
首先是点击属性
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

添加头文件完成

3.CH582M的串口配置

废话不多说上代码

首先是USART.h

#ifndef __USART_H
#define __USART_H
#include "CH58x_common.h"
#include "stdio.h"

#define USART1_RX  GPIO_Pin_8
#define USART1_TX  GPIO_Pin_9

extern uint8_t TxBuff[];
extern uint8_t RxBuff[100];
extern uint8_t trigB;


void USART_Init(uint32_t but);
void Rx_Buff_poll();
#endif

然后是USART.c

#include "USART.h"
//-----------------------串口重定向_Begin-----------------------
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
//-----------------------串口重定向_End-----------------------

uint8_t TxBuff[]="";
uint8_t RxBuff[100];
uint8_t trigB;


static void USART_GPIO_Init(void){ //串口引脚初始化

    GPIOA_SetBits(USART1_TX);
    GPIOA_ModeCfg(USART1_RX, GPIO_ModeIN_PU);      // RXD-配置上拉输入
    GPIOA_ModeCfg(USART1_TX, GPIO_ModeOut_PP_5mA); // TXD-配置推挽输出,注意先让IO口输出高电平

}

void USART_Init(uint32_t but){ //串口的初始化
    USART_GPIO_Init();
    UART1_DefInit(); //串口常规配置
    UART1_BaudRateCfg(but);
#if 1 // 中断方式:接收数据后发送出去
    UART1_ByteTrigCfg(UART_7BYTE_TRIG);
    trigB = 7;
    UART1_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_LINE_STAT);
    PFIC_EnableIRQ(UART1_IRQn);
#endif

}
//-----------------------串口重定向_Begin-----------------------
PUTCHAR_PROTOTYPE 
{
    UART1_SendString(TxBuff, sizeof(TxBuff));
    return TxBuff;
}
//-----------------------串口重定向_End-----------------------

void Rx_Buff_poll(){  // 查询方式:接收数据后发送出去
#if 1 
    uint8_t len;
    while(1)
    {
        len = UART1_RecvString(RxBuff);
        if(len)
        {
            UART1_SendString(RxBuff, len);
        }
    }

#endif


}

/*********************************************************************
 * @fn      UART1_IRQHandler
 *
 * @brief   UART1中断函数
 *
 * @return  none
 */
__INTERRUPT
__HIGH_CODE
void UART1_IRQHandler(void)
{
    volatile uint8_t i;

    switch(UART1_GetITFlag())
    {
        case UART_II_LINE_STAT: // 线路状态错误
        {
            UART1_GetLinSTA();
            break;
        }

        case UART_II_RECV_RDY: // 数据达到设置触发点
            for(i = 0; i != trigB; i++)
            {
                RxBuff[i] = UART1_RecvByte();
                UART1_SendByte(RxBuff[i]);
            }
            break;

        case UART_II_RECV_TOUT: // 接收超时,暂时一帧数据接收完成
            i = UART1_RecvString(RxBuff);
            UART1_SendString(RxBuff, i);
            break;

        case UART_II_THR_EMPTY: // 发送缓存区空,可继续发送
            break;

        case UART_II_MODEM_CHG: // 只支持串口0
            break;

        default:
            break;
    }
}

这里面我要说一下串口重定向,这个CH582M的串口重定向是博主参考STM32的HAL库改的。全网唯一哈。t添加下面的代码就能实现串口重定向

#include "stdio.h"
//-----------------------串口重定向_Begin-----------------------
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
//-----------------------串口重定向_End-----------------------
//-----------------------串口重定向_Begin-----------------------
PUTCHAR_PROTOTYPE 
{
    UART1_SendString(TxBuff, sizeof(TxBuff)); //可以改这个函数来实现其他串口的重定向
    return TxBuff;
}
//-----------------------串口重定向_End-----------------------

最后是main.c函数

#include "CH58x_common.h"
#include "USART.h"

/*********************************************************************
 * @fn      main
 *
 * @brief   主函数
 *
 * @return  none
 */
int main()
{

    SetSysClock(CLK_SOURCE_PLL_60MHz); 
    USART_Init(115200);

#if 1 // 测试串口发送字符串
    printf("hellow world=%d!\r\n",123);

#endif

    while(1);
}

二、效果展示

这里串口收发都没问题
在这里插入图片描述

总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

单片有机机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值