diff --git a/src/main.c b/src/main.c index f07196d..b43973d 100755 --- a/src/main.c +++ b/src/main.c @@ -1,4 +1,34 @@ +#include + #include "stm32f0xx_conf.h" +#include "stm32f0xx_rtc.h" +#include "stm32f0xx_usart.h" + +static int puts(const char *str) +{ + const char *p = str; + char c; + + for (c = *p++; c; c = *p++) { + while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) != SET) ; + USART_SendData(USART1, c); + } +} + +static char bcd2char(uint8_t bcd) +{ + if (bcd < 0xA) + return '0' + bcd; + else + return 'A' + (bcd - 0xA); +} + +static void bcd2str(char *out, uint8_t bcd) +{ + *out++ = bcd2char(bcd >> 4); + *out++ = bcd2char(bcd & 0xF); +} + void SysTick_Handler(void) { static uint16_t tick = 0; @@ -8,9 +38,52 @@ void SysTick_Handler(void) { tick = 0; GPIOC->ODR ^= (1 << 8); break; + case 25: + USART_SendData(USART1, 'A'); + break; + case 75: + USART_SendData(USART1, 'z'); + break; + case 50: + { + RTC_TimeTypeDef time; + char buf[128]; + + RTC_GetTime(RTC_Format_BCD, &time); + memset(buf, 0, sizeof(buf)); + //sprintf(buf, "%02x:%02x:%02x\r\n", time.RTC_Hours, time.RTC_Minutes, time.RTC_Seconds); + bcd2str(buf, time.RTC_Seconds); + strcpy(buf+2, "s\r\n"); + + puts(buf); + } + break; } } +static GPIO_InitTypeDef gpioa9 = { + .GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10, + .GPIO_Mode = GPIO_Mode_AF, + .GPIO_Speed = GPIO_Speed_Level_1, + .GPIO_OType = GPIO_OType_PP, + .GPIO_PuPd = GPIO_PuPd_UP, +}; + +static RTC_InitTypeDef rtcinit = { + .RTC_HourFormat = RTC_HourFormat_24, + .RTC_AsynchPrediv = (128-1), + .RTC_SynchPrediv = (256-1), +}; + +static USART_InitTypeDef usartinit = { + .USART_BaudRate = 115200, + .USART_WordLength = USART_WordLength_8b, + .USART_StopBits = USART_StopBits_1, + .USART_Parity = USART_Parity_No, + .USART_Mode = USART_Mode_Rx | USART_Mode_Tx, + .USART_HardwareFlowControl = USART_HardwareFlowControl_None, +}; + int main(void) { @@ -19,8 +92,39 @@ int main(void) GPIOC->MODER = (1 << 16); + /* UART */ + //RCC_USARTCLKConfig(RCC_USART1CLK_SYSCLK); + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); + GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1); + GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1); + GPIO_Init(GPIOA, &gpioa9); + USART_Init(USART1, &usartinit); + USART_Cmd(USART1, ENABLE); + +#if 1 + RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); + PWR_BackupAccessCmd(ENABLE); + + /* Low-Speed External Oscillator */ + RCC_LSEConfig(RCC_LSE_ON); + RCC_LSEDriveConfig(RCC_LSEDrive_High); + /* wait for LSERDY */ + while (!(RCC_GetFlagStatus(RCC_FLAG_LSERDY))); +#else + RCC_LSICmd(ENABLE); + while (!(RCC_GetFlagStatus(RCC_FLAG_LSIRDY))); +#endif + + /* RTC */ + RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); + RCC_RTCCLKCmd(ENABLE); + RTC_Init(&rtcinit); + SysTick_Config(SystemCoreClock/100); + puts("\r\nEntering main...\r\n"); + while(1); }