华大MCU HC32L136芯片 使用printf输出
本帖最后由 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_TXDPB07_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");
~~~~~~~~~~~~~~~~~~~~~~
串口调试助手115200N 8 1Even校验
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,正常找原因。
非常感谢楼主分享 调试过程中有需要注意的地方吗 楼主方便提供一下硬件图吗 感谢分享代码 楼主辛苦了 多谢分享,重定向printf。也可以试试移植RTT操作系统。 本帖最后由 火火火火豁 于 2021-1-26 14:32 编辑
感谢楼主————但我用野火的串口调试助手,115200时接收到的数据都是乱码,115200以下没错,为啥会这样啊? 火火火火豁 发表于 2021-1-26 14:18
感谢楼主————但我用野火的串口调试助手,115200时接收到的数据都是乱码,115200以下没错,为啥会这样啊 ...
用的是内部4m频率? 什么bug? 在调试过程有需要特别注意的地方吗 kcfoo1 发表于 2021-1-27 12:24
用的是内部4m频率?
PA02_UART1_TXD
PA03_UART1_RXD
我就改了这两个引脚相关的,别的和上面的程序一样 火火火火豁 发表于 2021-1-27 16:08
PA02_UART1_TXD
PA03_UART1_RXD
官方例程用的是4m,波特率误差太大,只能用较低波特率,改为16m就可以了 将原工程文件夹下的main.c单独用UE或者其它文本编辑器打开,另存时选择ANSI格式保存并替换原文件,再打开工程项目重新编译后即可,估计是工程模板创建时的BUG,没考虑国人感受
页:
[1]