Files
libopencm3-examples/examples/stm32/f4/stm32f429i-discovery/mandelbrot/mandel.c
Karl Palsson be1d296e2f stm32: serial use 115200 baud rate
115200 is a much more sane "default" than 38400.
Instead of a mix of 38400 and 115200, just use 115200 in all places.
There's no reason for modern 32bit cpus to be using such old slow
baudrates.

Tested on f1, f4, l1.  Replaced some old f1 code that predated some
library support code for this.
2019-06-02 20:51:42 +00:00

127 lines
3.4 KiB
C

/*
* This file is part of the libopencm3 project.
*
* Copyright (C) 2009 Uwe Hermann <uwe@hermann-uwe.de>
* Copyright (C) 2011 Stephen Caudle <scaudle@doceme.com>
* Copyright (C) 2012 Daniel Serpell <daniel.serpell@gmail.com>
* Copyright (C) 2015 Piotr Esden-Tempski <piotr@esden.net>
*
* This library is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
#include <libopencm3/stm32/rcc.h>
#include <libopencm3/stm32/gpio.h>
#include <libopencm3/stm32/usart.h>
static void clock_setup(void)
{
/* Enable high-speed clock */
rcc_clock_setup_pll(&rcc_hse_8mhz_3v3[RCC_CLOCK_3V3_168MHZ]);
/* Enable GPIOG clock for LED & USARTs. */
rcc_periph_clock_enable(RCC_GPIOG);
rcc_periph_clock_enable(RCC_GPIOA);
/* Enable clocks for USART1. */
rcc_periph_clock_enable(RCC_USART1);
}
static void usart_setup(void)
{
/* Setup USART1 parameters. */
usart_set_baudrate(USART1, 115200);
usart_set_databits(USART1, 8);
usart_set_stopbits(USART1, USART_STOPBITS_1);
usart_set_mode(USART1, USART_MODE_TX);
usart_set_parity(USART1, USART_PARITY_NONE);
usart_set_flow_control(USART1, USART_FLOWCONTROL_NONE);
/* Finally enable the USART. */
usart_enable(USART1);
}
static void gpio_setup(void)
{
/* Setup GPIO pin GPIO13 on GPIO port G for LED. */
gpio_mode_setup(GPIOG, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO13);
/* Setup GPIO pins for USART1 transmit. */
gpio_mode_setup(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO9);
/* Setup USART1 TX pin as alternate function. */
gpio_set_af(GPIOA, GPIO_AF7, GPIO9);
}
/* Maximum number of iterations for the escape-time calculation */
#define maxIter 32
/* This array converts the iteration count to a character representation. */
static char color[maxIter+1] = " .:++xxXXX%%%%%%################";
/* Main mandelbrot calculation */
static int iterate(float px, float py)
{
int it = 0;
float x = 0, y = 0;
while (it < maxIter) {
float nx = x*x;
float ny = y*y;
if ((nx + ny) > 4) {
return it;
}
/* Zn+1 = Zn^2 + P */
y = 2*x*y + py;
x = nx - ny + px;
it++;
}
return 0;
}
static void mandel(float cX, float cY, float scale)
{
int x, y;
for (x = -60; x < 60; x++) {
for (y = -50; y < 50; y++) {
int i = iterate(cX + x*scale, cY + y*scale);
usart_send_blocking(USART1, color[i]);
}
usart_send_blocking(USART1, '\r');
usart_send_blocking(USART1, '\n');
}
}
int main(void)
{
float scale = 0.25f, centerX = -0.5f, centerY = 0.0f;
clock_setup();
gpio_setup();
usart_setup();
while (1) {
/* Blink the LED (PG13) on the board with each fractal drawn. */
gpio_toggle(GPIOG, GPIO13); /* LED on/off */
mandel(centerX, centerY, scale); /* draw mandelbrot */
/* Change scale and center */
centerX += 0.175f * scale;
centerY += 0.522f * scale;
scale *= 0.875f;
usart_send_blocking(USART1, '\r');
usart_send_blocking(USART1, '\n');
}
return 0;
}