打印
[技术问答]

赛元SC92F8003串口重定向printf问题(复用用烧录口)

[复制链接]
233|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
51xlf|  楼主 | 2024-1-31 23:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在使用赛元SC92F8003做项目时,发现其仿真尤其的慢,调试极其不方便,而且其他IO口都被占用了,最后发现烧录口有一个串口可以使用,在配置过程中也遇到了一些问题,在此做下记录,以便后续遇到该问题时毫无头绪。

以下是程序文件

在sc92f8003_uart0.c文件中修改UART0_SendData8(uint8_t Data)函数,如下增加标志位

#include "sc92f8003_uart0.h"
bit UART_SENDFLAG;

/*****************************************************
*函数名称:void UART0_SendData8(uint8_t Data)
*函数功能:UART0发送8位数据
*入口参数:uint8_t Data                发送的数据
*出口参数:void
*****************************************************/
void UART0_SendData8(uint8_t Data)
{
        SBUF = Data;
        while (!UART_SENDFLAG);
        UART_SENDFLAG = 0;
}
然后在中断函数中增加中断函数的处理,由于本项目只需要串口进行打印不需要接收,固只处理打印阶段,它的原理是发送完成后会进入发送中断,在中断中增加标志位,发送完成标志位置1,每次发送后等待发送完成再发送下一个字节,如下

void UART0Interrupt() interrupt 4
{
        if(UART0_GetFlagStatus(UART0_FLAG_TI))
        {
        UART_SENDFLAG = 1;
                UART0_ClearFlag(UART0_FLAG_TI);                        //清除TI
        }
        else if(UART0_GetFlagStatus(UART0_FLAG_RI))
        {
                //UART0_ClearFlag(UART0_FLAG_RI);                        //清除RI
                //UART0_SendData9(UART0_ReceiveData9());        //发送接收的数据
        }
}
增加串口初始化函数和重定向函数,由于需要将烧录口复用为串口,故需要用到UART0_PinSelection函数,由于只用TX,不用RX,故初始化时RX设为DISABLE,如下

char putchar(char c) // 重定向
{
        UART0_SendData8(c);
        return c;
}

void Uart0Init(void)
{
        GPIO_Init(GPIO2, GPIO_PIN_0, GPIO_MODE_IN_PU);
        UART0_PinSelection(UART0_PinSelection_P11P20);
        // 波特率9600,TIMER1做时钟源,允许接收
        UART0_Init(16000000, 9600, UART0_Mode_10B, UART0_CLOCK_TIMER1, UART0_RX_DISABLE);
        UART0_ITConfig(ENABLE, HIGH); // 使能uart0中断
}
注意,在此处有个坑,原本例程是UART0_ITConfig(ENABLE, LOW);,项目程序中有定时器0和定时器2中断,用原本例程时会发现打印不完整,最后将该句改为UART0_ITConfig(ENABLE, HIGH); 优先级高时可以正常使用打印

最后在while程序中进行打印就可以了

    printf("machine_state = %bd\r\n", (uint8_t)(1));
    printf("connect = %bd\r\n", (uint8_t)(2));
    printf("flip = %bd\r\n", (uint8_t)(3));
    printf("dusk_tank = %bd\r\n", (uint8_t)(4));
    printf("start_check_time_flag = %bd\r\n", (uint8_t)(5));
    printf("bsp_CheckRunTime(filp_time) = %ld\r\n", (int32_t)(bsp_CheckRunTime(filp_time)));
    printf("TIME_OVER = %ld\r\n", (int32_t)(TIME_OVER));
在这里也要注意,这里使用的printf打印和stm32使用的数据不一样,

int32_t是用%ld,uint8_t用%bd

转自https://blog.csdn.net/weixin_44808351/article/details/132269522

使用特权

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

本版积分规则

534

主题

9586

帖子

23

粉丝