Inlined STM8S SPL (STM8S103) for use with SDCC
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

70 lines
1.2 KiB

#include "stm8s.h"
#include <stdlib.h>
void Delay(uint16_t nCount) {
uint8_t i;
for (; nCount != 0; nCount--) {
for (i = 255; i != 0; i--) {}
}
}
void putchar(char c) {
while ((UART1->SR & UART1_SR_TXE) == 0);
UART1->DR = (u8)c;
}
void puts(const char *ch) {
char c;
while ((c = *ch++) != 0)
putchar(c);
}
void puts_itoa(int32_t n, unsigned char radix) {
char s[10], i, c;
_ltoa(n, s, radix);
i = 0;
while((c = s[i++]) != 0) {
putchar(c);
}
}
void main(void)
{
// Disable div8
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
// LED for blinking
GPIO_Init(GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST);
// minimal uart init
UART_SimpleInit(UART_BAUD_115200);
// irq conf
UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);
enableInterrupts();
// Clear screen & print system frequency
puts("\033c\033[?25lClock freq = "); // cls
puts_itoa(CLK_GetClockFreq(), 10);
puts(" Hz"); // cls
// echo & blinking
while (1) {
Delay(2000);
GPIOB->ODR ^= GPIO_PIN_5;
}
}
/**
* @brief UART1 RX Interrupt routine.
* @param None
* @retval None
*/
INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
{
if (UART1->SR & UART1_SR_RXNE)
UART1->DR = (u8) (UART1->DR); // echo
if (UART1->SR & UART1_SR_OR)
UART1->SR &= ~UART1_SR_OR; // clear OR flag
}