硬件平台: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++); } }