本帖最后由 袁胜富 于 2022-10-30 19:20 编辑
一、原因
由于开发评估版没有板载仿真器,导致十分不方便在调试代码时。于是使用串口1重定向prinf,用于打印,调试信息。
二、代码
头文件
#ifndef __UART1_H__
#define __UART1_H__
#include "SC_Init.h" // MCU initialization header file, including all firmware library header files
#include "..\Drivers\SCDriver_list.h"
#include "HeadFiles\SC_itExtern.h"
#include "rd8_usci1.h"
void Uart1_Init(unsigned long int baudrate);
void sendstring(unsigned char *string);
void uart_printf(const char *fmt,...);
void Uart1_SendChar(uint8_t ch);
void Delay(unsigned int time);
#endif
源文件
#include "uart1.h"
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
bit Uart1SendFlag = 0; //Uart1发送中断标志位
bit Uart1ReceiveFlag = 0; //Uart1接收中断标志位
void Delay(unsigned int time)
{
uint16_t i;
while(time--)
{
i =4095;
while(i--);
}
}
void Uart1_Init(unsigned long int baudrate)
{
P1CON &= 0xF5; //TX/RX设置为输入带上拉
P1PH |= 0x0A;
OTCON |= 0xC0; //串行接口SSI1选择Uart1通信
US1CON0 = 0x50; //设置通信方式为模式一,允许接收
US1CON1 = 32*1000000/baudrate; //波特率低位控制
US1CON2 = (32*1000000/baudrate)>>8; //波特率高位控制
IE2 |= 0x01; //开启SSI1中断
/*USCI1_Init write here*/
EA = 1;
}
void Uart1_SendChar(uint8_t ch)
{
US1CON3 = ch;
while(!Uart1SendFlag);
Uart1SendFlag = 0;
}
void USCI1Interrupt() interrupt 15
{
if(US1CON0&0x02) //发送标志位判断
{
US1CON0 &= 0xFE;
Uart1SendFlag = 1;
}
if((US1CON0&0x01)) //接收标志位判断
{
US1CON0 &= 0xFD;
Uart1ReceiveFlag = 1;
}
}
void sendstring(unsigned char *string)//此处*string相当于数组
{
while(*string!='\0')//判断是否到字符串末尾
{
Uart1_SendChar(*string);
string++;
}
}
void uart_printf(const char *fmt,...)
{
va_list ap;
char xdata string[1024];//访问内部拓展RAM,非访问外部RAM,不能超过内部拓展RAM大小(此处为1024)
va_start(ap,fmt);
vsprintf(string,fmt,ap);//此处也可以使用sprintf函数,用法差不多,稍加修改即可,此处略去
sendstring(string);
va_end(ap);
}
/*
**重写printf调用的putchar函数,重定向到串口输出
**需要引入头文件<stdio.h>
*****/
char putchar(char c){
//输出重定向到串口
Uart1_SendChar(c);
return c; //返回给函数的调用者printf
}
三、效果
四、使用感受 总体来说,8位机入门目前来看,比32位难一点,调试手段没有32位丰富。
|