搜索
您的当前位置:首页正文

转载stm8初始化[宝典]

来源:榕意旅游网
转载stm8初始化

0000 1. IO口: 寄存器(X=A,B,C,D...)

00000

00000 PX_DDR: 输入输出状态配置 1:输出,0:输入.

PX_CR1: 输出时 1:推挽输出 ,0:开漏输出.输入时 1:上拉输入,0:浮空输入.

0000

PX_CR2: 输出时 1:以10MHz的速度输出,0:以2MHz的速度输出.输入时 1:开启中断功能,0:禁止中断.高电位,写0则输出低电位.为高电位,为0则为低电位.

2.时钟:(CLK)

000000000 PX_ODR: 输出状态寄存器 向其写1 对应的IO口则输出

00000

PX_IDR: 读状态寄存器,读出的结果为1 则对应IO口

00000

STM8S刚上电的时候运行的时钟是内部的高速RC振荡器的8分频(HSI/8)(16MHZ/8=2MHZ),其内部还有一个低速的RC振荡器 (LSI).用户还可以外接一个最大值为24MHZ的外部晶振作为时钟(HSE).可以通过软件编程来改变系统的主时钟.个就可以了)

0000

CLK寄存器(CLK寄存器还有很多,涉及到时钟切换的就这几

0000 CLK_CKDIVR: 低3位保存CPU时钟的分频因子(设低3位的值为x 那么分频因子就是2^x),第3位和第4位是HSI时钟的分频因子;其余位保留.

0000

CLK_SWCR:[0](SWBSY)时钟切换忙判断位(没切换完成为1,切换完成为0),[1](SWEN)时钟切换启动位 1启动切换 0 禁止切换.[2](SWIEN)时钟切换中断选择位 1:开启时钟切换中断,0:不开启.

00000

CLK_SWR: 时钟源选择寄存器,给这个寄存器赋值为 0xe1:主时钟为内部高速振荡器,0xd2:主时钟为内部低速振荡器,0xb4:外部高速振荡器.

00000

0000{ //时钟切换例子 从HSI/8切换为HSE

//CLK_CKDIVR=0;//分频银子设置为0 CLK_SWR=0xb4;//选择时钟源 CLK_SWCR&=~(1<<2);//关闭切换中断 CLK_SWCR|=(1<<1);//启动切换}

00000

0000

000000000000000 while(CLK_SWBSY&(1<<0)==1);//等待切换完成

000003.串口(UART) STM8S可能有很多串口,这里只讲UART1

00000

0000 与串口1配置相关的寄存器:动,0:关闭

CLK_PCKENR1:这个寄存器的第2位是UART1的时钟启动位,1:启

00000 UART1_CR2:[2]:接收使能位(1:使能,0失能),[3]:发送使能位(1:使能,0失能),[5]接收中断使能位(1:使能,0失能),[6]发送完成中断使能位(1:使能,0失能),[7]发送中断使能位(1:使能,0失能).

0000

UART1_CR3:UART1模式选择寄存器[5:4]停止位个数选择 00:1个停止位,01:保留,10:2个停止位,11:1.5个停止位

00000 UART1_CR1:[1] 奇偶校验选择位 1:奇校验,0:偶校验.[2]奇偶校验使能位 1:使能,0失能. [4]字长选择位 1: 1个起始位 9个数据位 1个停止位, 0:一个起始位 8个数据位,UART1_CR3[5:4]个停止位.[5] UART1启动位 0:启动 1:关闭

00000

UART1_BRR2:波特率选择寄存器2,波特率的值=主时钟频率/分频因子.分频因子就是这两个寄存器的值.比如分频因子为0xABCD 那么UART1_BRR2=0xAD,UART1_BRR1=0xBC. UART1_BRR1:波特率选择寄存器1

00000

00000

给这两个寄存器赋值的时候要先给UART1_BRR2 赋值.在给UART1_BRR1赋值,因为给UART1_BRR1赋值完成的时候波特率就已经决定好了,再给UART1_BRR2 赋值就没有意义了.

00000

{ //UART1配置例子(开启收发,开启接受中断 关闭发送中断)

0000 #define BRR 9600//定义波特率(修改波特率只需要修改这个宏的值就可以了)

0000

00000 #define Fosc 16000000 //定义CPU频率 #define BRR1 (((Fosc)/(BRR))>>4) #define BRR2

00000

(((((Fosc)/(BRR))&0xf000)>>8)|(((Fosc)/(BRR))&0x000f))

0000

0000 CLK_PCKENR1|=1<<2;//开启UART1时钟 UART1_CR2&=~(1<<2);//先关闭接收 UART1_CR2&=~(1<<3);//先关闭发送

0000

0000

0000 UART1_BRR2=BRR2;//设置波特率 先给BRR2赋值在给BRR1赋值

00000 UART1_BRR1=BRR1;

00000 UART1_CR1&=~(1<<2);//不使用奇偶校验

UART1_CR1&=~(1<<4);//选择1个起始位 8个数据位

00000 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)

00000000000000

000000000000000

0000

0000

0000

ST的单片机无论是STM32还是STM8S他的定时器的功能非常强大.强大的功能必然伴随着配置更加复杂.我这里先学容易一些的定时器TIM4.

0000

TIM4的寄存器:

00000 TIM4_IER:与中断有关的寄存器 [0] 设置为1时开启更新中断,

设置为0时关闭

0000

TIM4_PSCR:计数器的分频因子 计数器的频率=时钟源频率/TIM4_PSCR[2:0]

00000 TIM4_ CNTR:计数器 从TIM4_CNTR的值计数到255 然后从新从TIM4_ARR处开始计数 TIM4_ARR:无更新事件数器

000000000

TIM4_EGR:事件产生寄存器 [0]设置为1时 有更新事件 为0时

00000

TIM4_CR1:[0] 为1时 开启TIM4的计数器,否则关闭TIM4的计

00000

TIM4_SR: [0]更新事件标准位,中断处理函数里面要将其请0

0000

00000{ //TIM4设置例子

#define PERIOD 100

00000 #define ARR ((0xff)-(PERIOD)) TIM4_IER=0x00;//关闭所有中断 TIM4_CNTR=ARR; TIM4_ARR=ARR;

000000000 TIM4_PSCR=0x04;//计数器频率=16MHZ/2^4;

00000000000000

0000 TIM4_EGR|=(1<<0);//产生更新事件

TIM4_CR1|=(1<<0);//开启TIM4的计数器 TIM4_SR&=~(1<<0);// 清除中断标志}

5.使用TIM3的PWM功能

000000000000000 TIM4_IER|=(1<<0);// 开启更新中断

000000000

00000与PWM(OC1)功能有关的寄存器

00000 TIM3_CCMR1:模式选择[6:4]

00000 TIM3_CCER1:该寄存器的[0]为1时启动PWM 否则关闭

TIM3_CCR1L:比较寄存器低位

0000

TIM3_CCR1H:比较寄存器高位

0000

当TIM3_CNT寄存器的值小于TIM3_CCR1寄存器时OC1输出的电平和TIM3_CNT大于TIM3_CCR1时的电平不一样(至于究竟是什么电平跟模式有关)从而电位出现高低高低的变化,调节 TIM3_CCR1/TIM3_ARR的比值可以调节占空比 TIM3_ARRL=100; TIM3_ARRH=0; TIM3_CCR1L=50;

00000

00000{ //TIM3_PWM演示

000000000000000

00000 TIM3_CCR1H=0; //占空比=50/100=0.5 TIM3_PSCR=4; //16/2^4=1 分频

0000

TIM3_CCMR1|=0x70;//设置为PWM2模式 TIM3_CCER|=0x01;//启动PWM输出 TIM3_CR1|=0x01;//启动计数器}

00 0000000000000000000

0 0 0

因篇幅问题不能全部显示,请点此查看更多更全内容

Top