// Initialize the display control GPIO pins void SSD1306_InitGPIO(void) { // Enable the GPIO peripheral(s) clock RCC->AHBENR |= SSD1306_GPIO_PERIPH; // Configure CS pin as push-pull output with pull-up GPIO_set_mode(SSD1306_CS_PORT,GPIO_Mode_OUT,GPIO_PUPD_PU,SSD1306_CS_PIN); GPIO_out_cfg(SSD1306_CS_PORT,GPIO_OT_PP,GPIO_SPD_VERYLOW,SSD1306_CS_PIN); SSD1306_CS_H(); // Configure DC pin as push-pull output with pull-up GPIO_set_mode(SSD1306_DC_PORT,GPIO_Mode_OUT,GPIO_PUPD_PU,SSD1306_DC_PIN); GPIO_out_cfg(SSD1306_DC_PORT,GPIO_OT_PP,GPIO_SPD_VERYLOW,SSD1306_DC_PIN); SSD1306_DC_L(); // Configure RST pin as push-pull output with pull-up GPIO_set_mode(SSD1306_RST_PORT,GPIO_Mode_OUT,GPIO_PUPD_PU,SSD1306_RST_PIN); GPIO_out_cfg(SSD1306_RST_PORT,GPIO_OT_PP,GPIO_SPD_VERYLOW,SSD1306_RST_PIN); SSD1306_RST_H(); }
// De-initialize the SDIO GPIO lines to its default state void SD_GPIO_DeInit(void) { // SDIO_CMD GPIO_set_mode(SDIO_GPIO_CMD_PORT,GPIO_Mode_AN,GPIO_PUPD_PU,SDIO_GPIO_CMD_PIN); GPIO_out_cfg(SDIO_GPIO_CMD_PORT,GPIO_OT_PP,GPIO_SPD_LOW,SDIO_GPIO_CMD_PIN); GPIO_af_cfg(SDIO_GPIO_CMD_PORT,SDIO_GPIO_CMD_SRC,GPIO_AF0); // SDIO_CK GPIO_set_mode(SDIO_GPIO_CK_PORT,GPIO_Mode_AN,GPIO_PUPD_PU,SDIO_GPIO_CK_PIN); GPIO_out_cfg(SDIO_GPIO_CK_PORT,GPIO_OT_PP,GPIO_SPD_LOW,SDIO_GPIO_CK_PIN); GPIO_af_cfg(SDIO_GPIO_CK_PORT,SDIO_GPIO_CK_SRC,GPIO_AF0); // SDIO_D0 GPIO_set_mode(SDIO_GPIO_D0_PORT,GPIO_Mode_AN,GPIO_PUPD_PU,SDIO_GPIO_D0_PIN); GPIO_out_cfg(SDIO_GPIO_D0_PORT,GPIO_OT_PP,GPIO_SPD_LOW,SDIO_GPIO_D0_PIN); GPIO_af_cfg(SDIO_GPIO_D0_PORT,SDIO_GPIO_D0_SRC,GPIO_AF0); #if (SDIO_USE_4BIT) // SDIO_D1 GPIO_set_mode(SDIO_GPIO_D1_PORT,GPIO_Mode_AN,GPIO_PUPD_PU,SDIO_GPIO_D1_PIN); GPIO_out_cfg(SDIO_GPIO_D1_PORT,GPIO_OT_PP,GPIO_SPD_LOW,SDIO_GPIO_D1_PIN); GPIO_af_cfg(SDIO_GPIO_D1_PORT,SDIO_GPIO_D1_SRC,GPIO_AF0); // SDIO_D2 GPIO_set_mode(SDIO_GPIO_D2_PORT,GPIO_Mode_AN,GPIO_PUPD_PU,SDIO_GPIO_D2_PIN); GPIO_out_cfg(SDIO_GPIO_D2_PORT,GPIO_OT_PP,GPIO_SPD_LOW,SDIO_GPIO_D2_PIN); GPIO_af_cfg(SDIO_GPIO_D2_PORT,SDIO_GPIO_D2_SRC,GPIO_AF0); // SDIO_D3 GPIO_set_mode(SDIO_GPIO_D3_PORT,GPIO_Mode_AN,GPIO_PUPD_PU,SDIO_GPIO_D3_PIN); GPIO_out_cfg(SDIO_GPIO_D3_PORT,GPIO_OT_PP,GPIO_SPD_LOW,SDIO_GPIO_D3_PIN); GPIO_af_cfg(SDIO_GPIO_D3_PORT,SDIO_GPIO_D3_SRC,GPIO_AF0); #endif // SDIO_USE_4BIT }
// Initialize the SDIO GPIO lines void SD_GPIO_Init(void) { // Enable the SDIO corresponding GPIO peripherals RCC->AHB2ENR |= SDIO_GPIO_PERIPH; // Configure SDIO GPIO pins // SDIO_CMD GPIO_set_mode(SDIO_GPIO_CMD_PORT,GPIO_Mode_AF,GPIO_PUPD_PU,SDIO_GPIO_CMD_PIN); GPIO_out_cfg(SDIO_GPIO_CMD_PORT,GPIO_OT_PP,GPIO_SPD_HIGH,SDIO_GPIO_CMD_PIN); GPIO_af_cfg(SDIO_GPIO_CMD_PORT,SDIO_GPIO_CMD_SRC,SDIO_GPIO_AF); // SDIO_CK GPIO_set_mode(SDIO_GPIO_CK_PORT,GPIO_Mode_AF,GPIO_PUPD_PU,SDIO_GPIO_CK_PIN); GPIO_out_cfg(SDIO_GPIO_CK_PORT,GPIO_OT_PP,GPIO_SPD_HIGH,SDIO_GPIO_CK_PIN); GPIO_af_cfg(SDIO_GPIO_CK_PORT,SDIO_GPIO_CK_SRC,SDIO_GPIO_AF); // SDIO_D0 GPIO_set_mode(SDIO_GPIO_D0_PORT,GPIO_Mode_AF,GPIO_PUPD_PU,SDIO_GPIO_D0_PIN); GPIO_out_cfg(SDIO_GPIO_D0_PORT,GPIO_OT_PP,GPIO_SPD_HIGH,SDIO_GPIO_D0_PIN); GPIO_af_cfg(SDIO_GPIO_D0_PORT,SDIO_GPIO_D0_SRC,SDIO_GPIO_AF); #if (SDIO_USE_4BIT) // SDIO_D1 GPIO_set_mode(SDIO_GPIO_D1_PORT,GPIO_Mode_AF,GPIO_PUPD_PU,SDIO_GPIO_D1_PIN); GPIO_out_cfg(SDIO_GPIO_D1_PORT,GPIO_OT_PP,GPIO_SPD_HIGH,SDIO_GPIO_D1_PIN); GPIO_af_cfg(SDIO_GPIO_D1_PORT,SDIO_GPIO_D1_SRC,SDIO_GPIO_AF); // SDIO_D2 GPIO_set_mode(SDIO_GPIO_D2_PORT,GPIO_Mode_AF,GPIO_PUPD_PU,SDIO_GPIO_D2_PIN); GPIO_out_cfg(SDIO_GPIO_D2_PORT,GPIO_OT_PP,GPIO_SPD_HIGH,SDIO_GPIO_D2_PIN); GPIO_af_cfg(SDIO_GPIO_D2_PORT,SDIO_GPIO_D2_SRC,SDIO_GPIO_AF); // SDIO_D3 GPIO_set_mode(SDIO_GPIO_D3_PORT,GPIO_Mode_AF,GPIO_PUPD_PU,SDIO_GPIO_D3_PIN); GPIO_out_cfg(SDIO_GPIO_D3_PORT,GPIO_OT_PP,GPIO_SPD_HIGH,SDIO_GPIO_D3_PIN); GPIO_af_cfg(SDIO_GPIO_D3_PORT,SDIO_GPIO_D3_SRC,SDIO_GPIO_AF); #endif // SDIO_USE_4BIT }
int main(void) { // Initialize the MCU clock system SetSysClock(); SystemCoreClockUpdate(); // Prefetch is useful if at least one wait state is needed to access the Flash memory if (RCC_GetLatency() != FLASH_ACR_LATENCY_0WS) { // Enable prefetch buffer (a.k.a ART) RCC_PrefetchEnable(); } // Initialize debug output port (USART2) // clock source: SYSCLK // mode: transmit only USART2_HandleInit(); RCC_SetClockUSART(RCC_USART2_CLK_SRC, RCC_PERIPH_CLK_SYSCLK); USART_Init(&hUSART2, USART_MODE_TX); // Configure USART: // oversampling by 16 // 115200, 8-N-1 // no hardware flow control USART_SetOversampling(&hUSART2, USART_OVERS16); USART_SetBaudRate(&hUSART2, 115200); USART_SetDataMode(&hUSART2, USART_DATAWIDTH_8B, USART_PARITY_NONE, USART_STOPBITS_1); USART_SetHWFlow(&hUSART2, USART_HWCTL_NONE); USART_Enable(&hUSART2); USART_CheckIdleState(&hUSART2, 0xC5C10); // Timeout of about 100ms at 80MHz CPU // Say "hello world" into the USART port RCC_ClocksTypeDef Clocks; RCC_GetClocksFreq(&Clocks); printf("---STM32L476RG---\r\n"); printf("STM32L476 Template (%s @ %s)\r\n", __DATE__, __TIME__); printf("CPU: %.3uMHz\r\n", SystemCoreClock / 1000); printf("SYSCLK: %.3uMHz, HCLK: %.3uMHz\r\n", Clocks.SYSCLK_Frequency / 1000, Clocks.HCLK_Frequency / 1000); printf("APB1: %.3uMHz, APB2: %.3uMHz\r\n", Clocks.PCLK1_Frequency / 1000, Clocks.PCLK2_Frequency / 1000); printf("System clock: %s\r\n", _sysclk_src_str[RCC_GetSysClockSource()]); #if 0 // DEV: 0x461 = STM32L496xx/4A6xx // 0x415 = STM32L475xx/476xx/486xx devices // REV: 0x1000: Rev 1 for STM32L475xx/476xx/486xx devices // Rev A for STM32L496xx/4A6xx devices // 0x1001: Rev 2 for STM32L475xx/476xx/486xx devices // Rev B for STM32L496xx/4A6xx devices // 0x1003: Rev 3 for STM32L475xx/476xx/486xx devices // 0x1007: Rev 4 for STM32L475xx/476xx/486xx devices printf("MCU: DEV=%03X REV=%04X FLASH=%uKB ID=%08X%08X%08X\r\n", DBGMCU->IDCODE & 0xFFFU, // DEV_ID DBGMCU->IDCODE >> 16, // REV_ID (uint16_t)(*(volatile uint32_t*)(FLASHSIZE_BASE)), // Flash size in kilobytes *(volatile uint32_t*)(UID_BASE), // Unique ID 96 bits *(volatile uint32_t*)(UID_BASE + 4U), *(volatile uint32_t*)(UID_BASE + 8U) ); #endif // MCU model // Initialize delay functions Delay_Init(); // Initialize the PA5 pin (LED on the Nucleo board) // Enable the GPIOA peripheral RCC->AHB2ENR |= RCC_AHB2ENR_GPIOAEN; // Configure PA5 as push-pull output without pull-up, at lowest speed GPIO_set_mode(GPIOA, GPIO_Mode_OUT, GPIO_PUPD_NONE, GPIO_PIN_5); GPIO_out_cfg(GPIOA, GPIO_OT_PP, GPIO_SPD_LOW, GPIO_PIN_5); // The main loop while (1) { // Invert the PA5 pin state every half of second Delay_ms(500); GPIO_PIN_INVERT(GPIOA, GPIO_PIN_5); } }