From f4d058155a00d6f3f380945e53a12e5180f3b2a6 Mon Sep 17 00:00:00 2001 From: "Sergio R. Caprile" Date: Fri, 20 Jan 2023 17:12:13 -0300 Subject: [PATCH] Fix UART1,2 clocking in all other examples --- .../FreeRTOSConfig.h | 2 +- .../stm32/nucleo-f429zi-freertos-mip/main.c | 2 +- .../stm32/nucleo-f429zi-freertos-mip/mcu.h | 14 +++++++----- examples/stm32/nucleo-f429zi-usb-rndis/main.c | 2 +- examples/stm32/nucleo-f429zi-usb-rndis/mcu.h | 14 +++++++----- examples/stm32/nucleo-f746zg-baremetal/main.c | 2 +- examples/stm32/nucleo-f746zg-baremetal/mcu.h | 22 +++++++++---------- .../FreeRTOSConfig.h | 2 +- .../stm32/nucleo-f746zg-freertos-mip/main.c | 2 +- .../stm32/nucleo-f746zg-freertos-mip/mcu.h | 22 +++++++++---------- examples/stm32/nucleo-f746zg-usb-rndis/main.c | 2 +- examples/stm32/nucleo-f746zg-usb-rndis/mcu.h | 16 ++++++++------ 12 files changed, 52 insertions(+), 50 deletions(-) diff --git a/examples/stm32/nucleo-f429zi-freertos-mip/FreeRTOSConfig.h b/examples/stm32/nucleo-f429zi-freertos-mip/FreeRTOSConfig.h index eb671b84..860822b8 100644 --- a/examples/stm32/nucleo-f429zi-freertos-mip/FreeRTOSConfig.h +++ b/examples/stm32/nucleo-f429zi-freertos-mip/FreeRTOSConfig.h @@ -3,7 +3,7 @@ #include "mcu.h" #define configUSE_PREEMPTION 1 -#define configCPU_CLOCK_HZ FREQ +#define configCPU_CLOCK_HZ SYS_FREQUENCY #define configTICK_RATE_HZ 1000 #define configMAX_PRIORITIES 5 #define configUSE_16_BIT_TICKS 0 diff --git a/examples/stm32/nucleo-f429zi-freertos-mip/main.c b/examples/stm32/nucleo-f429zi-freertos-mip/main.c index 8dba74d3..8e3588eb 100644 --- a/examples/stm32/nucleo-f429zi-freertos-mip/main.c +++ b/examples/stm32/nucleo-f429zi-freertos-mip/main.c @@ -75,7 +75,7 @@ static void blinker(void *args) { int main(void) { clock_init(); // Set clock to max of 180 MHz - systick_init(FREQ / 1000); // Tick every 1 ms + systick_init(SYS_FREQUENCY / 1000); // Tick every 1 ms uart_init(UART3, 115200); // Initialise UART xTaskCreate(blinker, "blinker", 128, ":)", configMAX_PRIORITIES - 1, NULL); xTaskCreate(server, "server", 2048, 0, configMAX_PRIORITIES - 1, NULL); diff --git a/examples/stm32/nucleo-f429zi-freertos-mip/mcu.h b/examples/stm32/nucleo-f429zi-freertos-mip/mcu.h index a5939362..2b90a2db 100644 --- a/examples/stm32/nucleo-f429zi-freertos-mip/mcu.h +++ b/examples/stm32/nucleo-f429zi-freertos-mip/mcu.h @@ -23,9 +23,10 @@ // 33.4: The AHB clock must be at least 25 MHz when Ethernet is used enum { APB1_PRE = 5 /* AHB clock / 4 */, APB2_PRE = 4 /* AHB clock / 2 */ }; enum { PLL_HSI = 16, PLL_M = 8, PLL_N = 180, PLL_P = 2 }; // Run at 180 Mhz -#define PLL_FREQ (PLL_HSI * PLL_N / PLL_M / PLL_P) #define FLASH_LATENCY 5 -#define FREQ (PLL_FREQ * 1000000) // CPU frequency +#define SYS_FREQUENCY ((PLL_HSI * PLL_N / PLL_M / PLL_P) * 1000000) +#define APB2_FREQUENCY (SYS_FREQUENCY / (BIT(APB2_PRE - 3))) +#define APB1_FREQUENCY (SYS_FREQUENCY / (BIT(APB1_PRE - 3))) static inline void spin(volatile uint32_t count) { while (count--) asm("nop"); @@ -104,10 +105,11 @@ static inline void uart_init(USART_TypeDef *uart, unsigned long baud) { // https://www.st.com/resource/en/datasheet/stm32f429zi.pdf uint8_t af = 7; // Alternate function uint16_t rx = 0, tx = 0; // pins + uint32_t freq = 0; // Bus frequency. UART1 is on APB2, rest on APB1 - if (uart == UART1) RCC->APB2ENR |= BIT(4); - if (uart == UART2) RCC->APB1ENR |= BIT(17); - if (uart == UART3) RCC->APB1ENR |= BIT(18); + if (uart == UART1) freq = APB2_FREQUENCY, RCC->APB2ENR |= BIT(4); + if (uart == UART2) freq = APB1_FREQUENCY, RCC->APB1ENR |= BIT(17); + if (uart == UART3) freq = APB1_FREQUENCY, RCC->APB1ENR |= BIT(18); if (uart == UART1) tx = PIN('A', 9), rx = PIN('A', 10); if (uart == UART2) tx = PIN('A', 2), rx = PIN('A', 3); @@ -116,7 +118,7 @@ static inline void uart_init(USART_TypeDef *uart, unsigned long baud) { gpio_init(tx, GPIO_MODE_AF, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH, 0, af); gpio_init(rx, GPIO_MODE_AF, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH, 0, af); uart->CR1 = 0; // Disable this UART - uart->BRR = FREQ / APB2_PRE / baud; // FREQ is a CPU frequency + uart->BRR = freq / baud; // Set baud rate uart->CR1 |= BIT(13) | BIT(2) | BIT(3); // Set UE, RE, TE } diff --git a/examples/stm32/nucleo-f429zi-usb-rndis/main.c b/examples/stm32/nucleo-f429zi-usb-rndis/main.c index 3a9a7a63..d0993bbe 100644 --- a/examples/stm32/nucleo-f429zi-usb-rndis/main.c +++ b/examples/stm32/nucleo-f429zi-usb-rndis/main.c @@ -8,7 +8,7 @@ #define LED PIN('B', 7) // On-board LED pin (blue) static uint64_t s_ticks; static struct mip_if *s_ifp; -uint32_t SystemCoreClock = FREQ; +uint32_t SystemCoreClock = SYS_FREQUENCY; const uint8_t tud_network_mac_address[6] = {2, 2, 0x84, 0x6A, 0x96, 0}; static void blink_cb(void *arg) { // Blink periodically diff --git a/examples/stm32/nucleo-f429zi-usb-rndis/mcu.h b/examples/stm32/nucleo-f429zi-usb-rndis/mcu.h index d10aadc1..e11a2a97 100644 --- a/examples/stm32/nucleo-f429zi-usb-rndis/mcu.h +++ b/examples/stm32/nucleo-f429zi-usb-rndis/mcu.h @@ -25,9 +25,10 @@ // 33.4: The AHB clock must be at least 25 MHz when Ethernet is used enum { APB1_PRE = 5 /* AHB clock / 4 */, APB2_PRE = 4 /* AHB clock / 2 */ }; enum { PLL_HSI = 16, PLL_M = 8, PLL_N = 168, PLL_P = 2, PLL_Q = 7 }; -#define PLL_FREQ (PLL_HSI * PLL_N / PLL_M / PLL_P) #define FLASH_LATENCY 5 -#define FREQ (PLL_FREQ * 1000000) // Core 168 MHz, USB 48 MHz +#define SYS_FREQUENCY ((PLL_HSI * PLL_N / PLL_M / PLL_P) * 1000000) // Core 168 MHz, USB 48 MHz +#define APB2_FREQUENCY (SYS_FREQUENCY / (BIT(APB2_PRE - 3))) +#define APB1_FREQUENCY (SYS_FREQUENCY / (BIT(APB1_PRE - 3))) static inline void spin(volatile uint32_t count) { while (count--) asm("nop"); @@ -93,10 +94,11 @@ static inline void gpio_init(uint16_t pin, uint8_t mode, uint8_t type, static inline void uart_init(USART_TypeDef *uart, unsigned long baud) { uint8_t af = 7; // Alternate function uint16_t rx = 0, tx = 0; // pins + uint32_t freq = 0; // Bus frequency. UART1 is on APB2, rest on APB1 - if (uart == UART1) RCC->APB2ENR |= BIT(4); - if (uart == UART2) RCC->APB1ENR |= BIT(17); - if (uart == UART3) RCC->APB1ENR |= BIT(18); + if (uart == UART1) freq = APB2_FREQUENCY, RCC->APB2ENR |= BIT(4); + if (uart == UART2) freq = APB1_FREQUENCY, RCC->APB1ENR |= BIT(17); + if (uart == UART3) freq = APB1_FREQUENCY, RCC->APB1ENR |= BIT(18); if (uart == UART1) tx = PIN('A', 9), rx = PIN('A', 10); if (uart == UART2) tx = PIN('A', 2), rx = PIN('A', 3); @@ -107,7 +109,7 @@ static inline void uart_init(USART_TypeDef *uart, unsigned long baud) { gpio_set_mode(rx, GPIO_MODE_AF); gpio_set_af(rx, af); uart->CR1 = 0; // Disable this UART - uart->BRR = FREQ / APB2_PRE / baud; // FREQ is a CPU frequency + uart->BRR = freq / baud; // Set baud rate uart->CR1 |= BIT(13) | BIT(2) | BIT(3); // Set UE, RE, TE } diff --git a/examples/stm32/nucleo-f746zg-baremetal/main.c b/examples/stm32/nucleo-f746zg-baremetal/main.c index d6770fe7..2a0196b5 100644 --- a/examples/stm32/nucleo-f746zg-baremetal/main.c +++ b/examples/stm32/nucleo-f746zg-baremetal/main.c @@ -39,7 +39,7 @@ void EXTI15_10_IRQHandler(void) { // External interrupt handler int main(void) { static struct uart *uart = UART3; // Use UART3 - its attached to debug clock_init(); // Set clock to 216MHz - systick_init(FREQ / 1000); // Increment s_ticks every ms + systick_init(SYS_FREQUENCY / 1000); // Increment s_ticks every ms gpio_output(LED1); // Setup green LED gpio_output(LED2); // Setup blue LED gpio_input(BTN1); // Set button to input diff --git a/examples/stm32/nucleo-f746zg-baremetal/mcu.h b/examples/stm32/nucleo-f746zg-baremetal/mcu.h index 37317828..6acd6417 100644 --- a/examples/stm32/nucleo-f746zg-baremetal/mcu.h +++ b/examples/stm32/nucleo-f746zg-baremetal/mcu.h @@ -21,10 +21,10 @@ 38.4: The AHB clock frequency must be at least 25 MHz when the Ethernet controller is used */ enum { APB1_PRE = 5 /* AHB clock / 4 */, APB2_PRE = 4 /* AHB clock / 2 */ }; enum { PLL_HSI = 16, PLL_M = 8, PLL_N = 216, PLL_P = 2 }; // Run at 216 Mhz -//#define PLL_FREQ PLL_HSI -#define PLL_FREQ (PLL_HSI * PLL_N / PLL_M / PLL_P) #define FLASH_LATENCY 7 -#define FREQ (PLL_FREQ * 1000000) +#define SYS_FREQUENCY ((PLL_HSI * PLL_N / PLL_M / PLL_P) * 1000000) +#define APB2_FREQUENCY (SYS_FREQUENCY / (BIT(APB2_PRE - 3))) +#define APB1_FREQUENCY (SYS_FREQUENCY / (BIT(APB1_PRE - 3))) static inline void spin(volatile uint32_t count) { while (count--) asm("nop"); @@ -94,13 +94,11 @@ struct gpio { }; #define GPIO(N) ((struct gpio *) (0x40020000 + 0x400 * (N))) -static struct gpio *gpio_bank(uint16_t pin) { - return GPIO(PINBANK(pin)); -} +static struct gpio *gpio_bank(uint16_t pin) { return GPIO(PINBANK(pin)); } static inline void gpio_toggle(uint16_t pin) { struct gpio *gpio = gpio_bank(pin); uint32_t mask = BIT(PINNO(pin)); - gpio->BSRR |= mask << (gpio->ODR & mask ? 16 : 0); + gpio->BSRR = mask << (gpio->ODR & mask ? 16 : 0); } static inline int gpio_read(uint16_t pin) { return gpio_bank(pin)->IDR & BIT(PINNO(pin)) ? 1 : 0; @@ -164,10 +162,11 @@ static inline void uart_init(struct uart *uart, unsigned long baud) { // https://www.st.com/resource/en/datasheet/stm32f746zg.pdf uint8_t af = 7; // Alternate function uint16_t rx = 0, tx = 0; // pins + uint32_t freq = 0; // Bus frequency. UART1 is on APB2, rest on APB1 - if (uart == UART1) RCC->APB2ENR |= BIT(4); - if (uart == UART2) RCC->APB1ENR |= BIT(17); - if (uart == UART3) RCC->APB1ENR |= BIT(18); + if (uart == UART1) freq = APB2_FREQUENCY, RCC->APB2ENR |= BIT(4); + if (uart == UART2) freq = APB1_FREQUENCY, RCC->APB1ENR |= BIT(17); + if (uart == UART3) freq = APB1_FREQUENCY, RCC->APB1ENR |= BIT(18); if (uart == UART1) tx = PIN('A', 9), rx = PIN('A', 10); if (uart == UART2) tx = PIN('A', 2), rx = PIN('A', 3); @@ -176,8 +175,7 @@ static inline void uart_init(struct uart *uart, unsigned long baud) { gpio_init(tx, GPIO_MODE_AF, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH, 0, af); gpio_init(rx, GPIO_MODE_AF, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH, 0, af); uart->CR1 = 0; // Disable this UART - uart->BRR = FREQ / 4 / baud; // Baud rate, "4" is APBx prescaler, different from APBx_PRE - // TODO(): make this configurable ? + uart->BRR = freq / baud; // Set baud rate uart->CR1 |= BIT(0) | BIT(2) | BIT(3); // Set UE, RE, TE } static inline void uart_write_byte(struct uart *uart, uint8_t byte) { diff --git a/examples/stm32/nucleo-f746zg-freertos-mip/FreeRTOSConfig.h b/examples/stm32/nucleo-f746zg-freertos-mip/FreeRTOSConfig.h index e4ba7559..f67f11bf 100644 --- a/examples/stm32/nucleo-f746zg-freertos-mip/FreeRTOSConfig.h +++ b/examples/stm32/nucleo-f746zg-freertos-mip/FreeRTOSConfig.h @@ -3,7 +3,7 @@ #include "mcu.h" #define configUSE_PREEMPTION 1 -#define configCPU_CLOCK_HZ FREQ +#define configCPU_CLOCK_HZ SYS_FREQUENCY #define configTICK_RATE_HZ 1000 #define configMAX_PRIORITIES 5 #define configUSE_16_BIT_TICKS 0 diff --git a/examples/stm32/nucleo-f746zg-freertos-mip/main.c b/examples/stm32/nucleo-f746zg-freertos-mip/main.c index bdfab575..e59e8795 100644 --- a/examples/stm32/nucleo-f746zg-freertos-mip/main.c +++ b/examples/stm32/nucleo-f746zg-freertos-mip/main.c @@ -74,7 +74,7 @@ static void blinker(void *args) { int main(void) { clock_init(); // Set clock to max of 180 MHz - systick_init(FREQ / 1000); // Tick every 1 ms + systick_init(SYS_FREQUENCY / 1000); // Tick every 1 ms uart_init(UART3, 115200); // Initialise UART xTaskCreate(blinker, "blinker", 128, ":)", configMAX_PRIORITIES - 1, NULL); xTaskCreate(server, "server", 2048, 0, configMAX_PRIORITIES - 1, NULL); diff --git a/examples/stm32/nucleo-f746zg-freertos-mip/mcu.h b/examples/stm32/nucleo-f746zg-freertos-mip/mcu.h index 37317828..6acd6417 100644 --- a/examples/stm32/nucleo-f746zg-freertos-mip/mcu.h +++ b/examples/stm32/nucleo-f746zg-freertos-mip/mcu.h @@ -21,10 +21,10 @@ 38.4: The AHB clock frequency must be at least 25 MHz when the Ethernet controller is used */ enum { APB1_PRE = 5 /* AHB clock / 4 */, APB2_PRE = 4 /* AHB clock / 2 */ }; enum { PLL_HSI = 16, PLL_M = 8, PLL_N = 216, PLL_P = 2 }; // Run at 216 Mhz -//#define PLL_FREQ PLL_HSI -#define PLL_FREQ (PLL_HSI * PLL_N / PLL_M / PLL_P) #define FLASH_LATENCY 7 -#define FREQ (PLL_FREQ * 1000000) +#define SYS_FREQUENCY ((PLL_HSI * PLL_N / PLL_M / PLL_P) * 1000000) +#define APB2_FREQUENCY (SYS_FREQUENCY / (BIT(APB2_PRE - 3))) +#define APB1_FREQUENCY (SYS_FREQUENCY / (BIT(APB1_PRE - 3))) static inline void spin(volatile uint32_t count) { while (count--) asm("nop"); @@ -94,13 +94,11 @@ struct gpio { }; #define GPIO(N) ((struct gpio *) (0x40020000 + 0x400 * (N))) -static struct gpio *gpio_bank(uint16_t pin) { - return GPIO(PINBANK(pin)); -} +static struct gpio *gpio_bank(uint16_t pin) { return GPIO(PINBANK(pin)); } static inline void gpio_toggle(uint16_t pin) { struct gpio *gpio = gpio_bank(pin); uint32_t mask = BIT(PINNO(pin)); - gpio->BSRR |= mask << (gpio->ODR & mask ? 16 : 0); + gpio->BSRR = mask << (gpio->ODR & mask ? 16 : 0); } static inline int gpio_read(uint16_t pin) { return gpio_bank(pin)->IDR & BIT(PINNO(pin)) ? 1 : 0; @@ -164,10 +162,11 @@ static inline void uart_init(struct uart *uart, unsigned long baud) { // https://www.st.com/resource/en/datasheet/stm32f746zg.pdf uint8_t af = 7; // Alternate function uint16_t rx = 0, tx = 0; // pins + uint32_t freq = 0; // Bus frequency. UART1 is on APB2, rest on APB1 - if (uart == UART1) RCC->APB2ENR |= BIT(4); - if (uart == UART2) RCC->APB1ENR |= BIT(17); - if (uart == UART3) RCC->APB1ENR |= BIT(18); + if (uart == UART1) freq = APB2_FREQUENCY, RCC->APB2ENR |= BIT(4); + if (uart == UART2) freq = APB1_FREQUENCY, RCC->APB1ENR |= BIT(17); + if (uart == UART3) freq = APB1_FREQUENCY, RCC->APB1ENR |= BIT(18); if (uart == UART1) tx = PIN('A', 9), rx = PIN('A', 10); if (uart == UART2) tx = PIN('A', 2), rx = PIN('A', 3); @@ -176,8 +175,7 @@ static inline void uart_init(struct uart *uart, unsigned long baud) { gpio_init(tx, GPIO_MODE_AF, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH, 0, af); gpio_init(rx, GPIO_MODE_AF, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH, 0, af); uart->CR1 = 0; // Disable this UART - uart->BRR = FREQ / 4 / baud; // Baud rate, "4" is APBx prescaler, different from APBx_PRE - // TODO(): make this configurable ? + uart->BRR = freq / baud; // Set baud rate uart->CR1 |= BIT(0) | BIT(2) | BIT(3); // Set UE, RE, TE } static inline void uart_write_byte(struct uart *uart, uint8_t byte) { diff --git a/examples/stm32/nucleo-f746zg-usb-rndis/main.c b/examples/stm32/nucleo-f746zg-usb-rndis/main.c index 520a5a1f..9112d056 100644 --- a/examples/stm32/nucleo-f746zg-usb-rndis/main.c +++ b/examples/stm32/nucleo-f746zg-usb-rndis/main.c @@ -8,7 +8,7 @@ #define LED PIN('B', 7) // On-board LED pin (blue) static uint64_t s_ticks; static struct mip_if *s_ifp; -uint32_t SystemCoreClock = FREQ; +uint32_t SystemCoreClock = SYS_FREQUENCY; const uint8_t tud_network_mac_address[6] = {2, 2, 0x84, 0x6A, 0x96, 0}; static void blink_cb(void *arg) { // Blink periodically diff --git a/examples/stm32/nucleo-f746zg-usb-rndis/mcu.h b/examples/stm32/nucleo-f746zg-usb-rndis/mcu.h index 3069208a..f02c1269 100644 --- a/examples/stm32/nucleo-f746zg-usb-rndis/mcu.h +++ b/examples/stm32/nucleo-f746zg-usb-rndis/mcu.h @@ -25,9 +25,10 @@ controller is used */ enum { APB1_PRE = 5 /* AHB clock / 4 */, APB2_PRE = 4 /* AHB clock / 2 */ }; enum { PLL_HSI = 16, PLL_M = 8, PLL_N = 216, PLL_P = 2, PLL_Q = 9 }; -#define PLL_FREQ (PLL_HSI * PLL_N / PLL_M / PLL_P) -#define FLASH_LATENCY 7 -#define FREQ (PLL_FREQ * 1000000) // Core 216 MHz, USB 48 MHz +#define FLASH_LATENCY 7 +#define SYS_FREQUENCY ((PLL_HSI * PLL_N / PLL_M / PLL_P) * 1000000) // Core 216 MHz, USB 48 MHz +#define APB2_FREQUENCY (SYS_FREQUENCY / (BIT(APB2_PRE - 3))) +#define APB1_FREQUENCY (SYS_FREQUENCY / (BIT(APB1_PRE - 3))) static inline void spin(volatile uint32_t count) { while (count--) asm("nop"); @@ -93,10 +94,11 @@ static inline void uart_init(USART_TypeDef *uart, unsigned long baud) { // https://www.st.com/resource/en/datasheet/stm32f746zg.pdf uint8_t af = 7; // Alternate function uint16_t rx = 0, tx = 0; // pins + uint32_t freq = 0; // Bus frequency. UART1 is on APB2, rest on APB1 - if (uart == UART1) RCC->APB2ENR |= BIT(4); - if (uart == UART2) RCC->APB1ENR |= BIT(17); - if (uart == UART3) RCC->APB1ENR |= BIT(18); + if (uart == UART1) freq = APB2_FREQUENCY, RCC->APB2ENR |= BIT(4); + if (uart == UART2) freq = APB1_FREQUENCY, RCC->APB1ENR |= BIT(17); + if (uart == UART3) freq = APB1_FREQUENCY, RCC->APB1ENR |= BIT(18); if (uart == UART1) tx = PIN('A', 9), rx = PIN('A', 10); if (uart == UART2) tx = PIN('A', 2), rx = PIN('A', 3); @@ -107,7 +109,7 @@ static inline void uart_init(USART_TypeDef *uart, unsigned long baud) { gpio_set_mode(rx, GPIO_MODE_AF); gpio_set_af(rx, af); uart->CR1 = 0; // Disable this UART - uart->BRR = FREQ / APB2_PRE / baud; // FREQ is a CPU frequency + uart->BRR = freq / baud; // Set baud rate uart->CR1 |= BIT(0) | BIT(2) | BIT(3); // Set UE, RE, TE }