找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9569|回复: 0
打印 上一主题 下一主题
收起左侧

STM8S资源配置(寄存器版本)(STVD+COSMIC编译环境)

[复制链接]
跳转到指定楼层
楼主
ID:75926 发表于 2015-4-10 17:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
 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;//启动计数器
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表