在使用赛元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
|