提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
提示:以下是本篇文章正文内容,下面案例可供参考
一、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);
}
二、效果展示
这里串口收发都没问题
总结
无