袁胜富 发表于 2022-10-30 19:13

新定义MCU开发板测评 + 使用printf重定向

本帖最后由 袁胜富 于 2022-10-30 19:20 编辑

一、原因
   由于开发评估版没有板载仿真器,导致十分不方便在调试代码时。于是使用串口1重定向prinf,用于打印,调试信息。
static/image/hrline/line9.png

二、代码
头文件
#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"
voidUart1_Init(unsigned long int baudrate);
void sendstring(unsigned char *string);
void uart_printf(const char *fmt,...);
voidUart1_SendChar(uint8_t ch);
voidDelay(unsigned int time);
#endif
源文件
#include "uart1.h"
#include <stdio.h>
#include <string.h>
#include <stdarg.h>


bit Uart1SendFlag = 0;    //Uart1发送中断标志位
bit Uart1ReceiveFlag = 0; //Uart1接收中断标志位


voidDelay(unsigned int time)
{
      uint16_t i;
      while(time--)
      {
                i =4095;
                while(i--);
      }
}


voidUart1_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;      
}


voidUart1_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;//访问内部拓展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
}
static/image/hrline/line9.png

三、效果



static/image/hrline/line9.png

四、使用感受      总体来说,8位机入门目前来看,比32位难一点,调试手段没有32位丰富。



天天向善 发表于 2022-11-8 14:00

重定义代码官方提供吗?还是你自己研究出来的。?

七毛钱 发表于 2022-11-9 16:39

开发板的相关资料找谁要啊

RDS小义 发表于 2022-11-9 18:17

七毛钱 发表于 2022-11-9 16:39
开发板的相关资料找谁要啊

任何问题,到官网联系客服人员

袁胜富 发表于 2022-11-13 23:12

天天向善 发表于 2022-11-8 14:00
重定义代码官方提供吗?还是你自己研究出来的。?

自己吧

天天向善 发表于 2022-12-3 20:05

袁胜富 发表于 2022-11-13 23:12
自己吧

厉害了大佬!

eefas 发表于 2022-12-4 20:16

是不是需要microlib?            

minzisc 发表于 2022-12-6 14:19

keil的功能,不是很好用呢。            
页: [1]
查看完整版本: 新定义MCU开发板测评 + 使用printf重定向