parent
f961a639f4
commit
f064bc6fb6
@ -0,0 +1,85 @@ |
|||||||
|
//
|
||||||
|
// Created by MightyPork on 2017/02/10.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <stm8s.h> |
||||||
|
#include "bootstrap.h" |
||||||
|
|
||||||
|
/** Global time base */ |
||||||
|
volatile uint32_t time_ms; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Putchar for printf |
||||||
|
* @param c - char to print |
||||||
|
*/ |
||||||
|
void putchar(char c) |
||||||
|
{ |
||||||
|
while ((UART1->SR & UART1_SR_TXE) == 0); |
||||||
|
UART1->DR = (u8)c; |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* Init for the chinese STM8 board |
||||||
|
* - enable LED |
||||||
|
* - enable UART @ 115200 |
||||||
|
* - set up UART rx irq |
||||||
|
*/ |
||||||
|
void SimpleInit(void) |
||||||
|
{ |
||||||
|
// Disable default div/8 HSI prescaller
|
||||||
|
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); |
||||||
|
|
||||||
|
// LED
|
||||||
|
GPIO_Init(GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST); |
||||||
|
|
||||||
|
// UART init & enable IRQ
|
||||||
|
UART_SimpleInit(UART_BAUD_115200); |
||||||
|
UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE); |
||||||
|
|
||||||
|
// Timebase generation counter
|
||||||
|
TIM4_UpdateRequestConfig(TIM4_UPDATESOURCE_REGULAR); |
||||||
|
TIM4_PrescalerConfig(TIM4_PRESCALER_128, TIM4_PSCRELOADMODE_IMMEDIATE); |
||||||
|
TIM4_SetAutoreload(0xFF); |
||||||
|
TIM4_ARRPreloadConfig(ENABLE); |
||||||
|
TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE); |
||||||
|
TIM4_Cmd(ENABLE); |
||||||
|
|
||||||
|
enableInterrupts(); |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Timer4 Update/Overflow Interrupt routine. |
||||||
|
* @param None |
||||||
|
* @retval None |
||||||
|
*/ |
||||||
|
INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23) |
||||||
|
{ |
||||||
|
time_ms++; |
||||||
|
TIM4_ClearITPendingBit(TIM4_IT_UPDATE); |
||||||
|
} |
||||||
|
|
||||||
|
/** Delay ms */ |
||||||
|
void Delay(uint16_t ms) |
||||||
|
{ |
||||||
|
uint32_t start = time_ms; |
||||||
|
while ((time_ms - start) < ms); |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* UART1 RX Interrupt routine. |
||||||
|
*/ |
||||||
|
INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18) |
||||||
|
{ |
||||||
|
if (UART1->SR & UART1_SR_RXNE) { |
||||||
|
UART_HandleRx(UART1->DR); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Comment out if custom rx handler is added
|
||||||
|
#if 1 |
||||||
|
void UART_HandleRx(char c) |
||||||
|
{ |
||||||
|
// echo
|
||||||
|
putchar(c); |
||||||
|
} |
||||||
|
#endif |
@ -0,0 +1,58 @@ |
|||||||
|
//
|
||||||
|
// Created by MightyPork on 2017/02/10.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef STM8S_STDINIT_H |
||||||
|
#define STM8S_STDINIT_H |
||||||
|
|
||||||
|
/** Global timebase */ |
||||||
|
extern volatile uint32_t time_ms; |
||||||
|
|
||||||
|
/** Uart IRQ handler */ |
||||||
|
void UART1_RX_IRQHandler(void) INTERRUPT(18); |
||||||
|
|
||||||
|
/** SysTick handler */ |
||||||
|
void TIM4_UPD_OVF_IRQHandler(void) INTERRUPT(23); |
||||||
|
|
||||||
|
/** putchar, used by the SDCC stdlib */ |
||||||
|
void putchar(char c); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple init (UART, LED, timebase) |
||||||
|
*/ |
||||||
|
void SimpleInit(void); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Millisecond delay |
||||||
|
* |
||||||
|
* @param ms - nr of milliseconds |
||||||
|
*/ |
||||||
|
void Delay(uint16_t ms); |
||||||
|
|
||||||
|
/**
|
||||||
|
* User UART rx handler |
||||||
|
* |
||||||
|
* If adding custom handler, comment out the defualt echo impl in bootstrap.c |
||||||
|
* |
||||||
|
* @param c |
||||||
|
*/ |
||||||
|
extern void UART_HandleRx(char c); |
||||||
|
|
||||||
|
/** Toggle indicator LED */ |
||||||
|
inline void LED_Toggle(void) |
||||||
|
{ |
||||||
|
GPIOB->ODR ^= GPIO_PIN_5; |
||||||
|
} |
||||||
|
|
||||||
|
/** Set indicator LED */ |
||||||
|
inline void LED_Set(bool state) |
||||||
|
{ |
||||||
|
if (state) { |
||||||
|
GPIOB->ODR &= ~GPIO_PIN_5; |
||||||
|
} else { |
||||||
|
GPIOB->ODR |= GPIO_PIN_5; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
#endif //STM8S_DEBUG_H
|
Loading…
Reference in new issue