<divid="app"><divclass="Layout"data-v-5d98c3a5><!--[--><!--]--><!--[--><spantabindex="-1"data-v-0f60ec36></span><ahref="#VPContent"class="VPSkipLink visually-hidden"data-v-0f60ec36> Skip to content </a><!--]--><!----><headerclass="VPNav"data-v-5d98c3a5data-v-ae24b3ad><divclass="VPNavBar has-sidebar top"data-v-ae24b3addata-v-ccf7ddec><divclass="wrapper"data-v-ccf7ddec><divclass="container"data-v-ccf7ddec><divclass="title"data-v-ccf7ddec><divclass="VPNavBarTitle has-sidebar"data-v-ccf7ddecdata-v-ab179fa1><aclass="title"href="/"data-v-ab179fa1><!--[--><!--]--><!--[--><!--[--><!--[--><imgclass="VPImage dark logo"src="/qmk-logo-dark.svg"altdata-v-8426fc1a><!--]--><!--[--><imgclass="VPImage light logo"src="/qmk-logo-light.svg"altdata-v-8426fc1a><!--]--><!--]--><!--]--><spandata-v-ab179fa1>QMK Firmware</span><!--[--><!--]--></a></div></div><divclass="content"data-v-ccf7ddec><divclass="content-body"data-v-ccf7ddec><!--[--><!--]--><divclass="VPNavBarSearch search"data-v-ccf7ddec><!--[--><!----><divid="local-search"><buttontype="button"class="DocSearch DocSearch-Button"aria-label="Search"><spanclass="DocSearch-Button-Container"><spanclass="vp-icon DocSearch-Search-Icon"></span><spanclass="DocSearch-Button-Placeholder">Search</span></span><spanclass="DocSearch-Button-Keys"><kbdclass="DocSearch-Button-Key"></kbd><kbdclass="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><navaria-labelledby="main-nav-aria-label"class="VPNavBarMenu menu"data-v-ccf7ddecdata-v-7f418b0f><spanid="main-nav-aria-label"class="visually-hidden"data-v-7f418b0f>Main Navigation</span><!--[--><!--[--><aclass="VPLink link VPNavBarMenuLink"href="./"tabindex="0"data-v-7f418b0fdata-v-9c663999><!--[--><spandata-v-9c663999>Home</span><!--]--></a><!--]--><!--]--></nav><!----><divclass="VPNavBarAppearance appearance"data-v-ccf7ddecdata-v-e6aabb21><buttonclass="VPSwitch VPSwitchAppearance"type="button"role="switch"title="Switch to dark theme"aria-checked="false"data-v-e6aabb21data-v-d1f28634data-v-1d5665e3><spanclass="check"data-v-1d5665e3><spanclass="icon"data-v-1d5665e3><!--[--><spanclass="vpi-sun sun"data-v-d1f28634></span><spanclass="vpi-moon moon"data-v-d1f28634></span><!--]--></span></span></button></div><divclass="VPSocialLinks VPNavBarSocialLinks social-links"data-v-ccf7ddecdata-v-0394ad82data-v-7bc22406><!--[--><aclass="VPSocialLink no-icon"href="https://reddit.com/r/olkb"aria-labeltarget="_blank"rel="noopener"data-v-7bc22406data-v-eee4e7cb><svgxmlns="http://www.w3.org/2000/svg"viewBox="0 0 50 50"width="50px"height="50px"><pathd="M293C28.0625327.1640633.38281326.54C25.8359384.61718825.3632815.433594256.40625C24.3554698.14062524.08593810.39453124.0312513.03125C19.23437513.17968814.82031314.42187511.2812516.46875C10.21484415.468758.85546914.968757.514.96875C6.08984414.968754.67578115.5117193.5937516.59375C1.42578118.7617191.42578122.2382813.5937524.40625L3.8437524.65625C3.312526.035156327.488281329C333.5273445.56640637.5859389.562540.4375C13.55859443.28906319.007813452545C30.9921884536.44140643.28906340.437540.4375C44.43359437.5859384733.5273444729C4727.48828146.687526.03515646.1562524.65625L46.4062524.40625C48.57421922.23828148.57421918.76171946.4062516.59375C45.32421915.51171943.91015614.9687542.514.96875C41.14453114.9687539.78515615.4687538.7187516.46875C35.19531314.43359430.80078113.19140626.0312513.03125C26.0937510.54687526.3632818.4687526.8757.09375C27.1640636.31640627.5273445.75781327.8755.4375C28.2226565.11718828.5390635295C29.460938529.6835945.12530.031255.40625C30.3789065.687530.7851566.14843831.31256.6875C32.2539067.65234433.6953138.71484436.093758.9375C36.53906311.23828138.574219134113C43.75134610.75468C465.2543.753413C38.605469336.5742194.71093836.093756.96875C34.31256.79687533.5273446.10937532.755.3125C32.3007814.85156331.886719
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">#define</span><spanstyle="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> STM32_SERIAL_USE_USART2</span><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> TRUE</span></span></code></pre></div><p>Configuration-wise, you'll need to set up the peripheral as per your MCU's datasheet -- the defaults match the pins for a Proton-C, i.e. STM32F303.</p><table><thead><tr><th><code>config.h</code> override</th><th>Description</th><th>Default Value</th></tr></thead><tbody><tr><td><code>#define UART_DRIVER</code></td><td>USART peripheral to use - USART1 -><code>SD1</code>, USART2 -><code>SD2</code> etc.</td><td><code>SD1</code></td></tr><tr><td><code>#define UART_TX_PIN</code></td><td>The pin to use for TX</td><td><code>A9</code></td></tr><tr><td><code>#define UART_TX_PAL_MODE</code></td><td>The alternate function mode for TX</td><td><code>7</code></td></tr><tr><td><code>#define UART_RX_PIN</code></td><td>The pin to use for RX</td><td><code>A10</code></td></tr><tr><td><code>#define UART_RX_PAL_MODE</code></td><td>The alternate function mode for RX</td><td><code>7</code></td></tr><tr><td><code>#define UART_CTS_PIN</code></td><td>The pin to use for CTS</td><td><code>A11</code></td></tr><tr><td><code>#define UART_CTS_PAL_MODE</code></td><td>The alternate function mode for CTS</td><td><code>7</code></td></tr><tr><td><code>#define UART_RTS_PIN</code></td><td>The pin to use for RTS</td><td><code>A12</code></td></tr><tr><td><code>#define UART_RTS_PAL_MODE</code></td><td>The alternate function mode for RTS</td><td><code>7</code></td></tr></tbody></table><h2id="api"tabindex="-1">API <aclass="header-anchor"href="#api"aria-label="Permalink to "API {#api}""></a></h2><h3id="api-uart-init"tabindex="-1"><code>void uart_init(uint32_t baud)</code><aclass="header-anchor"href="#api-uart-init"aria-label="Permalink to "`void uart_init(uint32_t baud)` {#api-uart-init}""></a></h3><p>Initialize the UART driver. This function must be called only once, before any of the below functions can be called.</p><h4id="api-uart-init-arguments"tabindex="-1">Arguments <aclass="header-anchor"href="#api-uart-init-arguments"aria-label="Permalink to "Arguments {#api-uart-init-arguments}""></a></h4><ul><li><code>uint32_t baud</code><br> The baud rate to transmit and receive at. This may depend on the device you are communicating with. Common values are 1200, 2400, 4800, 9600, 19200, 38400, 57600, and 115200.</li></ul><hr><h3id="api-uart-write"tabindex="-1"><code>void uart_write(uint8_t data)</code><aclass="header-anchor"href="#api-uart-write"aria-label="Permalink to "`void uart_write(uint8_t data)` {#api-uart-write}""></a></h3><p>Transmit a single byte.</p><h4id="api-uart-write-arguments"tabindex="-1">Arguments <aclass="header-anchor"href="#api-uart-write-arguments"aria-label="Permalink to "Arguments {#api-uart-write-arguments}""></a></h4><ul><li><code>uint8_t data</code><br> The byte to write.</li></ul><hr><h3id="api-uart-read"tabindex="-1"><code>uint8_t uart_read(void)</code><aclass="header-anchor"href="#api-uart-read"aria-label="Permalink to "`uint8_t uart_read(void)` {#api-uart-read}""></a></h3><p>Receive a single byte.</p><h4id="api-uart-read-return"tabindex="-1">Return Value <aclass="header-anchor"href="#api-uart-read-return"aria-label="Permalink to "Return Value {#api-uart-read-return}""></a></h4><p>The byte read from the receive buffer. This function will block if the buffer is empty (ie. no data to read).</p><hr><h3id="api-uart-transmit"tabindex="-1"><code>void uart_transmit(const uint8_t *data, uint16_t length)</code><aclass="header-anchor"href="#api-uart-transmit"aria-label="Permalink to "`void uart_transmit(const uint8_t *data, uint16_t length)` {#api-uart-transmit}""></a></h3><p>Transmit multiple bytes.</p><h4id="api-uart-transmit-arguments"tabindex="-1">Arguments <aclass="header-anchor"href="#api-uart-transmit-ar