本帖最后由 yy_yanyu 于 2020-7-8 11:04 编辑
#include "bsp_uart.h"
/*
ddl.c .h 中编译器报错重复的函数语句删除掉。mian.c 中添加#include "stdio.h"
UART初始化的时候一定一定一定要把发送完成中断关闭。//Uart_EnableIrq(M0P_UART0,UartTxIrq); ///<使能串口接收中断
*/
//加入以下代码,支持printf函数,而不需要选择use MicroLIB
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
int _sys_exit(int x)
{
x = x;
return x;
}
int fputc(int ch, FILE *f)//重定义fputc函数
{
M0P_UART0->SCON_f.REN = 1;//M0P_UART0->SCON_f.REN = 0;//修改 0的时候就接受不到数据了..
M0P_UART0->SBUF = (uint8_t) ch;
while (TRUE != M0P_UART0->ISR_f.TC){;}
M0P_UART0->ICR_f.TCCF = 0;
return ch;
}
#endif
void App_UART0_Init(uint32_t bound)////App_UART0_Init(115200); 根据自己单片机进行修改
{
// Test uart PB06_UART0_TXD PB07_UART0_RXD
stc_gpio_cfg_t stcGpioCfg;
stc_uart_cfg_t stcCfg;
DDL_ZERO_STRUCT(stcGpioCfg);
DDL_ZERO_STRUCT(stcCfg);
//串口引脚配置
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //使能GPIO模块时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0,TRUE);///<使能uart1模块时钟
///<PB06_UART0_TXD
stcGpioCfg.enDir = GpioDirOut;
Gpio_Init(GpioPortB, GpioPin6, &stcGpioCfg);
Gpio_SetAfMode(GpioPortB, GpioPin6, GpioAf2); //配置PA02 端口为URART1_TX
///<PB07_UART0_RXD
stcGpioCfg.enDir = GpioDirIn;
Gpio_Init(GpioPortB, GpioPin7, &stcGpioCfg);
Gpio_SetAfMode(GpioPortB, GpioPin7, GpioAf2); //配置PA03 端口为URART1_RX
//串口配置
///<UART Init
stcCfg.enRunMode = UartMskMode3; ///<模式3
stcCfg.enStopBit = UartMsk1bit; ///<1bit停止位
stcCfg.enMmdorCk = UartMskEven; ///<偶检验
stcCfg.stcBaud.u32Baud = bound; ///<波特率9600
stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div; ///<通道采样分频配置
stcCfg.stcBaud.u32Pclk = Sysctrl_GetPClkFreq(); ///<获得外设时钟(PCLK)频率值
Uart_Init(M0P_UART0, &stcCfg); ///<串口初始化
///<UART中断使能
Uart_ClrStatus(M0P_UART0,UartRC); ///<清接收请求
Uart_ClrStatus(M0P_UART0,UartTC); ///<清接收请求
Uart_EnableIrq(M0P_UART0,UartRxIrq); ///<使能串口接收中断
//Uart_EnableIrq(M0P_UART0,UartTxIrq); ///<使能串口接收中断
EnableNvic(UART0_IRQn, IrqLevel3, TRUE); ///<系统中断使能
}
//UART0中断函数
void Uart0_IRQHandler(void)
{
if(Uart_GetStatus(M0P_UART0, UartRC)) //UART1数据接收
{
Uart_ClrStatus(M0P_UART0, UartRC); //清中断状态位
Uart_ReceiveData(M0P_UART0); //接收数据字节
}
if(Uart_GetStatus(M0P_UART0, UartTC)) //UART1数据发送
{
Uart_ClrStatus(M0P_UART0, UartTC); //清中断状态位
}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
App_UART0_Init(115200);
printf("UART Test 115200\r\n");
//delay1ms(300);
printf("123456\r\n");
printf("789\r\n");
printf("T1 %d\r\n",123);
printf("T2 %X\r\n",123);
printf("T3 %s\r\n","123456");
~~~~~~~~~~~~~~~~~~~~~~
串口调试助手 115200 N 8 1 Even校验
UART Test 115200
123456
789
T1 123
T2 7B
T3 123456
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2020年6月10日15:54:02 如果调试有问题可以回复或者发邮件给我 yy_yanyu@126.com
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
上面的程序不能打印输出汉字,打印输出汉字应该需要设置“Target”-“USE Micro LIB”那个库,百度一下。没时间弄。
最近发现这个芯片的串口有BUG,正常找原因。
|