打印
[开发工具]

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

[复制链接]
1113|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
袁胜富|  楼主 | 2022-10-30 19:13 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 袁胜富 于 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位丰富。



使用特权

评论回复
沙发
天天向善| | 2022-11-8 14:00 | 只看该作者
重定义代码官方提供吗?还是你自己研究出来的。?

使用特权

评论回复
板凳
七毛钱| | 2022-11-9 16:39 | 只看该作者
开发板的相关资料找谁要啊

使用特权

评论回复
地板
RDS小义| | 2022-11-9 18:17 | 只看该作者
七毛钱 发表于 2022-11-9 16:39
开发板的相关资料找谁要啊

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

使用特权

评论回复
5
袁胜富|  楼主 | 2022-11-13 23:12 | 只看该作者
天天向善 发表于 2022-11-8 14:00
重定义代码官方提供吗?还是你自己研究出来的。?

自己吧

使用特权

评论回复
6
天天向善| | 2022-12-3 20:05 | 只看该作者

厉害了大佬!

使用特权

评论回复
7
eefas| | 2022-12-4 20:16 | 只看该作者
是不是需要microlib?              

使用特权

评论回复
8
minzisc| | 2022-12-6 14:19 | 只看该作者
keil的功能,不是很好用呢。              

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

149

帖子

2

粉丝