硬件平台:stm8s103
编译环境:IAR for stm8
#include <iostm8s103f3.h>
#include <intrinsics.h>
//
// 设置系统时钟为内部16MHz
//
void InitialiseSystemClock()
{
CLK_ICKR = 0; // 复位内部时钟寄存器
CLK_ICKR_HSIEN = 1; // 使能 HSI
CLK_ECKR = 0; // 禁用外部时钟
while (CLK_ICKR_HSIRDY == 0); // 等待HSI准备好
CLK_CKDIVR = 0; // 确定时钟全速运行
CLK_PCKENR1 = 0xff; // 使能所有外设时钟
CLK_PCKENR2 = 0xff; // 同上
CLK_CCOR = 0; // 关闭CCO Turn off CCO
CLK_HSITRIMR = 0; // 关闭所有HSI trimming
CLK_SWIMCCR = 0; // 设置SWIM分频=系统时钟/2
CLK_SWR = 0xe1; // 使用HSI作为时钟源
CLK_SWCR = 0; // 复位时钟开关控制寄存器
CLK_SWCR_SWEN = 1; // 开关使能
while (CLK_SWCR_SWBSY != 0); // 如果时钟忙,继续等待
}
//
//
//
//以上设置依赖系统时钟为16 MHz时
//
void InitialiseUART(unsigned long baudrate)
{
#define F_CPU 16000000
unsigned int num = F_CPU / baudrate;
unsigned char tmp = UART1_SR;
tmp = UART1_DR;
//
// 复位UART所有寄存器
//
UART1_CR1 = 0;
UART1_CR2 = 0;
UART1_CR4 = 0;
UART1_CR3 = 0;
UART1_CR5 = 0;
UART1_GTR = 0;
UART1_PSCR = 0;
//
// 设置的UART波特率为115200,无奇偶校验,1停止位,8个数据位,此设置依赖系统时钟为16 MHz时
//
UART1_CR1_M = 0; // 8数据位
UART1_CR1_PCEN = 0; // 无奇偶校验
UART1_CR3_STOP = 0; // 1停止位
UART1_BRR2 = (num&0x000F)+(num&0xF000)*10;//0x01; // 设置波特率9600=>115200
UART1_BRR1 = (num&0x0FF0)>>4;//0x1A; // 8M/9600 = 0x341 => 16M/115200 = 0x8B,计算方法参考dataseet
UART1_CR2_TEN = 0; // 禁用发送
UART1_CR2_REN = 0; // 禁用接收
//
// 设置时钟极性,锁定期和最后一位时钟脉冲
//
UART1_CR3_CPOL = 1;
UART1_CR3_CPHA = 1;
UART1_CR3_LBCL = 1;
//
// 打开UART发送,接收和UART时钟。
//
UART1_CR2_TEN = 1;
UART1_CR2_REN = 1;
UART1_CR3_CKEN = 1;
}
//
// 发送字符串
//
void UARTPrintF(char *message)
{
char *ch = message;
while (*ch)
{
UART1_DR = (unsigned char) *ch; // 把下一个字符到数据传输寄存器。
while (UART1_SR_TXE == 0); // 等待发送完成
ch++; // 指向下一个字符
}
}
int main( void )
{
__disable_interrupt();
InitialiseSystemClock();
InitialiseUART(115200);
__enable_interrupt();
while (1)
{
UARTPrintF("Hello world....\n\r");
for (long counter = 0; counter < 250000; counter++);
}
}