第一步:配置时钟
上一讲的程序点亮LED灯并没有设置stm8的时钟,但是LED灯依然可以正常闪烁。为使系统快速启动,复位后时钟控制器自动使用HSI的8分频(HSI/8)做为主时钟。因为HSI的稳定时间短,而8分频可保证系统在较差的VDD条件下安全启动。
一旦主时钟源稳定,用户程序可将主时钟切换到另外的时钟源。
果然一个厂家的,和stm32差不多。
stm8主时钟有四种时钟源:
● 1-24MHz高速外部晶体振荡器(HSE)
● 最大24MHz高速外部时钟信号(HSE user-ext)
● 16MHz高速内部RC振荡器(HSI)
● 128KHz低速内部RC(LSI)
各个时钟源可单独打开或关闭,从而优化功耗。
时钟相关寄存器:
内部时钟寄存器CLK_ICKR中的标志位HSIRDY用以指示HSI RC是否稳定。启动时, HSI时钟信号将不会生效直至此标志位被硬件置位。
HSI RC可通过设置内部时钟寄存器CLK_ICKR中的HSIEN位打开或关闭。
void System_Init(void) { CLK_SWR = 0xE1; //选择高速内部时钟HSI为主时钟 可不要这话 CLK_ICKR |= 0x01; //高速内部HSI时钟使能 while(!(CLK_ICKR&0x03)); //等待内部高速HSI就绪 CLK_CKDIVR = 0x18; // Fhsi = Fhsi = Fcpu = Fmaster = 2MHz }
这里是选择HSI 8分频后作为系统主时钟。
第二步:配置GPIO
通用输入/输出口用于芯片和外部进行数据传输。一个IO端口可以包括多达8个引脚,每个引脚可以被独立编程作为数字输入或者数字输出口。另外部分口还可能会有如模拟输入,外部中断,片上外设的输入/输出等复用功能。但是在同一时刻仅有一个复用功能可以映射到引脚上。复用功能的映射是通过选项字节控制的。请参考数据手册关于选项字节的描述。每个端口都分配有一个输出数据寄存器,一个输入引脚寄存器,一个数据方向寄存器,一个选择寄存器,和一个配置寄存器。一个I/O口工作在输入还是输出是取决于该口的数据方向寄存器。
每一个端口都有一个输出数据寄存器 (ODR),一个引脚输入寄存器 (IDR)和一个数据方向寄存器(DDR) 总是同相关的。控制寄存器1(CR1)和控制寄存器2(CR2)用于对输入/输出进行配置。
任何一个I/O引脚可以通过对DDR,ODR,CR1 和CR2寄存器的相应位进行编程来配置。
寄存器中的位n对应于口的引脚 n 。
设置PE5为推挽输出,最大速度10MHZ。
void Gpio_Init(void) { PE_DDR |= 0x20; //PE5设置为输出 PE_CR1 |= 0x20; //PE5设置为推挽输出 PE_CR2 |= 0x20; //最大输出速度10MHz }
至此关于stm8的时钟和LED连接的GPIO口配置完毕,就可以开始写主函数了。
int main( void ) { int i,j; System_Init(); //初始化系统时钟 Gpio_Init(); //PE5的GPIO口初始化 while (1) { PE_ODR ^= 0x20; //PE5取反 for(i=0;i<100;i++) //延时 for(j=0;j<1000;j++); } }
最后编译--下载仿真,按下键盘F5健,LED灯开始闪烁了,那么成功点亮第一个LED 。