add proj
This commit is contained in:
101
B-G474E-DPOW1_Keil/Core/Src/retarget.c
Normal file
101
B-G474E-DPOW1_Keil/Core/Src/retarget.c
Normal file
@@ -0,0 +1,101 @@
|
||||
#include "retarget.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "app_config.h"
|
||||
#include "stm32g474xx.h"
|
||||
|
||||
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 6000000)
|
||||
#pragma import(__use_no_semihosting)
|
||||
|
||||
struct __FILE
|
||||
{
|
||||
int handle;
|
||||
};
|
||||
#elif defined(__ARMCC_VERSION)
|
||||
__asm(".global __use_no_semihosting\n");
|
||||
#endif
|
||||
|
||||
FILE __stdout;
|
||||
FILE __stdin;
|
||||
|
||||
static void gpio_pc10_pc11_to_usart3(void)
|
||||
{
|
||||
RCC->AHB2ENR |= RCC_AHB2ENR_GPIOCEN;
|
||||
(void)RCC->AHB2ENR;
|
||||
|
||||
/* PC10 = USART3_TX, PC11 = USART3_RX, AF7: ST-LINK VCP on CN3. */
|
||||
GPIOC->MODER &= ~((3UL << (10U * 2U)) | (3UL << (11U * 2U)));
|
||||
GPIOC->MODER |= ((2UL << (10U * 2U)) | (2UL << (11U * 2U)));
|
||||
|
||||
GPIOC->OTYPER &= ~((1UL << 10U) | (1UL << 11U));
|
||||
GPIOC->OSPEEDR |= ((3UL << (10U * 2U)) | (3UL << (11U * 2U)));
|
||||
GPIOC->PUPDR &= ~((3UL << (10U * 2U)) | (3UL << (11U * 2U)));
|
||||
|
||||
GPIOC->AFR[1] &= ~((0xFUL << ((10U - 8U) * 4U)) | (0xFUL << ((11U - 8U) * 4U)));
|
||||
GPIOC->AFR[1] |= ((7UL << ((10U - 8U) * 4U)) | (7UL << ((11U - 8U) * 4U)));
|
||||
}
|
||||
|
||||
void Retarget_Init(uint32_t baudrate)
|
||||
{
|
||||
gpio_pc10_pc11_to_usart3();
|
||||
|
||||
RCC->APB1ENR1 |= RCC_APB1ENR1_USART3EN;
|
||||
(void)RCC->APB1ENR1;
|
||||
|
||||
USART3->CR1 = 0U;
|
||||
USART3->CR2 = 0U;
|
||||
USART3->CR3 = 0U;
|
||||
|
||||
/* APB1 is not prescaled; use the clock that really started. */
|
||||
USART3->BRR = (SystemCoreClock + (baudrate / 2U)) / baudrate;
|
||||
USART3->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE;
|
||||
}
|
||||
|
||||
void Retarget_PutChar(char ch)
|
||||
{
|
||||
while ((USART3->ISR & USART_ISR_TXE_TXFNF) == 0U)
|
||||
{
|
||||
__NOP();
|
||||
}
|
||||
USART3->TDR = (uint8_t)ch;
|
||||
}
|
||||
|
||||
int fputc(int ch, FILE *f)
|
||||
{
|
||||
(void)f;
|
||||
|
||||
if (ch == '\n')
|
||||
{
|
||||
Retarget_PutChar('\r');
|
||||
}
|
||||
|
||||
Retarget_PutChar((char)ch);
|
||||
return ch;
|
||||
}
|
||||
|
||||
int fgetc(FILE *f)
|
||||
{
|
||||
(void)f;
|
||||
|
||||
while ((USART3->ISR & USART_ISR_RXNE_RXFNE) == 0U)
|
||||
{
|
||||
__NOP();
|
||||
}
|
||||
|
||||
return (int)(USART3->RDR & 0xFFU);
|
||||
}
|
||||
|
||||
void _ttywrch(int ch)
|
||||
{
|
||||
Retarget_PutChar((char)ch);
|
||||
}
|
||||
|
||||
void _sys_exit(int return_code)
|
||||
{
|
||||
(void)return_code;
|
||||
while (1)
|
||||
{
|
||||
__NOP();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user