116 lines
3.4 KiB
C
116 lines
3.4 KiB
C
#include "uart_printf.h"
|
|
|
|
#define UART_PRINTF_BAUDRATE 115200
|
|
|
|
uint8_t HEX_TABLE[16] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
|
|
|
|
void UART_PrintfInit(void)
|
|
{
|
|
GPIO_InitTypeDef GPIO_InitStructure;
|
|
USART_InitTypeDef USART_InitStructure;
|
|
|
|
#if UART_PORTx == UART_PORT_TX_A3_RX_D6
|
|
// Enable GPIO and UART clock
|
|
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOD, ENABLE);
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
|
|
// AF config
|
|
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1);
|
|
GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_1);
|
|
// PA3 As USART TX
|
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
|
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
|
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
|
|
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
|
|
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
|
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
|
// PD6 As USART RX
|
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
|
|
GPIO_Init(GPIOD, &GPIO_InitStructure);
|
|
|
|
#elif UART_PORTx == UART_PORT_TX_A3_RX_B4
|
|
// Enable GPIO and UART clock
|
|
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB, ENABLE);
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
|
|
// AF config
|
|
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1); // TX
|
|
GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_4); // RX
|
|
// PA3 As USART TX
|
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
|
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
|
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
|
|
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
|
|
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
|
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
|
// PB4 As USART RX
|
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
|
|
GPIO_Init(GPIOB, &GPIO_InitStructure);
|
|
|
|
#endif
|
|
USART_InitStructure.USART_BaudRate = UART_PRINTF_BAUDRATE;
|
|
// 8-bit, 1 stop bit, no parity, no hardware flow control
|
|
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
|
|
USART_InitStructure.USART_StopBits = USART_StopBits_1;
|
|
USART_InitStructure.USART_Parity = USART_Parity_No;
|
|
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
|
|
// Enable Tx
|
|
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
|
|
// Init and enable UART1
|
|
USART_Init(USART1, &USART_InitStructure);
|
|
USART_Cmd(USART1, ENABLE);
|
|
}
|
|
|
|
void UART_SendByte(uint8_t ch)
|
|
{
|
|
/* Send one byte to USART */
|
|
USART_SendData(USART1, ch);
|
|
/* Block till tx empty flag is set */
|
|
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
|
|
}
|
|
|
|
void UART_SendArray(uint8_t *array, uint16_t num)
|
|
{
|
|
uint8_t i;
|
|
for (i = 0; i < num; i++)
|
|
{
|
|
UART_SendByte(array[i]);
|
|
}
|
|
/* Block till transmission is completed */
|
|
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
|
|
}
|
|
|
|
void UART_SendString(char *str)
|
|
{
|
|
while (*str)
|
|
{
|
|
UART_SendByte(*str++);
|
|
}
|
|
/* Block till transmission is completed */
|
|
while (USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
|
|
}
|
|
|
|
void UART_TxHex(uint8_t *hex, uint8_t len)
|
|
{
|
|
while (len--)
|
|
{
|
|
UART_SendByte(HEX_TABLE[*(hex + len) >> 4 & 0xF]);
|
|
UART_SendByte(HEX_TABLE[*(hex + len) & 0xF]);
|
|
}
|
|
}
|
|
|
|
int __io_putchar(int ch)
|
|
{
|
|
UART_SendByte((uint8_t)ch);
|
|
return ch;
|
|
}
|
|
|
|
__attribute__((weak)) int _write(int file, char *ptr, int len)
|
|
{
|
|
(void)file;
|
|
int DataIdx;
|
|
for (DataIdx = 0; DataIdx < len; DataIdx++)
|
|
{
|
|
__io_putchar(*ptr++);
|
|
}
|
|
return len;
|
|
}
|