文章目录[隐藏]
国民技术N32G45X例程之-串口打印
提示:use MicroLIB,printf串口打印
前言
提示:国民技术N32G45X官方库默认都是选择use MicroLIB,当取消勾选use MicroLIB后,程序不能正常运行,主要的问题还是在串口打印printf函数上,KEIL在编译时没有找到printf函数支持的库。
提示:以下是本篇文章正文内容,下面案例可供参考
一、国民技术N32G45X串口配置
示例:配置USART1。
/**
* @brief Configure parameters of usart port.
*/
void Uart1_Init(void)
{
GPIO_InitType GPIO_InitStructure;
USART_InitType USART_InitStructure;
// Turn on the clock of usart port GPIO
USART_GPIO_APBxClkCmd(USART_GPIO_CLK, ENABLE);
// Turn on the clock of usart peripheral
USART_APBxClkCmd(USART_CLK, ENABLE);
// Configure GPIO of USART TX as push pull multiplexing mode
GPIO_InitStructure.Pin = USART_TX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitPeripheral(USART_TX_GPIO_PORT, &GPIO_InitStructure);
// Configure GPIO of USART RX as floating input mode
GPIO_InitStructure.Pin = USART_RX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_INPUT;
GPIO_InitPeripheral(USART_RX_GPIO_PORT, &GPIO_InitStructure);
// Configure parameters of usart port
// Configure baud rate
USART_InitStructure.BaudRate = USART_BAUDRATE;
// Configure the length of frame data
USART_InitStructure.WordLength = USART_WL_8B;
// Configure stop bits
USART_InitStructure.StopBits = USART_STPB_1;
// Configure check bit
USART_InitStructure.Parity = USART_PE_NO;
// Configure hardware flow control
USART_InitStructure.HardwareFlowControl = USART_HFCTRL_NONE;
// Configure working mode, send and receive together
USART_InitStructure.Mode = USART_MODE_RX | USART_MODE_TX;
// Complete initialization configuration of usart port
USART_Init(USARTx, &USART_InitStructure);
// Configuration interrupt priority of the usart port
// NVIC_Configuration();
// Enable usart port receive interrupt
// USART_ConfigInt(DEBUG_USARTx, USART_INT_RXDNE, ENABLE);
// Enable usart
USART_Enable(USARTx, ENABLE);
}
二、printf函数
1.国民技术N32G45X官方库默认勾选use MicroLIB,所以代码中没有printf函数支持库。
代码如下(示例):
/* retarget the C library printf function to the USART */
int fputc(int ch, FILE* f)
{
USART_SendData(USARTx, (uint8_t)ch);
while (USART_GetFlagStatus(USARTx, USART_FLAG_TXDE) == RESET)
;
return (ch);
}
2.改成加入printf函数支持库,这样才能正常运行。
代码如下(示例):
//加入以下代码,支持printf函数,而不需要选择use MicroLIB
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
x = x;
}
//重定向c库函数printf到串口,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
/* 发送一个字节数据到串口 */
USART_SendData(USARTx, (uint8_t) ch);
/* 等待发送完毕 */
while (USART_GetFlagStatus(USARTx, USART_FLAG_TXDE) == RESET);
return (ch);
}
///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{
/* 等待串口输入数据 */
while (USART_GetFlagStatus(USARTx, USART_FLAG_TXDE) == RESET);
return (int)USART_ReceiveData(USARTx);
}
#endif
3.在KEIL中取消勾选use MicroLIB
三、 例程下载
国民技术N32G45X例程之-串口打印
https://download.csdn.net/download/suqingxiao/68829874
版权声明:本文为CSDN博主「suqingxiao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/suqingxiao/article/details/122090474
暂无评论