You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/**
* @file uart.c * @author 1722451300@qq.com * @brief * @version 0.1 * @date 2021-12-14 * * @copyright Copyright (c) 2021 * */ #include <hic.h>
#include "t21_t8.h"
#include "io_config.h"
#include "uart.h"
#include "motor.h"
#include "lcd.h"
#if 0
#endif
#define IT_SR //中断发送接收,注释此宏定义则使用查询方式发送接收
#define CLRWDT() \
{ \ __Asm CWDT; \ } //宏定义清狗指令
void uart0_config(void) { /**
* @brief 串口初始化 * PAT1 = 0; //TX输出
* PAT2 = 1; //RX输入
*/ uart0_tx_io = 0; //TX输出
uart0_rx_io = 1; //RX输入
RX0LEN = 0; //8位数据接收格式
TX0LEN = 0; //8位数据发送格式
/*
BJT0EN = 0; //波特率去抖
BRGH0 = 0; //波特率低速模式:波特率=Fosc/(64*(BRR<7:0>+1))
BR0R = 0x33; //波特率=32MHz/(64*(51+1))≈9600bps = 9615.38
*/ BJT0EN = 1; //波特率去抖
BRGH0 = 1; //串口处于高速模式
BR0R = 17; BR0FRA = 6;
#ifdef IT_SR
RX0IE = 1; GIE = 1; #endif
RX0EN = 1; //打开接收
TX0EN = 1; //打开发送
}
void uart1_config(void) { /**
* @brief 串口1的初始化 * */ uart1_tx_io = 0; //TX输出
uart1_rx_io = 1; //RX输入
RX1LEN = 0; //8位数据接收格式
TX1LEN = 0; //8位数据发送格式
/*
BJT1EN = 1; //波特率去抖
BRGH0 = 0; //波特率低速模式:波特率=Fosc/(64*(BRR<7:0>+1))
BR1R = 0x33; //波特率=32MHz/(64*(51+1))≈9600bps = 9615.38
*/ BJT1EN = 1; //波特率去抖
BRGH1 = 1; //串口处于高速模式
BR1R = 17; BR1FRA = 6; #ifdef IT_SR
RX1IE = 1; GIE = 1; #endif
RX1EN = 1; //打开接收
TX1EN = 1; //打开发送
}
void uart0_send_byte(char data) { /**
* @brief 串口0发送函数(发送一个字节) * @param 发送的字符 */ while (!TRMT0) ; TX0B = data; }
void uart0_send_buff(char *data) { /**
* @brief 串口0发送函数(发送字符串) * @param 发送的字符串 */ while (*data) { while (!TRMT0) ; TX0B = *data; data++; } }
void uart1_send_byte(char data) { /**
* @brief 串口1发送函数(发送一个字节) * @param 发送的字符 */ while (!TRMT1) ; TX1B = data; }
void uart1_send_buff(char *data) { /**
* @brief 串口1发送函数(发送字符串) * @param 发送的字符串 */ while (*data) { while (!TRMT1) ; TX1B = *data; data++; } }
void uart1_irq_interrupt(void) { /**
* @brief 串口1的中断服务函数 * */ if (RX1IE == 1) { //帧格式出错
if (FERR1 == 1) { } //接收溢出
if (OERR1 == 1) { //重启串口
RX1EN = 0; RX1EN = 1; } if ( RX1IF == 1) { uint8_t rx232data = RX1B; recv_from_lcd_data(rx232data); } } }
#ifdef IT_SR
void isr(void) interrupt { /**
* @brief 中断服务函数 * */ if (RX0IE == 1) { //帧格式出错
if (FERR0 == 1) { } //接收溢出
if (OERR0 == 1) { //重启串口
RX0EN = 0; RX0EN = 1; }
if ( RX0IF == 1)//串口0(电机数据接收)
{ uint8_t rx485data = RX0B; recv_from_motor_data(rx485data); } } uart1_irq_interrupt();//屏幕数据接收
system_module_process_interrupt();//定时器中断
} #endif
void urat0_text(void) { /**
* @brief 上电测试串口发送是否正常 * */ volatile unsigned char str[] = "urat0"; volatile unsigned char buf[] = "uart1";
//send_cmd_to_motor(str, 5); //发送一串字符测试
send_cmd_to_lcd(buf, 5); //发送一串字符测试
}
|