1. IO口: 寄存器(X=A,B,C,D...) PX_DDR: 输入输出状态配置 1:输出,0:输入. PX_CR1: 输出时 1:推挽输出 ,0:开漏输出.输入时 1:上拉输入,0:浮空输入. PX_CR2: 输出时 1:以10MHz的速度输出,0:以2MHz的速度输出.输入时 1:开启中断功能,0:禁止中断. PX_ODR: 输出状态寄存器 向其写1 对应的IO口则输出高电位,写0则输出低电位. PX_IDR: 读状态寄存器,读出的结果为1 则对应IO口为高电位,为0则为低电位.
2.时钟:(CLK) STM8S刚上电的时候运行的时钟是内部的高速RC振荡器的8分频(HSI/8)(16MHZ/8=2MHZ),其内部还有一个低速的RC振荡器 (LSI).用户还可以外接一个最大值为24MHZ的外部晶振作为时钟(HSE).可以通过软件编程来改变系统的主时钟. CLK寄存器(CLK寄存器还有很多,涉及到时钟切换的就这几个就可以了) CLK_CKDIVR: 低3位保存CPU时钟的分频因子(设低3位的值为x 那么分频因子就是2^x),第3位和第4位是HSI时钟的分频因子;其余位保留. CLK_SWCR:[0](SWBSY)时钟切换忙判断位(没切换完成为1,切换完成为0),[1](SWEN)时钟切换启动位 1启动切换 0 禁止切换.[2](SWIEN)时钟切换中断选择位 1:开启时钟切换中断,0:不开启. CLK_SWR: 时钟源选择寄存器,给这个寄存器赋值为 0xe1:主时钟为内部高速振荡器,0xd2:主时钟为内部低速振荡器,0xb4:外部高速振荡器. { //时钟切换例子 从HSI/8切换为HSE //CLK_CKDIVR=0;//分频银子设置为0 CLK_SWR=0xb4;//选择时钟源 CLK_SWCR&=~(1<<2);//关闭切换中断 CLK_SWCR|=(1<<1);//启动切换 while(CLK_SWBSY&(1<<0)==1);//等待切换完成 }
3.串口(UART) STM8S可能有很多串口,这里只讲UART1 与串口1配置相关的寄存器: CLK_PCKENR1:这个寄存器的第2位是UART1的时钟启动位,1:启动,0:关闭 UART1_CR2:[2]:接收使能位(1:使能,0失能),[3]:发送使能位(1:使能,0失能),[5]接收中断使能位(1:使能,0失能),[6]发送完成中断使能位(1:使能,0失能),[7]发送中断使能位(1:使能,0失能). UART1_CR3:UART1模式选择寄存器[5:4]停止位个数选择 00:1个停止位,01:保留,10:2个停止位,11:1.5个停止位 UART1_CR1:[1]
奇偶校验选择位 1:奇校验,0:偶校验.[2]奇偶校验使能位 1:使能,0失能. [4]字长选择位 1: 1个起始位 9个数据位 1个停止位,
0:一个起始位 8个数据位,UART1_CR3[5:4]个停止位.[5] UART1启动位 0:启动 1:关闭 UART1_BRR2:波特率选择寄存器2,波特率的值=主时钟频率/分频因子.分频因子就是这两个寄存器的值.比如分频因子为0xABCD 那么UART1_BRR2=0xAD,UART1_BRR1=0xBC. UART1_BRR1:波特率选择寄存器1 给这两个寄存器赋值的时候要先给UART1_BRR2 赋值.在给UART1_BRR1赋值,因为给UART1_BRR1赋值完成的时候波特率就已经决定好了,再给UART1_BRR2 赋值就没有意义了. { //UART1配置例子(开启收发,开启接受中断 关闭发送中断) #define BRR 9600//定义波特率(修改波特率只需要修改这个宏的值就可以了) #define Fosc 16000000 //定义CPU频率 #define BRR1 (((Fosc)/(BRR))>>4) #define BRR2 (((((Fosc)/(BRR))&0xf000)>>8)|(((Fosc)/(BRR))&0x000f)) CLK_PCKENR1|=1<<2;//开启UART1时钟 UART1_CR2&=~(1<<2);//先关闭接收 UART1_CR2&=~(1<<3);//先关闭发送 UART1_BRR2=BRR2;//设置波特率 先给BRR2赋值在给BRR1赋值 UART1_BRR1=BRR1; UART1_CR1&=~(1<<2);//不使用奇偶校验 UART1_CR1&=~(1<<4);//选择1个起始位 8个数据位 UART1_CR3&=~(1<<4);//选择1个停止位 UART1_CR3&=~(1<<5);//选择1个停止位 UART1_CR2&=~(1<<6);//不使用发送中断 UART1_CR2|=(1<<5);//使用接收中断 UART1_CR1&=~(1<<5);//启动UART1 UART1_CR2|=(1<<2);//启动接收 UART1_CR2|=(1<<3);//启动发送 }
4:定时器(TIM4) ST的单片机无论是STM32还是STM8S他的定时器的功能非常强大.强大的功能必然伴随着配置更加复杂.我这里先学容易一些的定时器TIM4. TIM4的寄存器: TIM4_IER:与中断有关的寄存器 [0] 设置为1时开启更新中断,设置为0时关闭 TIM4_PSCR:计数器的分频因子 计数器的频率=时钟源频率/TIM4_PSCR[2:0] TIM4_ CNTR:计数器 从TIM4_CNTR的值计数到255 然后从新从TIM4_ARR处开始计数 TIM4_ARR: TIM4_EGR:事件产生寄存器 [0]设置为1时 有更新事件 为0时无更新事件 TIM4_CR1:[0] 为1时 开启TIM4的计数器,否则关闭TIM4的计数器 TIM4_SR: [0]更新事件标准位,中断处理函数里面要将其请0 { //TIM4设置例子 #define PERIOD 100 #define ARR ((0xff)-(PERIOD)) TIM4_IER=0x00;//关闭所有中断 TIM4_PSCR=0x04;//计数器频率=16MHZ/2^4; TIM4_CNTR=ARR; TIM4_ARR=ARR; TIM4_EGR|=(1<<0);//产生更新事件 TIM4_CR1|=(1<<0);//开启TIM4的计数器 TIM4_SR&=~(1<<0);// 清除中断标志 TIM4_IER|=(1<<0);// 开启更新中断 }
5.使用TIM3的PWM功能 与PWM(OC1)功能有关的寄存器 TIM3_CCMR1:模式选择[6:4] TIM3_CCER1:该寄存器的[0]为1时启动PWM 否则关闭 TIM3_CCR1L:比较寄存器低位 TIM3_CCR1H:比较寄存器高位 当TIM3_CNT寄存器的值小于TIM3_CCR1寄存器时OC1输出的电平和TIM3_CNT大于TIM3_CCR1时的电平不一样(至于究竟是什么电平跟模式有关)从而电位出现高低高低的变化,调节 TIM3_CCR1/TIM3_ARR的比值可以调节占空比 { //TIM3_PWM演示 TIM3_ARRL=100; TIM3_ARRH=0; TIM3_CCR1L=50; TIM3_CCR1H=0; //占空比=50/100=0.5 TIM3_PSCR=4; //16/2^4=1 分频 TIM3_CCMR1|=0x70;//设置为PWM2模式 TIM3_CCER|=0x01;//启动PWM输出 TIM3_CR1|=0x01;//启动计数器 } |